俄羅斯方塊C++課程設計報告樣本_第1頁
俄羅斯方塊C++課程設計報告樣本_第2頁
俄羅斯方塊C++課程設計報告樣本_第3頁
俄羅斯方塊C++課程設計報告樣本_第4頁
俄羅斯方塊C++課程設計報告樣本_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

課程設計報告題目:基于C++俄羅斯方塊 學院: 專業: 學號: 姓名:二○一三年十二月典型小游戲設計-俄羅斯方塊需求分析。1.1、游戲需求隨機給出不同形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定區域,若填滿一條便消掉,若在游戲中各形狀填滿了給定區域,為輸者,彈出相應提示。1.2、游戲界面需求良好顧客界面,關于信息顯示(如操作辦法、級別等)。讓方塊在一定區域內運動和變形,該區域用一種顏色表白,即用一種顏色作為背景,本游戲背景設為黑色。還需用另一種顏色把黑色圍起來,寬度適中,要實現美感。而不同方塊用不同著色表達,使游戲界面更加清晰、有條理。消層時采用一定期間延遲,增長視覺消行感官效果。1.3、游戲方塊需求良好方塊形狀設計,繪制七種常用基本圖形(長條形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及此外本程序此外加入點形方塊,各個方塊要能實現它變形,可設為順時針或逆時針變形,普通為逆時針。為體現游戲趣味性和擴展性,本游戲象征性增長了點形方塊,其她更多形狀方塊可用類似辦法增長。1.4、游戲控制需求游戲控分為各種方面,涉及畫面繪制,控制命令獲取,控制命令分派、控制命令解決,方塊繪制,方塊移動,方塊旋轉,方塊下落和消層以及計分等。對各個命令合理解決和綜合控制十分重要,一旦出錯也許導致整個程序崩潰,因而需要小心設計。系統設計。2.1、程序流程圖:2.2、游戲設計概述從整體上而言,在該游戲可設計一種方塊類,其中涉及對方塊信息描述(如:ID)、方塊操作(如:旋轉、下沉)。再設計一種控制類,實現各種控制(如:獲取控制信號,分發控制信號)。另定義一種游戲區類,用以解決游戲區繪制等內容。框圖如下:方塊類(GAME_BLOCK)游戲區類(Window)Private:BLOCKINFOg_CurBlock;(新方塊)BLOCKINFOg_NextBlock;(下一方塊)Private:無Public:VoidInitWindow()Public:GAME_BLOCK(){}~GAME_BLOCK(){}voidNewBlock();//生成方塊boolCheckBlock(BLOCKINFO_block);//檢測方塊能否放下voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);voidOnRotate();//旋轉方塊voidOnLeft();//左移方塊voidOnRight();//右移方塊voidOnDown();//下移方塊voidOnSink(CGAME&);//沉底方塊BLOCKINFO&CurBlock();BLOCKINFO&NextBlock();游戲控制類(CGame)Private:VoidDispatchControl(CTRL);Public:voidInitGame();//初始化游戲VoidStart_Game();//開始游戲voidGame_Over();//游戲結束voidNewGame();//新游戲voidQuit_Game();//退出游戲CTRLGetControl(bool_onlyresettimer=false);//獲取控制命令在主函數中(按照2.1中框圖),先通過控制類初始化游戲,再通過隨機時間函數獲得一種隨機數,該隨機數擬定一種方塊,即用該隨機數產生一種ID從而擬定產生為方塊。然后從鍵盤獲得各種操作信號,通過控類函數對操作信號進行分發、解決,進而控制方塊行為變化。與此同步,監控游戲區中已有方塊狀態,一旦滿足消行即進行消行控制,同步進行計分和級別劃分,而如果游戲區已滿則游戲結束,彈出提示。而對界面和方塊呈現重要通過第三方軟件EasyX實現,通過其畫圖位置變化與時間結合達到方塊視覺移動效果。2.3、定義方塊數據構造方塊是本游戲基本要素,對于方塊設計,本游戲用4*4矩陣畫出來,在相應位置置為‘1’和‘0’以實現各種方塊形狀,以“立L形”為例如下:0100010001100000 而在程序設計中則賦予各種基本方塊一種不同十六進制ID即可表達該方塊,如“立7形”其ID為[0x4460],再與其其她變形組合和著色分派即可得到各種L形ID集合{0x4460,0x02E0,0x0622,0x0740,MAGENTA};其她各種方塊類似設計。詳細清單如下:{ {0x0F00,0x4444,0x0F00,0x4444,RED}, //I {0x0660,0x0660,0x0660,0x0660,BLUE}, //口 {0x4460,0x02E0,0x0622,0x0740,CYAN}, //L藍綠色 {0x2260,0x0E20,0x0644,0x0470,GREEN}, //反L {0x0C60,0x2640,0x0C60,0x2640,BROWN}, //Z {0x0360,0x4620,0x0360,0x4620,YELLOW}, //反Z {0x4E00,0x4C40,0x0E40,0x4640,MAGENTA}}; //T品紅2.4、方塊變形方塊要實現變形,其實就是通過EasyX畫出不同圖形來實現,固然亂畫是不行,而為了控制其變形狀況,必要設定相應圖形描述,本程序使用是不同圖形不同ID碼表達辦法來實在方塊描述。能過鍵盤接受變形指令(即向上鍵),將所得信號傳遞給信號接受函數,再通過信號解決函數變化當前方塊ID值,最后依照新ID值畫出新圖形,此時即實在了方塊變形。2.5、定期解決機制為了提高游戲易控性和自動性,定期機制是很有必要。通過定期器設立后,這里通過運用控制程序跳到定期器時間解決函數去實現,當固定期間片間隔到達后,先檢測當前下墜物與否已經到達了底部,不是則進行下墜物向下移動一種單位操作,是則究竟后產生一種新“下一種下墜物”,并代替舊,將原先舊“下一種下墜物”用作當前激活狀態下正在使用下墜物,并對使用后某些狀態進行檢測:與否立即到達底部,使則進行銷行操作;與否在到達底部同步到達游戲區域頂部,從而鑒定游戲與否因違規而結束,彈出相應對話框供顧客選取與否繼續重新開始。圖3.2.2裝載方塊視圖類通過不同十六進制ID來記錄下墜物類型,共有七種形狀,并從7種方塊中隨機抽取圖形。而ID除了記錄下墜物類型外,還需記錄其當前變形狀態。在產生新下一種下墜物前,需要先將當前狀態物記錄和舊下一種下墜物保存下來,然后用隨機函數Random()產生一種最大值不不不大于指定值隨機正整數,將這個新生成正整數用作新“下一種下墜物”形狀值。三、核心代碼描述。#include<easyx.h>#include<conio.h>#include<time.h>///////////////////////////////////////////////定義常量、枚舉量、構造體、全局變量/////////////////////////////////////////////#define WIDTH 10 //游戲區寬度#define HEIGHT 22 //游戲區高度#define UNIT 20 //每個游戲區單位實際像素//定義操作類型enumCMD{ CMD_ROTATE, //方塊旋轉 CMD_LEFT,CMD_RIGHT,CMD_DOWN, //方塊左、右、下移動 CMD_SINK, //方塊沉底 CMD_QUIT //退出游戲};//定義繪制方塊辦法enumDRAW{ SHOW, //顯示方塊 CLEAR, //擦除方塊 FIX //固定方塊};//定義七種俄羅斯方塊structBLOCK{ WORDdir[4]; //方塊四個旋轉狀態 COLORREFcolor; //方塊顏色} g_Blocks[7]={ {0x0F00,0x4444,0x0F00,0x4444,RED}, //I {0x0660,0x0660,0x0660,0x0660,BLUE}, //口 {0x4460,0x02E0,0x0622,0x0740,CYAN}, //L藍綠色 {0x2260,0x0E20,0x0644,0x0470,GREEN}, //反L {0x0C60,0x2640,0x0C60,0x2640,BROWN}, //Z {0x0360,0x4620,0x0360,0x4620,YELLOW}, //反Z {0x4E00,0x4C40,0x0E40,0x4640,MAGENTA}}; //T品紅//定義當前方塊、下一種方塊信息structBLOCKINFO{ byteid; //方塊ID charx,y; //方塊在游戲區中坐標 bytedir:2; //方向} g_CurBlock,g_NextBlock;//定義游戲區BYTEg_World[WIDTH][HEIGHT]={0};///////////////////////////////////////////////函數聲明/////////////////////////////////////////////voidInit(); //初始化游戲voidQuit(); //退出游戲voidNewGame(); //開始新游戲voidGameOver(); //結束游戲CMDGetCmd(); //獲取控制命令voidDispatchCmd(CMD_cmd); //分發控制命令voidNewBlock(); //生成新方塊boolCheckBlock(BLOCKINFO_block); //檢測指定方塊與否可以放下voidDrawUnit(intx,inty,COLORREFc,DRAW_draw);//畫單元方塊voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);//畫方塊voidOnRotate(); //旋轉方塊voidOnLeft(); //左移方塊voidOnRight(); //右移方塊voidOnDown(); //下移方塊voidOnSink(); //沉底方塊staticintscore=0;///////////////////////////////////////////////函數定義///////////////////////////////////////////////主函數voidmain(){ Init(); CMDc; while(true) { c=GetCmd(); DispatchCmd(c); //按退出時,顯示對話框征詢顧客與否退出 if(c==CMD_QUIT) { HWNDwnd=GetHWnd(); if(MessageBox(wnd,_T("您要退出游戲嗎?"),_T("提示"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK) Quit(); } }}//初始化游戲voidInit(){ initgraph(640,480); srand((unsigned)time(NULL)); setbkmode(TRANSPARENT); //設立圖案填充背景色為透明 //顯示操作闡明 settextstyle(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)); //設立坐標原點 setorigin(220,20); //繪制游戲區邊界 rectangle(-1,-1,WIDTH*UNIT,HEIGHT*UNIT); rectangle((WIDTH+1)*UNIT-1,-1,(WIDTH+5)*UNIT,4*UNIT); //開始新游戲 NewGame();}//退出游戲voidQuit(){ closegraph(); exit(0);}//開始新游戲voidNewGame(){ //清空游戲區 setfillcolor(BLACK); solidrectangle(0,0,WIDTH*UNIT-1,HEIGHT*UNIT-1); ZeroMemory(g_World,WIDTH*HEIGHT); //生成下一種方塊 g_NextBlock.id=rand()%7; g_NextBlock.dir=rand()%4; g_NextBlock.x=WIDTH+1; g_NextBlock.y=HEIGHT-1; //獲取新方塊 NewBlock();}//結束游戲voidGameOver(){ HWNDwnd=GetHWnd(); if(MessageBox(wnd,_T("游戲結束。\n想重新來一局嗎?"),_T("游戲結束"),MB_YESNO|MB_ICONQUESTION)==IDYES) NewGame(); else Quit();}//獲取控制命令DWORDm_oldtime;CMDGetCmd(){ //獲取控制值 while(true) { //如果超時,自動下落一格 DWORDnewtime=GetTickCount(); if(newtime-m_oldtime>=500) { m_oldtime=newtime; returnCMD_DOWN; } //如果有按鍵,返回按鍵相應功能 if(kbhit()) { switch(getch()) { case'w': case'W': returnCMD_ROTATE; case'a': case'A': returnCMD_LEFT; case'd': case'D': returnCMD_RIGHT; case's': case'S': returnCMD_DOWN; case27: returnCMD_QUIT; case'': returnCMD_SINK; case0: case0xE0: switch(getch()) { case72: returnCMD_ROTATE; case75: returnCMD_LEFT; case77: returnCMD_RIGHT; case80: returnCMD_DOWN; } } } //延時(減少CPU占用率) Sleep(20); }}//分發控制命令voidDispatchCmd(CMD_cmd){ switch(_cmd) { caseCMD_ROTATE: OnRotate(); break; caseCMD_LEFT: OnLeft(); break; caseCMD_RIGHT: OnRight(); break; caseCMD_DOWN: OnDown(); break; caseCMD_SINK: OnSink(); break; caseCMD_QUIT: break; }}//生成新方塊voidNewBlock(){ g_CurBlock.id=g_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; //下移新方塊直到有局部顯示 WORDc=g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir]; while((c&0xF)==0) { g_CurBlock.y--; c>>=4; } //繪制新方塊 DrawBlock(g_CurBlock); //繪制下一種方塊 setfillcolor(BLACK); solidrectangle((WIDTH+1)*UNIT,0,(WIDTH+5)*UNIT-1,4*UNIT-1); DrawBlock(g_NextBlock); //設立計時器,用于判斷自動下落 m_oldtime=GetTickCount();}//畫單元方塊voidDrawUnit(intx,inty,COLORREFc,DRAW_draw){ //計算單元方塊相應屏幕坐標 intleft=x*UNIT; inttop=(HEIGHT-y-1)*UNIT; intright=(x+1)*UNIT-1; intbottom=(HEIGHT-y)*UNIT-1; //畫單元方塊 switch(_draw) { caseSHOW: //畫普通方塊 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); fillrectangle(left+2,top+2,right-2,bottom-2); break; caseFIX: //畫固定方塊 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; caseCLEAR: //擦除方塊 setfillcolor(BLACK); solidrectangle(x*UNIT,(HEIGHT-y-1)*UNIT,(x+1)*UNIT-1,(HEIGHT-y)*UNIT-1); break; }}//畫方塊voidDrawBlock(BLOCKINFO_block,DRAW_draw){ WORDb=g_Blocks[_block.id].dir[_block.dir]; intx,y; for(inti=0;i<16;i++,b<<=1) if(b&0x8000) { x=_block.x+i%4; y=_block.y-i/4; if(y<HEIGHT) DrawUnit(x,y,g_Blocks[_block.id].color,_draw); }}//檢測指定方塊與否可以放下boolCheckBlock(BLOCKINFO_block){ WORDb=g_Blocks[_block.id].dir[_block.dir]; intx,y; for(inti=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)) returnfalse; if((y<HEIGHT)&&(g_World[x][y])) returnfalse; } returntrue;}//旋轉方塊voidOnRotate(){ //獲取可以旋轉x偏移量 intdx; BLOCKINFOtmp=g_CurBlock; tmp.dir++; if(CheckBlock(tmp)){ dx=0; gotorotate; } tmp.x=g_CurBlock.x-1;if(CheckBlock(tmp)){ dx=-1;gotorotate; } tmp.x=g_CurBlock.x+1;if(CheckBlock(tmp)){ dx=1; gotorotate; } tmp.x=g_CurBlock.x-2;if(CheckBlock(tmp)){ dx=-2;gotorotate; } tmp.x=g_CurBlock.x+2;if(CheckBlock(tmp)){ dx=2; gotorotate; } return;rotate: //旋轉 DrawBlock(g_CurBlock,CLEAR); g_CurBlock.dir++; g_CurBlock.x+=dx; DrawBlock(g_CurBlock);}//左移方塊voidOnLeft(){ BLOCKINFOtmp=g_CurBlock; tmp.x--; if(CheckBlock(tmp)) { DrawBlock(g_CurBlock,CLEAR); g_CurBlock.x--; DrawBlock(g_CurBlock); }}//右移方塊voidOnRight(){ BLOCKINFOtmp=g_CurBlock; tmp.x++; if(CheckBlock(tmp)) { DrawBlock(g_CurBlock,CLEAR); g_CurBlock.x++; DrawBlock(g_CurBlock); }}//下移方塊voidOnDown(){ BLOCKINFOtmp=g_CurBlock; tmp.y--; if(CheckBlock(tmp)) { DrawBlock(g_CurBlock,CLEAR); g_CurBlock.y--; DrawBlock(g_CurBlock); } else OnSink(); //不可下移時,執行“沉底方塊”操作}//沉底方塊voidOnSink(){ inti,x,y; //持續下移方塊 DrawBlock(g_CurBlock,CLEAR); BLOCKINFOtmp=g_CurBlock; tmp.y--; while(CheckBlock(tmp)) { g_CurBlock.y--; tmp.y--; } DrawBlock(g_CurBlock,FIX); //固定方塊在游戲區 WORDb=g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir]; for(i=0;i<16;i++,b<<=1) if(b&0x8000) { if(g_CurBlock.y-i/4>=HEIGHT) { //如果方塊固定位置超過高度,結束游戲 GameOver(); return; } else g_World[g_CurBlock.x+i%4][g_CurBlock.y-i/4]=1; } //檢查與否需要消掉行,并標記 BYTEremove=0; //低4位用來標記方塊涉及4行與否有消除行為 for(y=g_CurBlock.y;y>=max(g_CurBlock.y-3,0);y--) { i=0;

溫馨提示

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

評論

0/150

提交評論