收藏 分销(赏)

matlab各种游戏编程大全-俄罗斯方块-贪吃蛇-拼图-五子棋-黑白棋-华容道等.docx

上传人:s4****5z 文档编号:8891835 上传时间:2025-03-06 格式:DOCX 页数:94 大小:252.88KB 下载积分:10 金币
下载 相关 举报
matlab各种游戏编程大全-俄罗斯方块-贪吃蛇-拼图-五子棋-黑白棋-华容道等.docx_第1页
第1页 / 共94页
matlab各种游戏编程大全-俄罗斯方块-贪吃蛇-拼图-五子棋-黑白棋-华容道等.docx_第2页
第2页 / 共94页


点击查看更多>>
资源描述
用matlab编写的俄罗斯方块小游戏 · function RussiaBlock( varargin ) if nargin == 0       OldHandle = findobj( 'Type', 'figure', 'Tag', 'RussiaBlock' ) ;   if ishandle( OldHandle )   delete( OldHandle ) ;   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 )' ) ;        generate_FigureContent( FigureHandle ) ;       init_FigureContent( FigureHandle ) ;       set( FigureHandle, 'Visible', 'on' ) ;     elseif ischar( varargin{1} )       feval( varargin{:} ) ;     end % ------------------------------------------------------------------------- function generate_FigureContent( FigureHandle ) TabSpace = 30 ; BlockWidth = 20 ; BlockHeight = 20 ; FigureWidth = BlockWidth * (12 + 1) + TabSpace * 7; FigureHeight = 500 ; set( FigureHandle, 'Position', [0 0 FigureWidth FigureHeight] ) ; movegui( FigureHandle, 'center' ) ; % 创建菜单 BeginMenu = uimenu( FigureHandle, 'Label', '开始' ) ; StartMenu = uimenu( BeginMenu, 'Label', '开始新游戏', 'Accelerator', 'N',...   'Callback', 'RussiaBlock( ''StartNewGame_Callback'', gcbo )'); SaveMenu = uimenu( BeginMenu, 'Label', '保存', 'Accelerator', 'S', 'Enable', 'off',...   'Separator', 'on', 'Cal', 'RussiaBlock( ''SaveGame_Callback'', gcbo )' ); LoadMenu = uimenu( BeginMenu, 'Label', '读取', 'Accelerator', 'L', 'Enable', 'off',...   'Cal', 'RussiaBlock( ''LoadGame_Callback'', gcbo )' ); QuitMenu = uimenu( BeginMenu, 'Label', '退出', 'Accelerator', 'Q', 'Separator', 'on', 'Cal', 'close(gcf)'); OperationMenu = uimenu( FigureHandle, 'Label', '功能' ); BoardConfigMenu = uimenu( OperationMenu, 'label', '键盘设置', 'Enable', 'off',...   'Cal', 'RussiaBlock( ''BoardConfig_Callback'', gcbo )' ); FigureConfigMenu = uimenu( OperationMenu, 'label', '界面设置', 'Enable', 'off',...   'Cal', 'RussiaBlock( ''FigureConfig_Callback'', gcbo )' ); HighScoreMenu = uimenu( OperationMenu, 'label', '最高记录', 'Separator', 'on',...   'Cal', 'RussiaBlock( ''HighScore_Callback'', gcbo )', 'Enable', 'off' ); GameLevelMenu = uimenu( OperationMenu, 'Label', '游戏难度',...   'Cal','RussiaBlock( ''GameLevel_Callback'', gcbo )' ); HelpMenu = uimenu( FigureHandle, 'Label', '帮助' ); AboutMenu = uimenu( HelpMenu, 'Label', '关于此软件', 'Cal', 'helpdlg(''俄罗斯方块MATLAB版'',''关于此软件…………'')'); HelpDlgMenu = uimenu( HelpMenu, 'Label', '游戏帮助', 'Separator', 'on', 'Cal', 'helpdlg(''帮不了你- -!'',''不好意思'')' ); % 创建工具条,图标可以用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 )' ) ; % 创建游戏窗口 MainWindowXPos = TabSpace; MainWindowYPos = TabSpace; MainWindowWidth = BlockWidth * 12 ;  MainWindowHeight = BlockHeight * 22 ; MainWindowPosition = [MainWindowXPos MainWindowYPos MainWindowWidth MainWindowHeight] ; % 定义游戏窗口的右键菜单 AxesContextMenu = uicontextmenu( 'Tag', 'uicontextmenu' ) ; uimenu( AxesContextMenu, 'Label', '设置窗口颜色', 'Cal', 'RussiaBlock( ''WindowColor_Callback'', gcbo )' ) uimenu( AxesContextMenu, 'Label', '设置背景图片', 'Cal', 'RussiaBlock( ''WindowPicture_Callback'', gcbo )' ) uimenu( AxesContextMenu, 'Label', '设置方块颜色', 'Cal', 'RussiaBlock( ''BlockColor_Callback'', gcbo )' ) uimenu( AxesContextMenu, 'Label', '恢复默认', 'Cal', 'RussiaBlock( ''Default_Callback'', gcbo )' ) MainAxes = axes( 'Units', 'pixels', 'Pos', MainWindowPosition, 'XTick', [], 'YTick',[], 'XTickLabel', [],...   'YTickLabel', [], 'Box', 'on', 'Tag', 'MainAxes', 'UicontextMenu', AxesContextMenu,...   'XLim', [0 MainWindowWidth], 'YLim', [0 MainWindowHeight] ) ; hold on; % 创建一个窗口用于显示下一个方块的图形 NextBlockWndXPos = MainWindowXPos + MainWindowWidth + TabSpace ; NextBlockWndHeight = 4 * TabSpace + BlockHeight ; NextBlockWndYPos = MainWindowYPos + MainWindowHeight - 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] ) ; % 创建一组控件,包括(两个文本框用于显示当前方块数和成绩,两个按钮用于暂停和退出) ButtonTag = { 'QuitButton', 'PauseButton', 'BlockNumText', 'ScoreText' } ; ButtonStyle = { 'pushbutton', 'togglebutton', 'text', 'text' } ; FontColor = { [0 0 0], [1 0 0], [0 0 1], [1 0 1] } ; ButtonColor = { [0.7 0.8 0.9], [0.3 1 0.3], [0.5 1 1], [0.5 1 1] } ; ButtonString = { '退出', '暂停', '方块数', '积分' }; ButtonCallback = { 'close(gcf)', 'RussiaBlock( ''ButtonPauseGame_Callback'', gcbo )', '', '' } ; ButtonNumber = length( ButtonTag ) ; ButtonWidth = NextBlockWndWidth ; ButtonHeight = 50 ; ButtonXPos = NextBlockWndXPos ; ButtonYPos = MainWindowYPos + TabSpace ; ButtonPosition = [ButtonXPos ButtonYPos ButtonWidth ButtonHeight] ; ButtonTabSpace = (NextBlockWndYPos - 2 * TabSpace - ButtonHeight * ButtonNumber) / ButtonNumber ; for num = 1: ButtonNumber       TempButtonPosition = ButtonPosition ;   TempButtonPosition(2) = ButtonPosition(2) + (num - 1) * (ButtonTabSpace + ButtonHeight);   if findstr( ButtonStyle{num}, 'button' )   TempButtonPosition(1) = TempButtonPosition(1) + 10 ;   TempButtonPosition(2) = TempButtonPosition(2) + 5 ;   TempButtonPosition(3) = TempButtonPosition(3) - 10 * 2 ;   TempButtonPosition(4) = TempButtonPosition(4) - 5 * 2 ;   else   TempButtonPosition(1) = TempButtonPosition(1) - 10 ;   TempButtonPosition(2) = TempButtonPosition(2) - 5 ;   TempButtonPosition(3) = TempButtonPosition(3) + 10 * 2;   TempButtonPosition(4) = TempButtonPosition(4) + 5 * 2 ;   end       ButtonHandle = uicontrol( 'Tag', ButtonTag{num}, 'Style', ButtonStyle{num}, 'Pos', TempButtonPosition,...   'Foregroundcolor', FontColor{num}, 'Backgroundcolor', ButtonColor{num},...   'Fontsize', 16, 'String', ButtonString{num}, 'Cal', ButtonCallback{num} ) ;       if findstr( ButtonStyle{num}, 'text' )   set( ButtonHandle, 'Max', 2 ) ;   end   if findstr( ButtonTag{num}, 'PauseButton' )   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( FigureHandle, 'XLim', [0 MainWindowWidth] ) setappdata( FigureHandle, 'YLim', [0 MainWindowHeight] ) handles = guihandles( FigureHandle ) ; guidata( FigureHandle, handles ) ; % ------------------------------------------------------------------------- function init_FigureContent( FigureHandle ) handles = guidata( FigureHandle ) ; ColorInfo = [] ; try   ColorInfo = load('ColorInfo.mat') ;   catch     end if isempty( ColorInfo )   ColorInfo.BlockColor = GetDefaultBlockColor ;   ColorInfo.MainAxesColor = GetDefaultMainAxesColor ;   ColorInfo.MainAxesImage.ImageData = [] ; end set( handles.MainAxes, 'Color', ColorInfo.MainAxesColor ) ; if ~isempty( ColorInfo.MainAxesImage.ImageData )   ImageHandle = image( ColorInfo.MainAxesImage.ImageData, 'Parent', handles.MainAxes ) ;   set( ImageHandle, ColorInfo.MainAxesImage.Property ) ;   setappdata( FigureHandle, 'ImageData', ColorInfo.MainAxesImage.ImageData ) ; end set( handles.BlockHandle, 'MarkerFaceColor', ColorInfo.BlockColor ) ; set( handles.TempBlock, 'MarkerFaceColor', ColorInfo.BlockColor ) ; set( handles.NextBlock, 'MarkerFaceColor', ColorInfo.BlockColor ) ; setappdata( FigureHandle, 'BlockColor', ColorInfo.BlockColor ) ;   % ------------------------------------------------------------ function StartNewGame_Callback( h, StartType ) handles = guidata( h ) ; global PauseTime if nargin == 1   StartType = 'NewStart' ;   setappdata( handles.RussiaBlock, 'BlockNumber', 0 ) ;   set( handles.BlockNumText, 'String', {'方块数','0'} ) ;       setappdata( handles.RussiaBlock, 'CurrentScore', 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( handles.NextBlock, 'Visible', 'on' ) ; set( handles.TempBlock, 'Visible', 'on' ) ; set( handles.PauseTool, 'State', 'off' ) ; set( handles.PauseButton, 'Value', 0 ) ; YLim = get( handles.MainAxes, 'YLim' ) ; while( ishandle( h ) )    TotalYData = get( handles.BlockHandle, 'YData' ) ;   if any( TotalYData >= YLim(2) )   % Game over   text( 20, 200, 'GameOver', 'Parent', handles.MainBlockAxes,...   'FontSize', 30, 'Color', 'r', 'FontAngle', 'italic' ) ;   break;   end       if length( TotalYData ) >= 4    TotalXData = get( handles.BlockHandle, 'XData' ) ;   LastBlockYData = TotalYData( end - 3: end ) ;   LastBlockYData = unique( LastBlockYData ) ;   CompleteLine = [] ;   UsefulIndex = [] ;   for num = 1: length( LastBlockYData )   [YData, Index] = find( TotalYData == LastBlockYData(num) ) ;   if length( YData ) == 12   CompleteLine = [CompleteLine, LastBlockYData(num)] ;   UsefulIndex = [UsefulIndex, Index] ;   end     end   if ~isempty( CompleteLine )   TotalXData( UsefulIndex ) = [] ;   TotalYData( UsefulIndex ) = [] ;       LineNumber = length( CompleteLine ) ;   ScoreArray = [100 300 600 1000] ;   NewScore = ScoreArray(LineNumber) ;   CurrentScore = getappdata( handles.RussiaBlock, 'CurrentScore' ) ;   TextString = get( handles.ScoreText, 'String' ) ;   TextString{2} = CurrentScore + NewScore ;     set( handles.ScoreText, 'String', TextString ) ;   setappdata( handles.RussiaBlock, 'CurrentScore', CurrentScore + NewScore ) ;       UpdateGameLevel( handles.RussiaBlock, CurrentScore + NewScore ) ;   % 处理需要下移的方块   for num = LineNumber : -1 : 1   [YData, Index] = find( TotalYData > LastBlockYData(num) ) ;   TotalYData(Index) = TotalYData(Index) - 20 ;   end   end   set( handles.BlockHandle, 'XData', TotalXData, 'YData', TotalYData ) ;   end       BlockNumber = getappdata( handles.RussiaBlock, 'BlockNumber' ) ;   TextString = get( handles.BlockNumText, 'String' ) ;   TextString{2} = BlockNumber + 1 ;     set( handles.BlockNumText, 'String', TextString ) ;   setappdata( handles.RussiaBlock, 'BlockNumber', BlockNumber + 1 ) ;       GameLevel = getappdata( handles.RussiaBlock, 'GameLevel' ) ;   if isempty( GameLevel )   PauseTime = 0.3 ;   else   PauseTime = ceil( 20 / GameLevel ) / 100 ;   end   TempBlockPos.LeftStep = 0 ;   TempBlockPos.DownStep = 0 ;   setappdata( handles.RussiaBlock, 'TempBlockPos', TempBlockPos ) ;   Status = 1;     [BlockXArray,BlockYArray] = Com_GetBlock( h ) ;   set( handles.TempBlock, 'XData', BlockXArray, 'YData', BlockYArray ) ;   while( Status & ishandle( h ) )   if(PauseTime) ~= 0   pause( PauseTime )   end   Status = test_MoveBlock( h, 'Down' ) ;   end end   % ------------------------------------------------------------------------- function KeyPress_Callback( h ) handles = guidata( h ) ; PauseState = get( handles.PauseTool, 'State' ) ; if strcmp( PauseState, 'on' )    return end BoardConfig = getappdata( handles.RussiaBlock, 'BoardConfig' ) ; if isempty( BoardConfig )   Left = 'leftarrow' ;   Right = 'rightarrow' ;   Down = 'downarrow' ;   Change = 'uparrow' ;   Drop = 'space' ; else   Left = BoardConfig.Left ;   Right = BoardConfig.Right ;   Down = BoardConfig.Down ;   Change = BoardConfig.Change ;   Drop = BoardConfig.Drop ; end CurrentKey = get( handles.RussiaBlock, 'CurrentKey' ) ; switch CurrentKey   case Left   test_MoveBlock( h, 'Left' ) ;   case Right   test_MoveBlock( h, 'Right' ) ;   case Down   test_MoveBlock( h, 'Down' ) ;   case Change   test_MoveBlock( h, 'Change' ) ;   case Drop   test_MoveBlock( h, 'Drop' ) ;     otherwise   return ; end % ------------------------------------------------------------------------- function WindowColor_Callback( h ) handles = guidata( h ) ; CurrentColor = get( handles.MainAxes, 'Color' ) ; NewColor = uisetcolor( CurrentColor, '请选择窗口颜色' ) ; if length( NewColor ) == 0   return; else   set( handles.MainAxes, 'Color', NewColor ) ; end % ------------------------------------------------------------------------- function WindowPicture_Callback( h ) handles = guidata( h ) ; [PictureFile, Path] = uigetfile( {'*.jpg; *.bmp'},'请选择图片' ); if isnumeric( PictureFile )   return ; else   % if length( 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       ImageXData(1) = AxesXLim(1) + (diff( AxesXLim ) - ImageXLimit) / 2 + 1;   ImageXData(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'
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服