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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用matlab编写的俄罗斯方块小游戏
fun ctio n RussiaBlock( varargin )
if nargin == 0
OldHandle = findobj( 'Type', 'figure', 'Tag', 'RussiaBlock');
if ishandle( OldHandle )
delete( OldHa ndle );
end
FigureHandle = 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 = uime
nu( 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 dowWidth
Mai 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 mber
TempButt 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 ;
else
TempButtonPosition(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 ;
end
Butto 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 );
end
if fin dstr( Butto nTag{ num}, 'PauseButto n')
set( ButtonHandle, 'Enable', 'inactive', 'ButtonDownFcn', ButtonCallback{num}, 'Cal',''); end
end
MainBlockAxes = 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 =[];
try
Colorl nfo = load('ColorI nfo.mat');
catch
end
if isempty( Colorl nfo )
Colorl nfo.BlockColor = GetDefaultBlockColor ;
Colorl nfo.Mai nAxesColor = GetDefaultMai nAxesColor ;
ColorI nfo.Ma in AxesImage .Im ageData =[];
end
set( 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 ); end
set( 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 PauseTime
if nargin == 1
StartType = '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 );
else
end
set( 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 over
text( 20, 200, 'GameOver', 'Parent', handles.MainBlockAxes,...
'Fo ntSize', 30, 'Color', 'r', 'Fo ntAn gle', 'italic');
break;
end
if len gth( TotalYData ) >= 4
TotalXData = 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 ) == 12
CompleteL ine = [CompleteL ine, LastBlockYData (nu m)];
Usefull ndex = [Usefull ndex, In dex];
end
end
if ~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 ;
end
end
set( ha ndles.BlockHa ndle, 'XData', TotalXData, 'YData', TotalYData );
end
BlockNumber = 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 ;
else
PauseTime = ceil( 20 / GameLevel ) / 100 ;
end
TempBlockPos. 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) ~= 0
pause( PauseTime )
end
Status = test_MoveBlock( h, 'Dow n');
end
end
% ------------------------------------------------------------------------
fun ctio n KeyPress_Callback( h )
han dles = guidata( h );
PauseState = get( han dles.PauseTool, 'State');
if strcmp( PauseState, 'on')
return
end
BoardC onfig = getappdata( han dles.RussiaBlock, 'BoardC on fig');
if isempty( BoardConfig )
Left = 'leftarrow';
Right = 'rightarrow';
Down = 'dow narrow';
Change = 'uparrow';
Drop = 'space';
else
Left = BoardCo nfig.Left ;
Right = BoardConfig.Right;
Dow n = BoardC on fig.Dow n ;
Change = BoardC on fig.Cha nge ;
Drop = BoardC on fig.Drop ;
end
Curren tKey = get( han dles.RussiaBlock, 'Curre ntKey');
switch Curre ntKey
case Left
test_MoveBlock( h, 'Left');
case Right
test_MoveBlock( h, 'Right');
case Down
test_MoveBlock( h, 'Dow n');
case Change
test_MoveBlock( h, 'Cha nge');
case Drop
test_MoveBlock( h, 'Drop');
otherwise
return ;
end
% ------------------------------------------------------------------------
fun ctio n Win dowColor_Callback( h )
han dles = guidata( h );
CurrentColor = get( handles.MainAxes, 'Color');
NewColor = uisetcolor( CurrentColor,' 请选择窗口颜色');
if len gth( NewColor ) == 0
return;
else
set( 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('文件名过长,读取失败’);
% end
try
Picture = imread( [Path, PictureFile]);
for num = 1: size( Picture, 3 )
ValidPicture(:, :, num) = flipud( Picture(:,:,num));
end
AxesXLim = 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 ); catch
ErrorStri ng = spri ntf([' 读取图片失败,错误信息为:\n ',lasterr]);
errordlg( ErrorStri ng );
end
end
% ------------------------------------------------------------------------
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 ); end
NewColor = uisetcolor( CurrentColor,' 请选择方块颜色');
if len gth( NewColor ) == 0
return;
else
setappdata( 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 );
else
set( 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 == 0
set( h, 'Value', 1 );
set( h, 'String','继续');
set( handles.PauseTool, 'State', 'on');
waitfor( ha ndles.PauseTool, 'State', 'off );
else
set( 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 = GetDefaultBlockColor
Color = [0 0 1];
% ------------------------------------------------------------------------
fun ctio n Color = GetDefaultMai nAxesColor
Color = [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 == 1
BlockArray = getappdata( han dles.RussiaBlock, 'BlockArray');
BlockIndex = ceil( rand(1) * 24 );
else % nargin == 2
Block 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 T1
BlockXArray =卜1;0;1;0] * 20 - 10 ;
BlockYArray = [1;1;1;0] * 20 - 10 ; case {10} % T2
BlockXArray = [0;0;1;0] * 20 - 10 ;
BlockYArray = [2;1;1;0] * 20 - 10 ; case {11} % T3
BlockXArray = [0;0;1;-1] * 20 - 10 ;
BlockYArray = [2;1;1;1] * 20 - 10 ; case {12} % T4
BlockXArray = [0;0;0;-1] * 20 - 10 ;
BlockYArray = [2;1;0;1] * 20 - 10 ; case {13} % 8 类L L1
BlockXArray = [0;0;0;1] * 20 - 10 ;
BlockYArray = [1;0;-1;-1] * 20 - 10 ; case {14} % L2
BlockXArray = [-1;0;1;1] * 20 - 10 ;
BlockYArray = [0;0;0;1] * 20 - 10 ; case {15} % L3
BlockXArray = [-1;0;0;0] * 20 - 10 ;
BlockYArray = [1;1;0;-1] * 20 - 10 ; case {16} % L4
BlockXArray = [-1;-1;0;1] * 20 - 10 ;
BlockYArray = [-1;0;0;0] * 20 - 10 ; case {17} % L5
BlockXArray = [-1;0;0;0] * 20 - 10 ;
BlockYArray = [-1;-1;0;1] * 20 - 10 ; case {18} % L6
BlockXArray = [-1;-1;0;1] * 20 - 10 ;
BlockYArray = [1;0;0;0] * 20 - 10 ; case {19} % L7
BlockXArray = [0;0;0;1] * 20 - 10 ;
BlockYArray = [-1;0;1;1] * 20 - 10 ; case {20} % L8
BlockXArray = [-1;0;1;1] * 20 - 10 ;
BlockYArray = [0;0;0;-1] * 20 - 10 ; case {21 22} % 4 类Z Z1
BlockXArray = [-1;0;0;1] * 20 - 10 ;
BlockYArray = [1;1;0;0] * 20 - 10 ; case {23 24} % Z2
BlockXArray = [0;0;1;1] * 20 -10 ;
BlockYArray = [-1;0;0;1] * 20 - 10 ; case {25 26} % Z3
BlockXArray = [-1;0;0;1] * 20 - 10 ;
BlockYArray = [0;0;1;1] * 20 - 10 ; case {27 28} % Z4
BlockXArray = [0;0;1;1] * 20 - 10 ;
BlockYArray = [1;0;0;-1] * 20 - 10 ;
end if nargin == 1
NewBlockArray.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});
else
BlockXArray = BlockArray.BlockXArray ; BlockYArray = BlockArray.BlockYArray ; BlockI ndex = BlockArray.Blockl ndex ; end
end
AxesXLim = getappdata( han dles.RussiaBlock, 'XLim'); AxesYLim = getappdata( han
dles.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 ) return
end 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 )
return
end
AxesXLim = getappdata( han dles.RussiaBlock, 'XLim');
AxesYLim = getappdata( han dles.RussiaBlock, 'YLim');
switch MoveMode
case 'Left'
if any( TempXData - 20 < AxesXLim(l))
return
end
TestArray = ismember( [TempXData - 20, TempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )
return;
else
set( han dles.TempBlock, 'XData', TempXData - 20 );
TempBlockPos. LeftStep = TempBlockPos .L eftStep + 1 ;
setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );
end
case 'Right'
if any( TempXData + 20 > AxesXLim(2))
return
end
TestArray = ismember( [TempXData + 20, TempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )
return;
else
set( han dles.TempBlock, 'XData', TempXData + 20 );
TempBlockPos. LeftStep = TempBlockPos .L eftStep - 1 ;
setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );
end
case 'Dow n'
if any( TempYData - 20 < AxesYLim(1))
set( handles.BlockHandle, 'XData', [TotalXData; TempXData],...
'YData', [TotalYData; TempYData]);
Status = 0 ;
return
end
TestArray = ismember( [TempXData, TempYData - 20], [TotaIXData, TotalYData],
'rows');
if any( TestArray )
set( handles.BlockHandle, 'XData', [TotalXData; TempXData],...
'YData', [TotalYData; TempYData]);
Status = 0 ;
else
set( han dles.TempBlock, 'YData', TempYData - 20 );
TempBlockPos.Dow nStep = TempBlockPos.Dow nStep + 1 ;
setappdata( han dles.RussiaBlock, 'TempBlockPos', TempBlockPos );
end
case 'Drop'
global PauseTime
PauseTime = 0 ;
case 'Cha nge'
global Block In dex
OldBlockI ndex = BlockI ndex ;
switch Block In dex
case {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;
end
TestArray = ismember( [NewTempXData, NewTempYData], [TotalXData, TotalYData], 'rows'); if any( TestArray )。

相关文档
最新文档