俄羅斯方塊C課程設(shè)計報告_第1頁
俄羅斯方塊C課程設(shè)計報告_第2頁
俄羅斯方塊C課程設(shè)計報告_第3頁
俄羅斯方塊C課程設(shè)計報告_第4頁
俄羅斯方塊C課程設(shè)計報告_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、課程設(shè)計報告題目:基于C+我羅斯方塊學專學姓院:業(yè):號:名:二.一三年十二月經(jīng)典小游戲設(shè)計-俄羅斯方塊一、需求分析.1.1、游戲需求隨機給出不同的形狀長條形、Z字形、反Z形、田字形、7字形、反7形、T 字型下落填充給定的區(qū)域,假設(shè)填滿一條便消掉,假設(shè)在游戲中各形狀填滿了給定區(qū)域, 為輸者,彈出相應提示.1.2、游戲界面需求良好的用戶界面,有關(guān)信息顯示如操作方法、等級等.讓方塊在一定的區(qū)域 內(nèi)運動和變形,該區(qū)域用一種顏色說明,即用一種顏色作為背景,本游戲的背景設(shè)為黑 色.還需用另一種顏色把黑色圍起來,寬度適中,要實現(xiàn)美感.而不同的方塊用不同 的著色表示,使游戲界面更加活晰、有條理.消層時采用一定

2、的時間延遲,增加視覺 消行的感官效果.1.3、游戲方塊需求良好的方塊形狀設(shè)計,繪制七種常見的根本圖形長條形、Z字形、反Z形、田字形、L字形、反L形、T字型以及另外本程序另外參加的點形方塊,各個方塊要 能實現(xiàn)它的變形,可設(shè)為順時針或逆 時針變形,一般為逆時針.為表達游戲的趣味 性和擴展性,本游戲象征性的增加了點形方塊,其他更多形狀的方塊可用類似方法增 加.1.4、游戲限制的需求游戲控分為多個方面,包括畫面繪制,限制命令的獲取,限制命令的分配、限制 命令的處理,方塊的繪制,方塊的移動,方塊的旋轉(zhuǎn),方塊下落和消層以及計分等. 對各個命令的合理處理和綜合限制十分重要, 一旦出錯可能導致整個程序的崩潰,

3、因 此需要小心設(shè)計.二、系統(tǒng)設(shè)計.2.1、程序流程圖:2.2、游戲設(shè)計概述從整體上而言,在該游戲可設(shè)計一個方塊類,其中包括對方塊的信息描述如ID、方塊的操作如:旋轉(zhuǎn)、下沉.再設(shè)計一個限制類,實現(xiàn)各種限制如:獲取 限制信號,分發(fā)限制信號.另定義一個游戲區(qū)類,用以處理游戲區(qū)繪制等內(nèi)容.框 圖如下:方塊類GAME_BLOCK游戲區(qū)類WindowPrivate:BLOCKINFO g_CurBlock;Private:無(新方塊)BLOCKINFO g_NextBlock;(下一方塊)Public:Void InitWindow()Public:GAME_BLOCK ()GAME_BLOCK ()vo

4、id NewBlock();/生成萬塊bool CheckBlock(BLOCKINFO_block);/ 檢測方塊能否放下 void DrawBlock(BLOCKINFO _block,DRAW_draw=SHOW);void OnRotate();/旋轉(zhuǎn)方塊void OnLeft();/左移方塊void OnRight();/右移方塊void OnDown();/下移方塊void OnSink(CGAME &);/ 沉底方塊BLOCKINFO &CurBlock();BLOCKINFO &NextBlock();游戲限制類CGamePrivate:VoidDisp

