当前位置:文档之家› 用matlab编写的俄罗斯方块小游戏

用matlab编写的俄罗斯方块小游戏

用matlab编写的俄罗斯方块小游戏fun ctio n RussiaBlock( varargin )if nargin == 0OldHandle = findobj( 'Type', 'figure', 'Tag', 'RussiaBlock');if ishandle( OldHandle )delete( OldHa ndle );endFigureHandle = figure( 'Name',' 俄罗斯方块MATLAB 版','Tag', 'RussiaBlock', 'NumberTitle', 'off,...'Menubar', 'none', 'DoubleBuffer', 'on', 'Resize', 'off, 'visible', 'on',...'KeyPressFcn', 'RussiaBlock( "KeyPress_Callback", gcbo )',...'HelpFcn', 'helpdlg(''帮不了你--!","不好意思'')',...'CloseRequestFcn', 'RussiaBlock( ''CloseFigure_Callback'', gcbo )');gen erate_FigureC ontent( FigureHa ndle );ini t_FigureC ontent( FigureHa ndle );set( FigureHandle, 'Visible', 'on');elseif ischar( varargi n{1})feval( vararg in {:});end% ------------------------------------------------------------------------fun ctio n gen erate_FigureC ontent( FigureHa ndle )TabSpace = 30 ;BlockWidth = 20 ;BlockHeight = 20 ;FigureWidth = BlockWidth * (12 + 1) + TabSpace * 7;FigureHeight = 500 ;set( FigureHa ndle, 'Positio n', [0 0 FigureWidth FigureHeight]);movegui( FigureHa ndle, 'cen ter');%创建菜单BeginMenu = uimenu( FigureHandle, 'Label',' 开始');StartMenu = uimenu( BeginMenu, 'Label',' 开始新游戏','Accelerator', 'N',...'Callback','RussiaBlock( "StartNewGame_Callback", gcbo )');SaveMe nu = uime nu( Beg inMenu, 'Label', 'Separator', 'on', 'Cal','RussiaBlock( "SaveGame_Callback", gcbo )'); LoadMe nu = uime nu( Begi nMenu, 'Label','Cal', 'RussiaBlock( ''LoadGame_Callback'',gcbo )');QuitMenu = uimenu( BeginMenu, 'Label', 'close(gcf)');Operati onMenu = uime nu( FigureHa ndle, 'Label',' BoardConfigMenu = uimenu( OperationMenu, 'label',' 'Cal', 'RussiaBlock( ''BoardConfig_Callback'', gcbo )');FigureConfigMenu = uimenu( OperationMenu, 'label',''Cal', 'RussiaBlock( ''FigureCo nfig_Callback", gcbo )'); HighScoreMe nu = uime nu( Operati onMenu, 'label',''Cal', 'RussiaBlock( ''HighScore_Callback'',gcbo )', 'Enable', 'off ); GameLevelMe nu = uimenu( Operati onMenu, 'Label',' 'Cal','RussiaBlock( ''GameLevel_Callback'',gcbo )'); HelpMe nu = uime nu( FigureHa ndle, 'Label', AboutMenu = uimenu( HelpMenu, 'Label','MATLAB 版'',''关于此软件 ............ '')'); HelpDlgMenu = uimenu( HelpMenu, 'Label',不了你--!'',''不好意思”)');%创建工具条,图标可以用imread 从图片读取,但图片不要太大BeginTool = uipushtool( 'ToolTipString',' 开始','CData', rand(16,16,3), 'Tag', 'BeginTool',... 'ClickedCallback', 'RussiaBlock( ''StartNewGame_Callback'', gcbo )');PauseTool = uitoggletool( 'ToolTipString',' 暂停','Tag', 'PauseTool', 'Tag', 'PauseTool',... 'CData', reshape( repmat( [1 1 0], 16, 16), [16,16,3] ),...'ClickedCallback', 'RussiaBlock( ''PauseGame_Callback'', gcbo )');%创建游戏窗口Mai nWin dowXPos = TabSpace;Mai nWin dowYPos = TabSpace;Mai nWin dowWidth = BlockWidth * 12 ;Mai nWin dowHeight = BlockHeight * 22 ;Mai nWin dowPositio n = [Mai nWin dowXPos Mai nWin dowYPos Mai nWin dowWidthMai nWin dowHeight];%定义游戏窗口的右键菜单AxesContextMenu = uicontextmenu( 'Tag', 'uicontextmenu');保存','Accelerator', 'S', 'Enable', 'off,...读取','Accelerator', 'L', 'Enable', 'off,...退出','Accelerator', Q, 'Separator', 'on: 'Cal', 功能');键盘设置','Enable', 'off,...界面设置','Enable', 'off,...最高记录','Separator', 'on',...游戏难度',...帮助');关于此软件','Cal', 'helpdlg(''俄罗斯方块游戏帮助','Separator', 'on', 'Cal', 'helpdig (” 帮uimenu( AxesContextMenu, 'Label',' 设置窗口颜色','Cal','RussiaBlock( ''Wi ndowColor_Callback", gcbo )')uimenu( AxesContextMenu, 'Label',' 设置背景图片','Cal','RussiaBlock( ''Wi ndowPicture_Callback", gcbo )') uimenu( AxesContextMenu, 'Label',' 设置方块颜色','Cal','RussiaBlock( ''BlockColor_Callback'', gcbo )')uimenu( AxesContextMenu, 'Label',' 恢复默认','Cal', 'RussiaBlock( ''Default_Callback'', gcbo )') MainAxes = axes( 'Uniits', 'pixels', 'Pos', MainWindowPosition, 'XTick', [], 'YTick'』, 'XTickLabel', [],... 'YTickLabel', [], 'Box', 'on', 'Tag', 'MainAxes', 'UicontextMenu', AxesContextMenu,...'XLim', [0 MainWindowWidth], 'YLim', [0 MainWindowHeight]);hold on;%创建一个窗口用于显示下一个方块的图形NextBlockWndXPos = Mai nWin dowXPos + Mai nWin dowWidth + TabSpace ; NextBlockWndHeight = 4 * TabSpace + BlockHeight ;NextBlockWndYPos = Mai nWin dowYPos + Mai nWin dowHeight - NextBlockWndHeight ; NextBlockWndWidth = TabSpace * 4 + BlockWidth ;NextBlockWndPosition = [NextBlockWndXPos NextBlockWndYPos NextBlockWndWidth NextBlockWndHeight];NextBlockAxes = axes( 'Units', 'pixels', 'Pos', NextBlockWndPosition, 'XTick', [], 'YTick',[],...'XTickLabel', [], 'YTickLabel', [], 'XLim', [0 NextBlockWndWidth],...'YLim', [0 NextBlockWndHeight], ...'Box', 'on', 'Tag', 'NextBlockAxes', 'Color', [0.85 0.85 0.85]);%创建一组控件,包括(两个文本框用于显示当前方块数和成绩,两个按钮用于暂停和退出)Butt on Tag = { 'QuitButto n', 'PauseButto n', 'BlockNumText', 'ScoreText' };Butt on Style = { 'pushbutto n', 'togglebutto n', 'text', 'text' };Fon tColor = { [0 0 0], [1 0 0], [0 0 1], [1 0 1] };Butt on Color = { [0.7 0.8 0.9], [0.3 1 0.3], [0.5 1 1], [0.5 1 1] };ButtonString = {'退出','暂停','方块数','积分'};Butto nCallback = { 'close(gcf)', 'RussiaBlock( ''Butto nPauseGame_Callback", gcbo )', '', '' };Butt onNu mber = len gth( Butt on Tag );Butto nWidth = NextBlockWndWidth ;Butto nH eight = 50 ;Butto nXPos = NextBlockWndXPos ;Butto nYPos = Mai nWin dowYPos + TabSpace ;Butto nPositi on = [Butto nXPos Butt on YPos Butto nWidth Butto nH eight];Butto nTabSpace = (NextBlockWndYPos - 2 * TabSpace - Butto nH eight * Butto nNu mber) / Butt onNu mber ;for num = 1: Butt onNu mberTempButt on Positi on = Butt on Positi on ;TempButto nPositio n(2) = Butto nPositio n(2) + (num - 1) * (Butto nTabSpace +Butto nH eight);if findstr( ButtonStyle{num}, 'button')TempButto nPositio n(1) = TempButto nPositi on (1) + 10 ;TempButto nPositio n(2) = TempButto nPositio n(2) + 5 ;TempButtonPosition(3) = TempButtonPosition(3) - 10 * 2 ;TempButto nPositio n(4) = TempButto nPositio n(4) - 5 * 2 ;elseTempButtonPosition(1) = TempButtonPosition(1) - 10 ;TempButto nPositio n(2) = TempButto nPositio n(2) - 5 ;TempButto nPositio n(3) = TempButto nPositio n(3) + 10 * 2;TempButto nPositio n(4) = TempButto nPositio n(4) + 5 * 2 ;endButto nHan dle = uico ntrol( 'Tag', Butto nTag{ nu m}, 'Style', Butt on Style{ num}, 'Pos', TempButt on Positi on,…'Foregro un dcolor', Fon tCol or{nu m}, 'Backgro un dcolor', Butt on Col or{nu m},...'Fo ntsize', 16, 'Stri ng', Butto nStri ng{ nu m}, 'Cal', Butt on Callback{ num});if findstr( ButtonStyle{num}, 'text')set( Butt onHan dle, 'Max', 2 );endif fin dstr( Butto nTag{ num}, 'PauseButto n')set( ButtonHandle, 'Enable', 'inactive', 'ButtonDownFcn', ButtonCallback{num}, 'Cal',''); endendMainBlockAxes = axes( 'Units', 'pixels', 'Pos', MainWindowPosition, 'XTick', [], 'YTick'』,'XTickLabel', [],...'YTickLabel', [], 'Box', 'on', 'Tag', 'MainBlockAxes', 'Hittest', 'off,...'XLim', [0 MainWindowWidth], 'YLim', [0 MainWindowHeight], 'Color', 'none');line( 'Visible', 'on', 'Tag', 'BlockHandle', 'Markersize', 18, 'Parent', MainBlockAxes, 'HitTest', 'off,...'Marker', 's', 'MarkerEdgeColor', 'k', 'XData', nan, 'YData', nan, 'LineStyle', 'none');line( 'Visible', 'off, 'Tag', 'TempBlock', 'Markersize', 18, 'Parent', MainBlockAxes, 'HitTest', 'off,...'Marker', 's', 'MarkerEdgeColor', 'k', 'XData', 130, 'YData', 30, 'LineStyle', 'none');line( 'Visible', 'off, 'Tag', 'NextBlock', 'Markersize', 18, 'Parent', NextBlockAxes, 'HitTest', 'off,...'Marker', 's', 'MarkerEdgeColor', 'k', 'XData', 30, 'YData', 30, 'LineStyle', 'none');setappdata( FigureHa ndle, 'XLim', [0 Mai nWin dowWidth]) setappdata( FigureHa ndle, 'YLim', [0 Mai nWin dowHeight]) han dles = guiha ndles( FigureHa ndle );guidata( FigureHa ndle, han dles );% ------------------------------------------------fun ctio n in it_FigureC on te nt( FigureHa ndle )han dles = guidata( FigureHa ndle );Colorl nfo =[];tryColorl nfo = load('ColorI nfo.mat');catchendif isempty( Colorl nfo )Colorl nfo.BlockColor = GetDefaultBlockColor ;Colorl nfo.Mai nAxesColor = GetDefaultMai nAxesColor ;ColorI nfo.Ma in AxesImage .Im ageData =[];endset( han dles.Mai nAxes, 'Color', ColorI nfo.Mai nAxesColor );if ~isempty( ColorI nfo.Ma in AxesImage .Im ageData )ImageHa ndle = image( ColorI nfo.Ma in AxesImage .Im ageData, 'Pare nt', han dles.Ma in Axes ); set( ImageHa ndle, ColorI nfo.Ma in AxesImage.Property );setappdata( FigureHa ndle, 'ImageData', ColorI nfo.Ma in AxesImage .Im ageData ); endset( han dles.BlockHa ndle, 'MarkerFaceColor', ColorI nfo.BlockColor );set( ha ndles.TempBlock, 'MarkerFaceColor', ColorI nfo.BlockColor );set( ha ndles.NextBlock, 'MarkerFaceColor', ColorI nfo.BlockColor ); setappdata( FigureHandle,'BlockColor', ColorInfo.BlockColor );% -----------------------------------------------------------fun ctio n StartNewGame_Callback( h, StartType )han dles = guidata( h );global PauseTimeif nargin == 1StartType = 'NewStart';setappdata( han dles.RussiaBlock, 'BlockNumber', 0 );set( handles.BlockNumText, 'String', {' 方块数','0'});setappdata( han dles.RussiaBlock, 'Curre ntScore', 0 );set( handles.ScoreText, 'String', {' 积分','0'});set( handles.BlockHandle, 'XData', nan, 'YData', nan );set( handles.TempBlock, 'XData', nan, 'YData', nan );TextHandle = findobj( 'Parent', handles.MainBlockAxes, 'Type', 'text');delete( TextHandle );elseendset( ha ndles.NextBlock, 'Visible', 'on');set( han dles.TempBlock, 'Visible', 'on');set( handles.PauseTool, 'State', 'off );set( han dles.PauseButt on, 'Value', 0 );YLim = get( handles.MainAxes, 'YLim');while( isha ndle( h ))TotalYData = get( handles.BlockHandle, 'YData');if any( TotalYData >= YLim(2))% Game overtext( 20, 200, 'GameOver', 'Parent', handles.MainBlockAxes,...'Fo ntSize', 30, 'Color', 'r', 'Fo ntAn gle', 'italic');break;endif len gth( TotalYData ) >= 4TotalXData = get( handles.BlockHandle, 'XData');LastBlockYData = TotalYData( end - 3: end );LastBlockYData = uni que( LastBlockYData );CompleteL ine =[];Usefull ndex =[];for num = 1: len gth( LastBlockYData )[YData, I ndex] = find( TotalYData == LastBlockYData (n um));if len gth( YData ) == 12CompleteL ine = [CompleteL ine, LastBlockYData (nu m)];Usefull ndex = [Usefull ndex, In dex];endendif ~isempty( CompleteL ine )TotalXData( Usefull ndex)=[];TotalYData( Usefull ndex)=[];Lin eNumber = len gth( CompleteL ine );ScoreArray = [100 300 600 1000];NewScore = ScoreArray(L in eNumber);Curren tScore = getappdata( han dles.RussiaBlock, 'Curre ntScore'); TextString = get( handles.ScoreText, 'String');TextStri ng{2} = Curre ntScore + NewScore ;set( handles.ScoreText, 'String', TextString );setappdata( han dles.RussiaBlock, 'Curre ntScore', Curren tScore + NewScore );UpdateGameLevel( han dles.RussiaBlock, Curren tScore + NewScore );%处理需要下移的方块for num = Lin eNumber : -1 : 1[YData, Index] = find( TotalYData > LastBlockYData(num));TotalYData(I ndex) = TotalYData(I ndex) - 20 ;endendset( ha ndles.BlockHa ndle, 'XData', TotalXData, 'YData', TotalYData );endBlockNumber = getappdata( han dles.RussiaBlock, 'BlockNumber');TextStri ng = get( ha ndles.BlockNumText, 'Stri ng');TextStri ng{2} = BlockNumber + 1 ;set( ha ndles.BlockNumText, 'Stri ng', TextStri ng );setappdata( handles.RussiaBlock, 'BlockNumber', BlockNumber + 1 ); GameLevel = getappdata( han dles.RussiaBlock, 'GameLevel');if isempty( GameLevel )PauseTime = 0.3 ;elsePauseTime = ceil( 20 / GameLevel ) / 100 ;endTempBlockPos. LeftStep = 0 ;TempBlockPos.Dow nStep = 0 ;setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );Status = 1;[BlockXArray,BlockYArray] = Com_GetBlock( h );set( ha ndles.TempBlock, 'XData', BlockXArray, 'YData', BlockYArray ); while( Status & ishandle( h ))if(PauseTime) ~= 0pause( PauseTime )endStatus = test_MoveBlock( h, 'Dow n');endend% ------------------------------------------------------------------------fun ctio n KeyPress_Callback( h )han dles = guidata( h );PauseState = get( han dles.PauseTool, 'State');if strcmp( PauseState, 'on')returnendBoardC onfig = getappdata( han dles.RussiaBlock, 'BoardC on fig');if isempty( BoardConfig )Left = 'leftarrow';Right = 'rightarrow';Down = 'dow narrow';Change = 'uparrow';Drop = 'space';elseLeft = BoardCo nfig.Left ;Right = BoardConfig.Right;Dow n = BoardC on fig.Dow n ;Change = BoardC on fig.Cha nge ;Drop = BoardC on fig.Drop ;endCurren tKey = get( han dles.RussiaBlock, 'Curre ntKey');switch Curre ntKeycase Lefttest_MoveBlock( h, 'Left');case Righttest_MoveBlock( h, 'Right');case Downtest_MoveBlock( h, 'Dow n');case Changetest_MoveBlock( h, 'Cha nge');case Droptest_MoveBlock( h, 'Drop');otherwisereturn ;end% ------------------------------------------------------------------------fun ctio n Win dowColor_Callback( h )han dles = guidata( h );CurrentColor = get( handles.MainAxes, 'Color');NewColor = uisetcolor( CurrentColor,' 请选择窗口颜色');if len gth( NewColor ) == 0return;elseset( han dles.Mai nAxes, 'Color', NewColor );end% -------------------------------------------------------fun ctio n Win dowPicture_Callback( h ) han dles = guidata( h ); [PictureFile, Path] = uigetfile( {'*.jpg; *.bmp'},' if isnumeric( PictureFile )return ;请选择图片’);else% if len gth( PictureFile ) > 31% errordlg('文件名过长,读取失败’);% endtryPicture = imread( [Path, PictureFile]);for num = 1: size( Picture, 3 )ValidPicture(:, :, num) = flipud( Picture(:,:,num));endAxesXLim = get( handles.MainAxes, 'XLim');AxesYLim = get( handles.MainAxes, 'YLim');BlockHandle = findobj( handles.MainAxes, 'Style', 'line'); cla( BlockHandle );ImageXLimit = size(Picture, 2);ImageYLimit = size(Picture, 1);if diff( AxesXLim ) < size(Picture, 2) | diff( AxesYLim ) < size(Picture, 1) %超出坐标轴范围,压缩显示XScale = diff( AxesXLim ) / size(Picture, 2);YScale = diff( AxesYLim ) / size(Picture, 1);%取较小比例压缩Scale = min( XScale, YScale );ImageXLimit = size(Picture, 2) * Scale ;ImageYLimit = size(Picture, 1) * Scale ; end lmageXData(1) = AxesXLim(1) + (diff( AxesXLim ) - ImageXLimit) / 2 + 1; lmageXData(2) = ImageXData(1) + ImageXLimit - 1;ImageYData(1) = AxesYLim(1) + (diff( AxesYLim ) - ImageYLimit) / 2 + 1;ImageYData(2) = ImageYData(1) + ImageYLimit - 1;image( ValidPicture, 'Parent', handles.MainAxes, 'Hittest', 'off, ...'XData',ImageXData,'YData',ImageYData, 'Tag', 'MainImage'); setappdata( han dles.RussiaBlock, 'ImageData', ValidPicture ); catchErrorStri ng = spri ntf([' 读取图片失败,错误信息为:\n ',lasterr]);errordlg( ErrorStri ng );endend% ------------------------------------------------------------------------fun ctio n BlockColor_Callback( h )han dles = guidata( h );Curren tColor = getappdata( han dles.RussiaBlock, 'BlockColor'); if isempty( Curren tColor )Curre ntColor = GetDefaultBlockColor ;setappdata( han dles.RussiaBlock, 'BlockColor', Curren tColor ); endNewColor = uisetcolor( CurrentColor,' 请选择方块颜色');if len gth( NewColor ) == 0return;elsesetappdata( han dles.RussiaBlock, 'BlockColor', NewColor ); set( ha ndles.BlockHa ndle,'MarkerFaceColor', NewColor );set( han dles.TempBlock, 'MarkerFaceColor', NewColor );set( ha ndles.NextBlock, 'MarkerFaceColor', NewColor );end% ------------------------------------------------------------------------fun ctio n Default_Callback( h )han dles = guidata( h );BlockColor = GetDefaultBlockColor ;AxesColor = GetDefaultMai nAxesColor ;set( handles.MainAxes, 'Color', AxesColor );set( handles.BlockHandle, 'MarkerFaceColor', BlockColor );set( ha ndles.TempBlock, 'MarkerFaceColor', BlockColor );set( han dles.NextBlock, 'MarkerFaceColor', BlockColor );% ------------------------------------------------------------------------fun ctio n PauseGame_Callback( h )han dles = guidata( h );ToolStart = get( ha ndles .P auseTool, 'State');if strcmp( ToolStart, 'on')set( handles.PauseButton, 'Value', 1 );waitfor( ha ndles.PauseTool, 'State', 'off );elseset( ha ndles .P auseButt on, 'Value', 0 );end% ------------------------------------------------------------------------fun ctio n Butt on PauseGame_Callback( h )han dles = guidata( h );ToggleButto nValue = get( h, 'Value');if ToggleButt onV alue == 0set( h, 'Value', 1 );set( h, 'String','继续');set( handles.PauseTool, 'State', 'on');waitfor( ha ndles.PauseTool, 'State', 'off );elseset( h, 'Value', 0 );set( h, 'String','暂停');set( handles.PauseTool, 'State', 'off );set( han dles.RussiaBlock, 'Curre ntObject', han dles.Ma in Axes ); end% ------------------------------------------------------------------------fun ctio n CloseFigure_Callback( h )han dies = guidata( h );BlockColor = getappdata( han dles.RussiaBlock, 'BlockColor');MainAxesColor = get( handles.MainAxes, 'Color');Main AxesImageHa ndle = fin dobj( han dles.Ma in Axes, 'Type', 'image');if ~isempty( Main AxesImageHa ndle )Main AxesImage.Property.Tag = get( Main AxesImageHa ndle, 'Tag');Mai nAxesImage.Property.Hittest = get( Main AxesImageHa ndle, 'Hittest');Mai nAxesImage.Property.XData = get( Mai nAxesImageHa ndle, 'XData');Mai nAxesImage.Property.YData = get( Mai nAxesImageHa ndle, 'YData');Main AxesImage .Im ageData = getappdata( han dles.RussiaBlock, 'ImageData'); else Main AxesImage .Im ageData =[]; end save ColorI nfo.mat BlockColor Main AxesColor Main AxesImage delete( han dles.RussiaBlock );% ------------------------------------------------------------------------fun ctio n Color = GetDefaultBlockColorColor = [0 0 1];% ------------------------------------------------------------------------fun ctio n Color = GetDefaultMai nAxesColorColor = [1 1 1];% ---------------------------------------------------------------fun ctio n [ BlockXArray, BlockYArray] = Com_GetBlock( varargin ) global Block In dex ; BlockXArray =[];BlockYArray =[];han dles = guidata( vararg in {1});if nargin == 1BlockArray = getappdata( han dles.RussiaBlock, 'BlockArray');BlockIndex = ceil( rand(1) * 24 );else % nargin == 2Block In dex = vararg in {2};end switch(BlockI ndex)case {1,2,3,4} % 方块BlockXArray = [0;0;1;1] * 20 -10 ;BlockYArray = [0;1;1;0] * 20 -10 ; case {5,6} % 竖长条BlockXArray = [0;0;0;0] * 20 - 10 ;BlockYArray =卜1;0;1;2] * 20 - 10 ; case {7,8} % 横长条BlockXArray =卜1;0;1;2] * 20 - 10 ;BlockYArray = [1;1;1;1] * 20 - 10 ; case {9} % 4 类T T1BlockXArray =卜1;0;1;0] * 20 - 10 ;BlockYArray = [1;1;1;0] * 20 - 10 ; case {10} % T2BlockXArray = [0;0;1;0] * 20 - 10 ;BlockYArray = [2;1;1;0] * 20 - 10 ; case {11} % T3BlockXArray = [0;0;1;-1] * 20 - 10 ;BlockYArray = [2;1;1;1] * 20 - 10 ; case {12} % T4BlockXArray = [0;0;0;-1] * 20 - 10 ;BlockYArray = [2;1;0;1] * 20 - 10 ; case {13} % 8 类L L1BlockXArray = [0;0;0;1] * 20 - 10 ;BlockYArray = [1;0;-1;-1] * 20 - 10 ; case {14} % L2BlockXArray = [-1;0;1;1] * 20 - 10 ;BlockYArray = [0;0;0;1] * 20 - 10 ; case {15} % L3BlockXArray = [-1;0;0;0] * 20 - 10 ;BlockYArray = [1;1;0;-1] * 20 - 10 ; case {16} % L4BlockXArray = [-1;-1;0;1] * 20 - 10 ;BlockYArray = [-1;0;0;0] * 20 - 10 ; case {17} % L5BlockXArray = [-1;0;0;0] * 20 - 10 ;BlockYArray = [-1;-1;0;1] * 20 - 10 ; case {18} % L6BlockXArray = [-1;-1;0;1] * 20 - 10 ;BlockYArray = [1;0;0;0] * 20 - 10 ; case {19} % L7BlockXArray = [0;0;0;1] * 20 - 10 ;BlockYArray = [-1;0;1;1] * 20 - 10 ; case {20} % L8BlockXArray = [-1;0;1;1] * 20 - 10 ;BlockYArray = [0;0;0;-1] * 20 - 10 ; case {21 22} % 4 类Z Z1BlockXArray = [-1;0;0;1] * 20 - 10 ;BlockYArray = [1;1;0;0] * 20 - 10 ; case {23 24} % Z2BlockXArray = [0;0;1;1] * 20 -10 ;BlockYArray = [-1;0;0;1] * 20 - 10 ; case {25 26} % Z3BlockXArray = [-1;0;0;1] * 20 - 10 ;BlockYArray = [0;0;1;1] * 20 - 10 ; case {27 28} % Z4BlockXArray = [0;0;1;1] * 20 - 10 ;BlockYArray = [1;0;0;-1] * 20 - 10 ;end if nargin == 1NewBlockArray.BlockXArray = BlockXArray ;NewBlockArray.BlockYArray = BlockYArray ;NewBlockArray.Blockl ndex = BlockI ndex ;NextAxesXLim = get( han dles.NextBlockAxes, 'XLim');NextAxesYLim = get( han dles.NextBlockAxes, 'YLim');set( han dles.NextBlock, 'XData', [BlockXArray + 0.5 * diff( NextAxesXLim )-ceil( sum( BlockXArray )/4 )],...'YData', [BlockYArray + 0.5 * diff( NextAxesYLim )] - ceil( sum( BlockYArray ) / 4 )); setappdata( han dles.RussiaBlock, 'BlockArray', NewBlockArray );if isempty( BlockArray )Com_GetBlock( varargin{1});elseBlockXArray = BlockArray.BlockXArray ; BlockYArray = BlockArray.BlockYArray ; BlockI ndex = BlockArray.Blockl ndex ; endendAxesXLim = getappdata( han dles.RussiaBlock, 'XLim'); AxesYLim = getappdata( handles.RussiaBlock, 'YLim'); BlockXArray = BlockXArray + 0.5 * diff( AxesXLim ); BlockYArray = BlockYArray + diff( AxesYLim );% ------------------------------------------------ fun ctio n Status = test_MoveBlock( h, MoveMode )Status = 1;if ~isha ndle( h ) returnend han dles = guidata( h );TempXData = get( han dles.TempBlock, 'XData');TempYData = get( ha ndles.TempBlock, 'YData');TempXData = TempXData';TempYData = TempYData';TotaIXData = get( handles.BlockHandle, 'XData');TotalYData = get( handles.BlockHandle, 'YData');TotaIXData = TotalXData';TotalYData = TotalYData';TempBlockPos = getappdata( han dles.RussiaBlock, 'TempBlockPos');if isempty( TempBlockPos )returnendAxesXLim = getappdata( han dles.RussiaBlock, 'XLim');AxesYLim = getappdata( han dles.RussiaBlock, 'YLim');switch MoveModecase 'Left'if any( TempXData - 20 < AxesXLim(l))returnendTestArray = ismember( [TempXData - 20, TempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )return;elseset( han dles.TempBlock, 'XData', TempXData - 20 );TempBlockPos. LeftStep = TempBlockPos .L eftStep + 1 ;setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );endcase 'Right'if any( TempXData + 20 > AxesXLim(2))returnendTestArray = ismember( [TempXData + 20, TempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )return;elseset( han dles.TempBlock, 'XData', TempXData + 20 );TempBlockPos. LeftStep = TempBlockPos .L eftStep - 1 ;setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );endcase 'Dow n'if any( TempYData - 20 < AxesYLim(1))set( handles.BlockHandle, 'XData', [TotalXData; TempXData],...'YData', [TotalYData; TempYData]);Status = 0 ;returnendTestArray = ismember( [TempXData, TempYData - 20], [TotaIXData, TotalYData],'rows');if any( TestArray )set( handles.BlockHandle, 'XData', [TotalXData; TempXData],...'YData', [TotalYData; TempYData]);Status = 0 ;elseset( han dles.TempBlock, 'YData', TempYData - 20 );TempBlockPos.Dow nStep = TempBlockPos.Dow nStep + 1 ;setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );endcase 'Drop'global PauseTimePauseTime = 0 ;case 'Cha nge'global Block In dexOldBlockI ndex = BlockI ndex ;switch Block In dexcase {1,2,3,4}return;case {5,6}Newln dex = 7 ;case {7,8}Newln dex = 5 ;case {9,10,11,12}New In dex = mod( OldBlockI ndex, 4 ) + 9;case {13,14,15,16}New In dex = mod( OldBlockI ndex, 4 ) + 13;case {17,18,19,20}New In dex = mod( OldBlockI ndex, 4 ) + 17;case {21,22}NewI ndex = 23;case {23,24}NewI ndex = 21;case {25,26}New In dex = 27 ;case {27,28}New In dex = 25 ;end[BlockXArray, BlockYArray] = Com_GetBlock( h, NewI ndex );NewTempXData = BlockXArray - TempBlockPos .L eftStep * 20 ;NewTempYData = BlockYArray - TempBlockPos.Dow nStep * 20 ;if any( NewTempXData < AxesXLim(1) ) | any( NewTempXData > AxesXLim(2) ) |...any( NewTempYData < AxesYLim(1))Blockl ndex = OldBlockl ndex ;return;endTestArray = ismember( [NewTempXData, NewTempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )。

相关主题