用matlab編寫的俄羅斯方塊小游戲.doc
《用matlab編寫的俄羅斯方塊小游戲.doc》由會員分享,可在線閱讀,更多相關《用matlab編寫的俄羅斯方塊小游戲.doc(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。
用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 ) ; % 創(chuàng)建菜單 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(幫不了你- -!,不好意思) ); % 創(chuàng)建工具條,圖標可以用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 ) ) ; % 創(chuàng)建游戲窗口 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; % 創(chuàng)建一個窗口用于顯示下一個方塊的圖形 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] ) ; % 創(chuàng)建一組控件,包括(兩個文本框用于顯示當前方塊數(shù)和成績,兩個按鈕用于暫停和退出) 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 = { 退出, 暫停, 方塊數(shù), 積分 }; 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, {方塊數(shù),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, MainImage ); setappdata( handles.RussiaBlock, ImageData, ValidPicture ) ; catch ErrorString = sprintf( [讀取圖片失敗,錯誤信息為:\n,lasterr] ) ; errordlg( ErrorString ) ; end end % ------------------------------------------------------------------------- function BlockColor_Callback( h ) handles = guidata( h ) ; CurrentColor = getappdata( handles.RussiaBlock, BlockColor ) ; if isempty( CurrentColor ) CurrentColor = GetDefaultBlockColor ; setappdata( handles.RussiaBlock, BlockColor, CurrentColor ) ; end NewColor = uisetcolor( CurrentColor, 請選擇方塊顏色 ) ; if length( NewColor ) == 0 return; else setappdata( handles.RussiaBlock, BlockColor, NewColor ) ; set( handles.BlockHandle, MarkerFaceColor, NewColor ) ; set( handles.TempBlock, MarkerFaceColor, NewColor ) ; set( handles.NextBlock, MarkerFaceColor, NewColor ) ; end % ------------------------------------------------------------------------ function Default_Callback( h ) handles = guidata( h ) ; BlockColor = GetDefaultBlockColor ; AxesColor = GetDefaultMainAxesColor ; set( handles.MainAxes, Color, AxesColor ) ; set( handles.BlockHandle, MarkerFaceColor, BlockColor ) ; set( handles.TempBlock, MarkerFaceColor, BlockColor ) ; set( handles.NextBlock, MarkerFaceColor, BlockColor ) ; % ------------------------------------------------------------------------- function PauseGame_Callback( h ) handles = guidata( h ) ; ToolStart = get( handles.PauseTool, State ) ; if strcmp( ToolStart, on ) set( handles.PauseButton, Value, 1 ) ; waitfor( handles.PauseTool, State, off ) ; else set( handles.PauseButton, Value, 0 ) ; end % ------------------------------------------------------------------------- function ButtonPauseGame_Callback( h ) handles = guidata( h ) ; ToggleButtonValue = get( h, Value ) ; if ToggleButtonValue == 0 set( h, Value, 1 ) ; set( h, String, 繼續(xù) ) ; set( handles.PauseTool, State, on ) ; waitfor( handles.PauseTool, State, off ) ; else set( h, Value, 0 ) ; set( h, String, 暫停 ) ; set( handles.PauseTool, State, off ) ; set( handles.RussiaBlock, CurrentObject, handles.MainAxes ) ; end % ------------------------------------------------------------------------ function CloseFigure_Callback( h ) handles = guidata( h ) ; BlockColor = getappdata( handles.RussiaBlock, BlockColor ) ; MainAxesColor = get( handles.MainAxes, Color ) ; MainAxesImageHandle = findobj( handles.MainAxes, Type, image ) ; if ~isempty( MainAxesImageHandle ) MainAxesImage.Property.Tag = get( MainAxesImageHandle, Tag ); MainAxesImage.Property.Hittest = get( MainAxesImageHandle, Hittest ); MainAxesImage.Property.XData = get( MainAxesImageHandle, XData ); MainAxesImage.Property.YData = get( MainAxesImageHandle, YData ); MainAxesImage.ImageData = getappdata( handles.RussiaBlock, ImageData ) ; else MainAxesImage.ImageData = [] ; end save ColorInfo.mat BlockColor MainAxesColor MainAxesImage delete( handles.RussiaBlock ) ; % ------------------------------------------------------------------------- function Color = GetDefaultBlockColor Color = [0 0 1] ; % ------------------------------------------------------------------------- function Color = GetDefaultMainAxesColor Color = [1 1 1] ; % ---------------------------------------------------------------- function [BlockXArray, BlockYArray] = Com_GetBlock( varargin ) global BlockIndex ; BlockXArray = [] ; BlockYArray = [] ; handles = guidata( varargin{1} ) ; if nargin == 1 BlockArray = getappdata( handles.RussiaBlock, BlockArray ) ; BlockIndex = ceil( rand(1) * 24 ) ; else % nargin == 2 BlockIndex = varargin{2} ; end switch(BlockIndex) 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 Bloc- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- matlab 編寫 俄羅斯方塊 小游戲
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-6637435.html