5、atchControl(CTRL);Public:void InitGame();/初始化游戲Void Start_Game();/ 開始游戲void Game_Over();/ 游戲結(jié)束void NewGame();/ 新游戲void Quit_Game();/ 退出游戲CTRL GetControl(bool_onlyresettimer = false);/獲取限制命令在主函數(shù)中根據(jù)2.1中框圖,先通過限制類初始化游戲,再通過隨機時間函數(shù)獲得一個隨機數(shù),該隨機數(shù)確定一個方塊,即用該隨機數(shù)產(chǎn)生一個ID從而確定產(chǎn)生的為方塊.然后從鍵盤取得各種操作信號,通過控類函數(shù)對操作信號進行分發(fā)、 處 理

6、,進而限制方塊的行為改變.與此同時,監(jiān)控游戲區(qū)中已有方塊的狀態(tài),一旦滿足 消行即進行消行限制,同時進行計分和等級劃分,而如果游戲區(qū)已滿那么游戲結(jié)束,彈 出提示.而對界面和方塊的展現(xiàn)主要通過第三方軟件 EasyX實現(xiàn),通過其畫圖位置的 改變與時間的結(jié)合到達方塊視覺移動的效果.2.3、定義方塊的數(shù)據(jù)結(jié)構(gòu)方塊是本游戲的根本要素,對丁方塊的設(shè)計,本游戲用4*4的矩陣畫出來,在相應的位置置為1'和0以實現(xiàn)各種方塊的形狀,以“立 L形為例如下:0100010001100000而在程序設(shè)計中那么賦予各種根本方塊一個不同的十六進制ID即可表示該方塊,如“立7形其ID為0x4460,再與其其他變形組合和

7、著色分配即可得到各種L形ID的集合 0x4460, 0X02E0, 0x0622, 0x0740 , MAGENTA其他各種方塊類似設(shè)計. 具體活單如下:0x0F00, 0x4444, 0x0F00, 0x4444, RED,/ I0x0660, 0x0660, 0x0660, 0x0660, BLUE,/ 口0x4460, 0x02E0, 0x0622, 0x0740, CYAN, / L藍綠色0x2260, 0x0E20, 0x0644, 0x0470, GREEN,反L0x0C60, 0x2640, 0x0C60, 0x2640, BROWN,/ Z0x0360, 0x4620, 0x0

8、360, 0x4620, YELLOW,反Z0x4E00, 0x4C40, 0x0E40, 0x4640, MAGENTA; / T 品紅2.4、方塊的變形方塊要實現(xiàn)變形,其實就是通過EasyX畫出不同的圖形來實現(xiàn)的,當然亂畫是不 行的,而為了限制其變形的情況,必須設(shè)定相應的圖形描述,本程序使用的是不同圖 形的不同ID碼表示的方法來實在方塊的描述的.能過鍵盤接收變形指令即向上鍵, 將所得信號傳遞給信號接收函數(shù),再通過信號處理函數(shù)改變當前方塊的ID值,最后根據(jù)新的ID值畫出新的圖形,此時即實在了方塊的變形.2.5、定時處理機制為了提升游戲的易控性和自動性,定時機制是很有必要的.經(jīng)過定時器的設(shè)置后

9、, 這里通過利用限制程序跳到定時器的時間的處理函數(shù)去實現(xiàn), 當固定時間片間隔到達 后,先檢測當前下墜物是否已經(jīng)到達了底部, 不是那么進行下墜物向下移動一個單位的操作,是那么到底后產(chǎn)生一個新的 下一個下墜物,并代替舊的,將原先舊的 下一個 下墜物用作當前激活狀態(tài)下正在使用的下墜物,并對使用后的一些狀態(tài)進行檢測: 是否馬上到達底部,使那么進行銷行操作;是否在到達底部的同時到達游戲區(qū)域的頂部, 從而判定游戲是否因違規(guī)而結(jié)束,彈出相應對話框供用戶選擇是否繼續(xù)重新開始.圖3.2.2裝載方塊視圖類通過不同十六進制ID來記錄下墜物的類型,共有七種形狀,并從7種方 塊中隨機抽取圖形.而ID除了記錄下墜物的類型

