




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計報告 題目:基于C+我羅斯方塊 學 院: 專 業: 學 號: 姓 名: 二O三 年十二月 經典小游戲設計-俄羅斯方塊 一、需求分析。 1.1、游戲需求 隨機給出不同的形狀(長條形、 Z字形、反Z形、田字形、7字形、反7形、 T字型)下落填充給定的區域,若填滿一條便消掉,若在游戲中各形狀填滿了給定 區域,為輸者,彈出相應提示。 1.2、游戲界面需求 良好的用戶界面,有關信息顯示(如操作方法、等級等)。讓方塊在一定的區 域內運動和變形,該區域用一種顏色表明,即用一種顏色作為背景,本游戲的背景 設為黑色。還需用另一種顏色把黑色圍起來 ,寬度適中,要實現美感。而不同的方 塊用不同的著色表示,使
2、游戲界面更加清晰、有條理。消層時采用一定的時間延 遲,增加視覺消行的感官效果。 1.3、游戲方塊需求 良好的方塊形狀設計,繪制七種常見的基本圖形(長條形、Z字形、反Z形、 田字形、L字形、反L形、T字型)以及另外本程序另外加入的點形方塊,各個方 塊要能實現它的變形,可設為順時針或逆時針變形,一般為逆時針。為體現游戲 的趣味性和擴展性,本游戲象征性的增加了點形方塊,其他更多形狀的方塊可用 類似方法增加。 1.4、游戲控制的需求 游戲控分為多個方面,包括畫面繪制,控制命令的獲取,控制命令的分配、 控制命令的處理,方塊的繪制,方塊的移動,方塊的旋轉,方塊下落和消層以及 計分等。對各個命令的合理處理和
3、綜合控制十分重要,一旦出錯可能導致整個程 序的崩潰,因此需要小心設計。 二、系統設計。 2.1、程序流程圖: 2.2、游戲設計概述 從整體上而言,在該游戲可設計一個方塊類, 其中包括對方塊的信息描述(如: ID)、方塊的操作(如:旋轉、下沉)。再設計一個控制類,實現各種控制(如: 獲取控制信號,分發控制信號)。另定義一個游戲區類,用以處理游戲區繪制等內 容。框圖如下: 方塊類(GAME BLOCK 游戲區類(Window) BLOCKINFO g_CurBlock; Private: 無 Private: (新方塊) Public: Void InitWin dow() BLOCKINFO g
4、_NextBlock; (下一方塊) Public: GAME_BLOCK () 游戲控制類(CGam) GAME_BLOCK () Private Void void NewBlock();生成方塊 : DispatchC on trol(CTRL); bool CheckBlock(BLOCKINFO Public: void Ini tGame();/初始化游 _block);檢測方塊能否放下 戲 void DrawBlock(BLOCKINFO Void Start_Game();開始游 _block,DRAW_draw=SHOW); 戲 void On Rotate。;/旋轉方塊 v
5、oid On Left();左移方塊 void On Right();右移方塊 void On Dow n();下移方塊 void On Si nk(CGAME /沉 底方塊 BLOCKINFO BLOCKINFO void Game_Over();游戲結 束 void NewGame(); 新游戲 void Quit_Game();退出游 戲 CTRL GetCo ntrol(bool _only resettimer= false);/ 獲取控制命令 在主函數中(按照2.1中框圖),先通過控制類初始化游戲,再通過隨機時間 函數獲得一個隨機數,該隨機數確定一個方塊,即用該隨機數產生一個ID從
6、而確 定產生的為方塊。然后從鍵盤取得各種操作信號,通過控類函數對操作信號進行 分發、處理,進而控制方塊的行為改變。與此同時,監控游戲區中已有方塊的狀 態,一旦滿足消行即進行消行控制,同時進行計分和等級劃分,而如果游戲區已 滿則游戲結束,彈出提示。而對界面和方塊的展現主要通過第三方軟件EasyX實 現,通過其畫圖位置的改變與時間的結合達到方塊視覺移動的效果。 2.3、定義方塊的數據結構 方塊是本游戲的基本要素,對于方塊的設計,本游戲用4*4的矩陣畫出來,在 相應的位置置為1和0以實現各種方塊的形狀,以“立L形”為例如下: 而在程序設計中則賦 六進制ID即可表示該方 0 x4460,再與其其他變
7、種L形ID的集合0 x4460, MAGENTA其他各種方塊 0 x0F00, / I 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 予各種基本方塊一個不同的十 塊,如“立7形”其ID為 形組合和著色分配即可得到各 0 x02E0, 0 x0622, 0 x0740, 類似設計。具體清單如下: 0 x4444, 0 x0F00, 0 x4444, RED, 0 x0660, 0 x0660, 0 x0660, 0 x0660, BLUE,/ 口 0 x4460, 0 x02E0, 0 x0622, 0 x0740, CYAN, / L藍綠色 0 x2260, 0 x0E20,
8、 0 x0644, 0 x0470, GREEN,反 L 0 x0C60, 0 x2640, 0 x0C60, 0 x2640, BROWN,/ Z 0 x0360, 0 x4620, 0 x0360, 0 x4620, YELLOW,反 Z 品紅 0 x4E00, 0 x4C40, 0 x0E40, 0 x4640, MAGENTA; / T 2.4、方塊的變形 方塊要實現變形,其實就是通過EasyX畫出不同的圖形來實現的,當然亂畫 是不行的,而為了控制其變形的情況,必須設定相應的圖形描述,本程序使用的 是不同圖形的不同ID碼表示的方法來實在方塊的描述的。能過鍵盤接收變形指令 (即向上鍵),
9、將所得信號傳遞給信號接收函數,再通過信號處理函數改變當前方 塊的ID值,最后根據新的ID值畫出新的圖形,此時即實在了方塊的變形。 2.5、定時處理機制 為了提高游戲的易控性和自動性,定時機制是很有必要的。經過定時器的設 置后,這里通過利用控制程序跳到定時器的時間的處理函數去實現,當固定時間 片間隔到達后,先檢測當前下墜物是否已經到達了底部,不是則進行下墜物向下 移動一個單位的操作,是則到底后產生一個新的“下一個下墜物”,并代替舊的, 將原先舊的“下一個下墜物”用作當前激活狀態下正在使用的下墜物,并對使用 后的一些狀態進行檢測:是否馬上到達底部,使則進行銷行操作;是否在到達底 部的同時到達游戲區
10、域的頂部,從而判定游戲是否因違規而結束,彈出相應對話 框供用戶選擇是否繼續重新幵始。 圖3.2.2裝載方塊 視圖類通過不同十六進制ID來記錄下墜物的類型,共有七種形狀,并從7種 方塊中隨機抽取圖形。而ID除了記錄下墜物的類型外,還需記錄其當前的變形狀 態。 在產生新的下一個下墜物前,需要先將當前狀態物的記錄和舊的下一個下墜 物保存下來,然后用隨機函數Ran dom ()產生一個最大值不大于指定值的隨機正整 數,將這個新生成的正整數用作新的“下一個下墜物”的形狀值。 三、關鍵代碼描述。 #in elude #in elude #in elude / /定義常量、枚舉量、結構體、全局變量 / #d
11、efine WIDTH10/ 游戲區寬度 #define HEIGHT 22/ 游戲區高度 #defi ne UNIT 20 II每個游戲區單位的實際像素 /定義操作類型 enum CMD CMD_ROTATE,II CMD_LEFT, CMD_RIGHT, CMD_DOWNI CMD_SINK,II CMD QUIT II 方塊旋轉 方塊左、右、下移動 方塊沉底 退出游戲 ; II 定義繪制方塊的方法 enum DRAW SHOW, CLEAR, FIX II II II 顯示方塊 擦除方塊 固定方塊 ; II II WORD dir4; II 方塊的四個旋轉狀態 COLORREF colo
12、r; II方塊的顏色 g_Blocks7 = OxOFOO, 0 x4444, OxOFOO, 0 x4444, RED, 0 x0660, OxO66O, OxO66O, OxO66O, BLUE, Ox446O, OxO2EO, OxO622, OxO74O, CYAN, Ox226O, OxOE2O, OxO644, OxO47O, GREEN, OxOC6O, Ox264O, OxOC6O, Ox264O, BROWN, OxO36O, Ox462O, OxO36O, Ox462O, YELLOW, Ox4EOO, Ox4C4O, OxOE4O, Ox464O, MAGENTA; II
13、 T 定義當前方塊、下一個方塊的信息 II L II I II II 口 藍綠色 反L II Z 反Z 品紅 定義七種俄羅斯方塊 struct BLOCK struct BLOCKINFO byte id; char x, y; byte dir:2; II II II 方塊ID 方塊在游戲區中的坐標 方向 II II初始化游戲 II退出游戲 II開始新游戲 II結束游戲 II獲取控制命令 g_CurBlock, g_NextBlock; 定義游戲區 BYTE g_WorldWIDTHHEIGHT = O; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
14、II II函數聲明 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII void In it(); void Quit(); void NewGame(); void GameOver(); CMD GetCmd(); void DispatchCmd(CMD _cmd); void NewBlock(); bool CheckBlock(BLOCKINFO _block); void Draw Un it(i nt x, i nt y, COLORREF c, DRAW _draw); void DrawBlock(BLOCKINFO _block,
15、DRAW _draw = SHOW);/ void On Rotate(); void On Left(); void On Right(); void On Dow n(); void On Si nk(); static int score=0; / / / / / / / / / 分發控制命令 生成新的方塊 檢測指定方塊是否可以放下 畫單元方塊 畫方塊 旋轉方塊 左移方塊 右移方塊 下移方塊 沉底方塊 /函數定義 / /主函數 void mai n() In it(); CMD c; while(true) c = GetCmd(); DispatchCmd(c); /按退出時,顯示對話
16、框咨詢用戶是否退出 if (c = CMD_QUIT) HWND wnd = GetHWnd(); if (MessageBox(wnd, _T(”您要退出游戲嗎? ), _T( 提醒),MB_OKCANCEL | MB_ICONQUESTION) = IDOK) Quit(); /初始化游戲 void Init() initgraph(640, 480); /設置圖案填充的背景色為透明 sran d( un sig ned)time(NULL); setbkmode(TRANSPARENT); 宋體); 操作說明:); 上:旋轉); 下:下移); 左:左移); /顯示操作說明 settext
17、style(14, 0, _T( outtextxy(20, 330, _T( outtextxy(20, 350, _T( outtextxy(20, 370, _T( outtextxy(20, 390, _T( outtextxy(20, 410, _T(”右:右移); outtextxy(20, 430, _T(空格:沉底); outtextxy(20, 450, _T(ESC :退出); outtextxy(40, 150,_T(score); /設置坐標原點 setorigi n(220, 20); /繪制游戲區邊界 recta ngle(-1, -1, WIDTH * UNIT,
18、 HEIGHT * UNIT); recta ngle(WIDTH + 1) * UNIT -1,-1, (WIDTH + 5) * UNIT, 4 * UNIT); /開始新游戲 NewGame(); /退出游戲 void Quit() closegraph(); exit(0); /開始新游戲 void NewGame() /清空游戲區 setfillcolor(BLACK); solidrectangle(0, 0, WIDTH * UNIT - 1, HEIGHT * UNIT - 1); ZeroMemory(g_World, WIDTH * HEIGHT); /生成下一個方塊 g_
19、NextBlock.id = ran d() % 7; g_NextBlock.dir = ran d() % 4; g_NextBlock.x = WIDTH + 1; g_NextBlock.y = HEIGHT - 1; /獲取新方塊 NewBlock(); /結束游戲 void GameOver() HWND wnd = GetHWnd(); if (MessageBox(wnd, _T(游戲結束。n 想重新來一局嗎? ”),_T(游戲結束),MB_YESNO | MB_ICONQUESTION) = IDYES) NewGame(); else Quit(); /獲取控制命令 DWO
20、RD m_oldtime; CMD GetCmd() /獲取控制值 while(true) /如果超時,自動下落一格 DWORD n ewtime = GetTickCou nt(); if (n ewtime - m_oldtime = 500) m_oldtime = n ewtime; return CMD_DOWN; 如果有按鍵,返回按鍵對應的功能 / if (kbhit() switch(getch() case w: case W: case a: return CMD_ROTATE; case A: case d: return CMD_LEFT; case D: case s:
21、 return CMD_RIGHT; case S: return CMD_DOWN; case 27: return CMD_QUIT; case : case 0: case 0 xE0: return CMD_SINK; switch(getch() case 72: case 75: case 77: case 80: return CMD_ROTATE; return CMD_LEFT; return CMD_RIGHT; return CMD_DOWN; / 延時 Sleep(20); (降低CPU占用率) / 分發控制命令 void DispatchCmd(CMD _cmd) s
22、witch(_cmd) case CMD_ROTATE: On Rotate(); break; case CMD_LEFT: On Left(); break; case CMD_RIGHT: On Right(); break; case CMD_DOWN: On Dow n(); break; case CMD_SINK: On Si nk(); break; case CMD_QUIT: break; /生成新的方塊 void NewBlock() g_NextBlock.id = ran d() % 7; g_NextBlock.dir = ran d() % 4; g_CurBlo
23、ck.id = g_NextBlock.id, g_CurBlock.dir = g_NextBlock.dir, g_CurBlock.x = (WIDTH - 4) / 2; g_CurBlock.y = HEIGHT + 2; /下移新方塊直到有局部顯示 WORD c = g_Blocksg_CurBlock.id.dirg_CurBlock.dir; while(c c = 4; /繪制新方塊 DrawBlock(g_CurBlock); /繪制下一個方塊 setfillcolor(BLACK); solidrecta ngle(WIDTH + 1) * UNIT, 0, (WIDTH
24、 + 5) * UNIT - 1,4 * UNIT - 1); DrawBlock(g_NextBlock); /設置計時器,用于判斷自動下落 m_oldtime = GetTickCou nt(); /畫單元方塊 void Draw Un it(i nt x, i nt y, COLORREF c, DRAW _draw) /計算單元方塊對應的屏幕坐標 int left = x * UNIT; int top = (HEIGHT - y - 1) * UNIT; int right = (x + 1) * UNIT - 1; int bottom = (HEIGHT - y) * UNIT
25、- 1; / 畫單元方塊 switch(_draw) case SHOW: /畫普通方塊 setl in ecolor(0 x006060); roun drect(left + 1, top + 1, right - 1, bottom - 1,5, 5); setl in ecolor(0 x003030); roundrect(left, top, right, bottom, 8, 8); setfillcolor(c); setli necolor(LIGHTGRAY); fillrecta ngle(left + 2, top + 2, right - 2, bottom - 2)
26、; break; case FIX: / 畫固定的方塊 setfillcolor(RGB(GetRValue(c) * 2 / 3, GetGValue(c) * 2 / 3, GetBValue(c) * 2 / 3); setli necolor(DARKGRAY); fillrecta ngle(left + 1, top + 1, right - 1, bottom - 1); break; case CLEAR: /擦除方塊 setfillcolor(BLACK); solidrectangle(x* UNIT, (HEIGHT - y - 1) * UNIT, (x + 1) *
27、UNIT - 1, (HEIGHT -y) * UNIT - 1); break; /畫方塊 void DrawBlock(BLOCKINFO _block, DRAW _draw) WORD b = g_Blocks_block.id.dir|_block.dir; int x, y; for(i nt i = 0; i 16; i+, b = 1) if (b y = _block.y - i / 4; if (y HEIGHT) Draw Un it(x, y, g_Blocks_block.id.color, _draw); /檢測指定方塊是否可以放下 bool CheckBlock(
28、BLOCKINFO _block) WORD b = g_Blocks_block.id.dir_block.dir; int x, y; for(i nt i = 0; i 16; i+, b = 1) if (b y = _block.y - i / 4; if (x = WIDTH) | (y 0) return false; if (y HEIGHT) return true; /旋轉方塊 void On Rotate。 /獲取可以旋轉的x偏移量 int dx; BLOCKINFO tmp = g_CurBlock; dx = =0; goto rotate; dx = =-1;got
29、o rotate; dx = =1; goto rotate; dx = =-2;goto rotate; dx = =2; goto rotate; tmp.dir+;if (CheckBlock(tmp) tmp.x = g_CurBlock.x - 1;if (CheckBlock(tmp) tmp.x = g_CurBlock.x + 1;if (CheckBlock(tmp) tmp.x = g_CurBlock.x - 2;if (CheckBlock(tmp) tmp.x = g_CurBlock.x + 2;if (CheckBlock(tmp) return; rotate:
30、 /旋轉 DrawBlock(g_CurBlock, CLEAR); g_CurBlock.dir+; g_CurBlock.x += dx; DrawBlock(g_CurBlock); /左移方塊 void On Left() BLOCKINFO tmp = g_CurBlock; tmp.x-; if (CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.x-; DrawBlock(g_CurBlock); /右移方塊 void On Right() BLOCKINFO tmp = g_CurBlock;tmp.x+; if
31、(CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.x+; DrawBlock(g_CurBlock); /下移方塊 void On Down() BLOCKINFO tmp = g_CurBlock; tmp.y-; if (CheckBlock(tmp) DrawBlock(g_CurBlock, CLEAR); g_CurBlock.y-; DrawBlock(g_CurBlock); else / OnSin k();/不可下移時,執行“沉底方塊”操作 沉底方塊 void On Si nk() int i, x, y; /
32、連續下移方塊 DrawBlock(g_CurBlock, CLEAR); BLOCKINFO tmp = g_CurBlock; tmp.y-; while (CheckBlock(tmp) g_CurBlock.y-; tmp.y_; DrawBlock(g_CurBlock, FIX); /固定方塊在游戲區 WORD b = g_Blocksg_CurBlock.id.dirg_CurBlock.dir; for(i = 0; i 16; i+, b = HEIGHT) /如果方塊的固定位置超出高度,結束游戲 GameOver(); return; else g_Worldg_CurBlock.x + i % 4g_CurBlock.y - i / 4 = 1; /檢查
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論