10、外,還需記錄其當前的變形狀態(tài).在產(chǎn)生新的下一個下墜物前,需要先將當前狀態(tài)物的記錄和舊的下一個下墜物保 存下來,然后用隨機函數(shù) Random()產(chǎn)生一個最大值不大丁指定值的隨機正整數(shù),將 這個新生成的正整數(shù)用作新的下一個下墜物的形狀值.三、關(guān)鍵代碼描述#include <easyx.h>#include <conio.h>#include <time.h>/全局變量/定義常量、枚舉量、結(jié)構(gòu)體、/#define WIDTH10/游戲區(qū)寬度#define HEIGHT22/游戲區(qū)局度#define UNIT20/每個游戲區(qū)單位的實際像素/定義操作類型enum CM

11、D/CMD_ROTATE,CMD_LEFT, CMD_RIGHT, CMD_DOWN/CMD_SINK,/CMD QUIT/方塊旋轉(zhuǎn)方塊左、右、下移動方塊沉底退出游戲;/定義繪制方塊的方法enum DRAWSHOW,/顯示方塊CLEAR,/擦除方塊FIX/固定萬塊;/定義七種俄羅斯方塊struct BLOCK(/WORD dir4;/方塊的四個旋轉(zhuǎn)狀態(tài)COLORREF color; / 方塊的顏色g_Blocks7 = 0X0F00, 0x4444, 0x0F00, 0x4444, RED,0x0660, 0x0660, 0x0660, 0x0660, BLUE,0x4460, 0x02E0,

12、 0x0622, 0x0740, CYAN, 0x2260, 0x0E20, 0x0644, 0x0470, GREEN, 0x0C60, 0x2640, 0x0C60, 0x2640, BROWN, 0x0360, 0x4620, 0x0360, 0x4620, YELLOW,0x4E00, 0x4C40, 0x0E40, 0x4640, MAGENTA; / T定義當前方塊、下一個方塊的信息/ L/ I/ Z/口藍綠色反L反Z品紅struct BLOCKINFObyte id;char x, y;byte dir:2; /方塊ID方塊在游戲區(qū)中的坐標 方向g_CurBlock, g_Nex

13、tBlock;定義游戲區(qū)/BYTE g_WorldWIDTHHEIGHT = 0;/函數(shù)聲明/void Init();/初始化游戲void Quit();/退出游戲void NewGame();/開始新游戲void GameOver();/結(jié)束游戲CMD GetCmd();/獲取限制命令void DispatchCmd(CMD _cmd);/分發(fā)限制命令void NewBlock();/生成新的方塊bool CheckBlock(BLOCKINFO _block);/檢測指定方塊是否可以放下void DrawUnit(int x, int y, COLORREF c, DRAW _draw);

14、/圓單兀方塊void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW);/畫方塊void OnRotate();/旋轉(zhuǎn)方塊void OnLeft();/左移方塊void OnRight();/右移方塊void OnDown();/下移方塊void OnSink();/沉底方塊static int score=0;/函數(shù)定義/主函數(shù)void main()(Init();CMD c;while(true)(c = GetCmd();DispatchCmd(c);/按退出時,顯示對話框咨詢用戶是否退出if (c = CMD_QUIT)(HWND wnd =

15、 GetHWnd();if (MessageBox(wnd, _T("您要退出游戲嗎?"), _T("提醒"),MB_OKCANCE LMB_ICONQUESTION) = IDOK)Quit();/初始化游戲(initgraph(640, 480);srand(unsigned)time(NULL);setbkmode(TRANSPARENT);/設(shè)置圖案填充的背景色為透明/顯示操作說明settextstyle(14, 0, _T(" 宋體");outtextxy(20, 330, _T("操作說明:");out

16、textxy(20, 350, _T("上:旋轉(zhuǎn)");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);/設(shè)置坐標原點setorigin(220, 20);/繪制游戲

17、區(qū)邊界rectangle(-1, -1, WIDTH * UNIT, HEIGHT * UNIT);rectangle(WIDTH + 1) * UNIT - 1, -1, (WIDTH + 5) * UNIT, 4 * UNIT);/開始新游戲NewGame();/退出游戲void Quit()(closegraph();exit(0);/開始新游戲void NewGame()(/清空游戲區(qū)setfillcolor(BLACK);solidrectangle(0, 0, WIDTH * UNIT - 1, HEIGHT * UNIT - 1);ZeroMemory(g_World, WIDT

18、H * HEIGHT);/生成下一個方塊g_NextBlock.id = rand() % 7;g_NextBlock.dir = rand() % 4;g_NextBlock.x = WIDTH + 1;g_NextBlock.y = HEIGHT - 1;/獲取新方塊NewBlock();/結(jié)束游戲void GameOver()(),HWND wnd = GetHWnd();if (MessageBox(wnd, _T(" 游戲結(jié)束.n想重新來一局嗎?"), _T(" 游戲結(jié)束MB_YESNO | MB_ICONQUESTION) = IDYES)NewGam

19、e();elseQuit();/獲取限制命令DWORD m_oldtime;CMD GetCmd()(/獲取限制值 while(true)(/如果超時,自動下落一格DWORD newtime = GetTickCount(); if (newtime - m_oldtime >= 500) (m_oldtime = newtime; return CMD_DOWN;/如果有按鍵,返回按鍵對應的功能 if (kbhit()(switch(getch()(case 'w':case 'W':return CMD_ROTATE;case 'a':

20、case 'A':return CMD_LEFT;case 'd':case 'D':return CMD_RIGHT;case 's':case 'S':return CMD_DOWN;case 27:return CMD_QUIT;case ' ':return CMD_SINK;case 0:case 0xE0:switch(getch() (case 72:return CMD_ROTATE;case 75:return CMD_LEFT;case 77:returnCMD_RIGHT;ca

21、se 80:returnCMD_DOWN;/延時(降低CPU占用率) Sleep(20);/分發(fā)限制命令void DispatchCmd(CMD _cmd)switch(_cmd)case CMD_ROTATE:OnRotate();break;case CMD_LEFT:OnLeft();break;case CMD_RIGHT:OnRight();break;case CMD_DOWN:OnDown();break;case CMD_SINK:OnSink();break;case CMD_QUIT:break;/生成新的方塊void NewBlock()g_CurBlock.id = g

22、_NextBlock.id,g_NextBlock.id = rand() % 7;g_CurBlock.dir = g_NextBlock.dir,g_NextBlock.dir = rand() % 4;g_CurBlock.x = (WIDTH - 4) / 2;g_CurBlock.y = HEIGHT + 2;/下移新方塊直到有局部顯不'WORD c = g_Blocksg_CurBlock.id.dirg_CurBlock.dir;while(c & 0xF) = 0)g_CurBlock.y-;c >>= 4;/繪制新方塊DrawBlock(g_Cur

23、Block);/繪制下一個方塊setfillcolor(BLACK);solidrectangle(WIDTH + 1) * UNIT, 0, (WIDTH + 5) * UNIT - 1,4 * UNIT - 1);DrawBlock(g_NextBlock);/設(shè)置計時器,用于判斷自動下落m_oldtime = GetTickCount();/畫單元方塊void DrawUnit(int x, int y, COLORREF c, DRAW _draw)(/計算單元方塊對應的屏幕坐標int left = x * UNIT;int top = (HEIGHT - y - 1) * UNIT;

24、int right = (x + 1) * UNIT - 1;int bottom = (HEIGHT - y) * UNIT - 1;/ 畫單元方塊switch(_draw)(case SHOW:/畫普通方塊setlinecolor(0x006060);roundrect(left + 1, top + 1, right - 1, bottom - 1,5, 5);setlinecolor(0x003030);roundrect(left, top, right, bottom, 8, 8);setfillcolor(c);setlinecolor(LIGHTGRAY);fillrectan

25、gle(left + 2, top + 2, right - 2, bottom - 2);break;case FIX:/ 畫固定的方塊setfillcolor(RGB(GetRValue(c) * 2 / 3, GetGValue(c) * 2 / 3, GetBValue(c) * 2 / 3);setlinecolor(DARKGRAY);fillrectangle(left + 1, top + 1, right - 1, bottom - 1);break;case CLEAR:/擦除方塊setfillcolor(BLACK);solidrectangle(x * UNIT, (H

26、EIGHT - y - 1) * UNIT, (x + 1) * 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(int i = 0; i < 16; i+, b <<= 1)if (b & 0x8000)(x = _block.x + i % 4;y = _block.y - i / 4;if (y < HEIGHT)Dra

27、wUnit(x, y, g_Blocks_block.id.color, _draw); /檢測指定方塊是否可以放下bool CheckBlock(BLOCKINFO _block)(WORD b = g_Blocks_block.id.dir_block.dir; int x, y;for(int i = 0; i < 16; i+, b <<= 1)if (b & 0x8000)(x = _block.x + i % 4;y = _block.y - i / 4;if (x < 0) | (x >= WIDTH) | (y < 0) return

28、 false;if (y < HEIGHT) && (g_Worldxy) return false; return true;/旋轉(zhuǎn)方塊void OnRotate()(/獲取可以旋轉(zhuǎn)的x偏移量int dx;BLOCKINFO tmp = g_CurBlock;dx = 0; goto rotate; dx = -1;goto rotate; dx = 1; goto rotate;dx = -2;goto rotate; dx = 2; goto rotate;tmp.dir+;if (CheckBlock(tmp)(tmp.x = g_CurBlock.x - 1;i

29、f (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:/旋轉(zhuǎn)DrawBlock(g_CurBlock, CLEAR); g_CurBlock.dir+;g_CurBlock.x += dx;DrawBlock(g_CurBlock);/左移方塊void OnLeft()(BLOCKINFO tmp = g_Cu

30、rBlock;tmp.x-;if (CheckBlock(tmp)(DrawBlock(g_CurBlock, CLEAR);g_CurBlock.x-;DrawBlock(g_CurBlock);/右移方塊void OnRight()(BLOCKINFO tmp = g_CurBlock;tmp.x+;if (CheckBlock(tmp)(DrawBlock(g_CurBlock, CLEAR);g_CurBlock.x+;DrawBlock(g_CurBlock);/下移方塊void OnDown()(BLOCKINFO tmp = g_CurBlock;tmp.y-;if (Check

31、Block(tmp)(DrawBlock(g_CurBlock, CLEAR);g_CurBlock.y-;DrawBlock(g_CurBlock);elseOnSink(); /不可下移時,執(zhí)行“沉底方塊操作/沉底方塊void OnSink()(int i, x, y;/連續(xù)下移方塊DrawBlock(g_CurBlock, CLEAR);BLOCKINFO tmp = g_CurBlock; tmp.y-;while (CheckBlock(tmp) g_CurBlock.y-;tmp.y-;DrawBlock(g_CurBlock, FIX);/固定方塊在游戲區(qū)WORD b = g_B

32、locksg_CurBlock.id.dirg_CurBlock.dir; for(i = 0; i < 16; i+, b <<= 1) if (b & 0x8000) if (g_CurBlock.y - i / 4 >= HEIGHT)/如果方塊的固定位置超出高度,結(jié)束游戲GameOver();return;elseg_Worldg_CurBlock.x + i % 4g_CurBlock.y - i / 4 = 1; /檢查是否需要消掉行,并標記BYTE remove = 0; 低4位用來標記方塊涉及的4行是否有消除行為for(y = g_CurBlock.y; y >= max(g_CurBlock.y - 3, 0); y-) i = 0;for(x = 0; x < WIDT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論