




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1. 系統概述 12. 設計說明書 43. 系統操作界面 64. 源程序編碼 75. 測試計劃 366. 改進意見397 課程設計心得體會 408.參考書籍、資料 40系統概述1.1 現狀分析在個人電腦日益普及的今天,一些有趣的桌面游戲已經成為人們在使用計 算機進行工作或學習之余休閑娛樂的首選,而俄羅斯方塊游戲是人們最熟 悉的小游戲之一,它以其趣味性強,易上手等諸多特點得到了大眾的認可, 因此開發此游戲軟件可滿足人們的一些娛樂的需求。此俄羅斯方塊游戲可以為用戶提供一個可在普通個人電腦上運行的,界面 美觀的,易于控制的俄羅斯方塊游戲。1.2 項目要求 俄羅斯方塊游戲是一款適合大眾的游戲軟件,它適
2、合不同年齡的人玩。本軟件 要實現的功能如下:( 1)游戲區 :玩家可以在游戲區中堆積方塊,并能夠在游戲過程中隨時了解 得分情況。( 2)游戲控制: 玩家可以通過游戲控制功能來選擇開始新的一局游戲,暫 ?;蛲顺鲇螒?。( 3) 級別設置 :玩家可以根據自己的需要自行設定游戲的開始級別,級別 越高,游戲的速度越快,難度越大。(4)1.3 系統功能模塊示意圖項目開發計劃書項目開發計劃書名稱時間工作內容下達設計任務1天(集中)說明如何著手設計的方法和設計任務的解 釋說明。收集、分析資料及 文檔2天項目組在項目經理的組織下選題、分析, 識別實體,完成項目開發計劃書及小 組人員分工。設計2天各項目組完成系統
3、層次圖、用戶界面設計、 數據庫表設計、報表設計,元成設計說 明書程序編寫和測試7天根據方案進行現場編程、調試。編寫設計文檔2天完成軟件測試以及用戶操作手冊的編 寫。文檔提交、答辯1天各小組提交文檔,教師根據情況選擇是否 答辯及答辯方式(抽樣答辯或全員答辯)。設計說明1.1游戲區模塊1.2控制區模塊1.3系統流程圖(2)游戲控制模塊(開始,暫停繼續,提高等級,降低等級,停止,新游戲,幫助)系統操作界面游戲打開界面回鬲矗慕歹斯方塊苦戲游戲進行中界面自犠羅斯方塊卻E源代碼編碼#i nclude #in elude #in elude #in elude vgraphics.h #i nclude #
4、i nclude #define true1#define false0#defi ne BoardWidth12#defi ne BoardHeight 23 #define _INNER_HELPERinner helper method */ /*Scan Codes Define*/en umKEYCODESK_ESC=0x011b.K_UP=0x4800,/* upward arrow */K_LEFT=0x4b00,K_DOWN=0x5000,K_RIGHT=0x4d00,K_SPACE=0x3920,K_P=0x1970;/* the data structure of the
5、block */ typedef struct tagBlock char c44; /* cell fill info array, 0-empty, 1-filled */int x;/* block positioncx 0,BoardWidht -1*/int y;/* block positioncy -4,BoardHeight-1*/char color;/* block color */char size;/* block max size inwidth or height */char name;/* block name (the blocks shape) */ Blo
6、ck;/* games global info */intFrameTime= 1300;intCellSize=18;intBoardLeft=30;intBoardTop=30;/* next block grid */intNBBoardLeft=300;intNBBoardTop=30;intNBCellSize=10;/* score board position */int ScoreBoardLeft= 300;int ScoreBoardTop=100;int ScoreBoardWidth=200;int ScoreBoardHeight=35;int ScoreColor=
7、LIGHTCYAN;/* infor text postion */int InfoLeft=300;int InfoTop=200;int InfoColor=YELLOW;int BorderColor=DARKGRAY;int BkGndColor=BLACK;int GameRunning=true;int TopLine=BoardHeight-1; /* top empty line */int TotalScore=100;char info_score20;char info_help255;char info_common255;/* our board, Boardxy0-
8、isFilled,Boardxy1-fillColor*/unsigned char BoardBoardWidthBoardHeight2;block */char BufferCells44; /* used to judge if can rotateBlock curBlock;Block nextBlock; /*/* current moving block */ next Block to appear */ /* function list */int GetKeyCode();int CanMove(int dx,int dy);int CanRotate();int Rot
9、ateBlock(Block *block);int MoveBlock(Block *block,int dx,int dy); void DrawBlock(Block *block,int,int,int); void EraseBlock(Block *block,int,int,int);void DisplayScore();void DisplayInfo(char* text);void GenerateBlock(Block *block);void NextBlock();void InitGame();int PauseGame();void QuitGame();/*G
10、et Key Code */int _INNER_HELPEGRetKeyCode()int key=0;if(bioskey(1)key=bioskey(0);return key;/* display text! */void _INNER_HELPEDRisplayInfo(char *text) setcolor(BkGndColor); outtextxy(InfoLeft,InfoTop,info_common); strcpy(info_common,text); setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common
11、);/* create a new block by key number,* the block anchor to the top-left corner of 4*4 cells*/ void _INNER_HELPEGRenerateBlock(Block *block)int key=(random(13)*random(17)+random(1000)+random(3000)%7; block-size=3;/* because most blocks size=3 */ memset(block-c,0,16);switch(key)case 0:block-name=T;bl
12、ock-color=RED;block-c10=1;block-c11=1, block-c21=1;block-c12=1;break;case 1:block-name=L;block-color=YELLOW;block-c10=1;block-c11=1;block-c12=1, block-c22=1;break;case 2:block-name=J;block-color=LIGHTGRAY;block-c10=1;block-c11=1;block-c12=1, block-c02=1;break;case 3:block-name=z;block-color=CYAN;blo
13、ck-c00=1, block-c10=1;block-c11=1, block-c21=1;break;case 4:block-name=5;block-color=LIGHTBLUE;block-c10=1, block-c20=1;block-c01=1, block-c11=1;break;case 5:block-name=o;block-color=BLUE;block-size=2;block-c00=1, block-c10=1; block-c01=1, block-c11=1; break;case 6: block-name=I; block-color=GREEN;
14、block-size=4; block-c10=1; block-c11=1; block-c12=1; block-c13=1; break;/* get next block! */ void NextBlock()/* copy the nextBlock to curBlock */ curBlock.size=nextBlock.size; curBlock.color=nextBlock.color; curBlock.x=(BoardWidth-4)/2; curBlock.y=-curBlock.size; memcpy(curBlock.c,nextBlock.c,16);/
15、* generate nextBlock and show it */ EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize); GenerateBlock(&nextBlock);nextBlock.x=1,nextBlock.y=0; DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);/* rotate the block, update the block struct data */blockSize)c22=c02,c21=c12,int _INNER_HELPER
16、otateCells(char c44,char char temp,i,j;switch(blockSize)case 3:temp=c00;c00=c20, c20=c22, c02=temp;temp=c01;c01=c10, c10=c21,c12=temp;break;case 4: /* only I c10=1-c10, c01=1-c01, c31;break;block arived here! */c12=1-c12,c21=1-c21,c13=1-c13;c31=1-/* judge if the block can move toward the direction *
17、/ int CanMove(int dx,int dy)int i,j,tempX,tempY;for(i=0;icurBlock.size;i+)for(j=0;jcurBlock.size;j+)if(curBlock.cij)/* cannot move leftward or rightward */ tempX = curBlock.x + i + dx;if(tempX(BoardWidth-1) return false;/* make sure x is valid! */* cannot move downward */return false; /* y is*/we mu
18、st check Ys uppertempY = curBlock.y + j + dy; if(tempY(BoardHeight-1) only checked lower bound, maybe negative!/* the cell already filled,bound before check cell*/if(tempY=0 & BoardtempXtempY0)return false;return true;/* judge if the block can rotate */int CanRotate()int i,j,tempX,tempY;/* update bu
19、ffer */memcpy(BufferCells, curBlock.c, 16); RotateCells(BufferCells,curBlock.size);for(i=0;icurBlock.size;i+)for(j=0;jcurBlock.size;j+)if(BufferCellsij)tempX=curBlock.x+i;tempY=curBlock.y+j;if(tempX(BoardWidth-1)return false;if(tempY(BoardHeight-1)return false;if(tempY=0 & BoardtempXtempY0)return fa
20、lse;return true;/* draw the block */bdTop,intvoid _INNER_HELPERDrawBlock(Block *block,int bdLeft,intcellSize)int i,j;setfillstyle(SOLID_FILL,block-color);for(i=0;isize;i+)for(j=0;jsize;j+)if(block-cij & (block-y+j)=0)floodfill(bdLeft+cellSize*(i+block-x)+cellSize/2,bdTop+cellSize*(j+block-y)+cellSiz
21、e/2,BorderColor);/* Rotate the block, if success, return true */int RotateBlock(Block *block)char temp,i,j;int b_success;if(block-size=2)return true;if( b_success=CanRotate()EraseBlock(block,BoardLeft,BoardTop,CellSize);memcpy(curBlock.c,BufferCells,16);DrawBlock(block,BoardLeft,BoardTop,CellSize);r
22、eturn b_success;/* erase a block, only fill the filled cell with background color */ void _INNER_HELPEREraseBlock(Block *block,int bdLeft,int bdTop,int cellSize)int i,j;setfillstyle(SOLID_FILL,BkGndColor);for(i=0;isize;i+)for(j=0;jsize;j+)if(block-cij & (block-y+j=0)floodfill(bdLeft+cellSize*(i+bloc
23、k-x)+cellSize/2, bdTop+cellSize*(j+block-y)+cellSize/2, BorderColor);/* move by the direction if can, donothing if cannot* return value: true - success, false - cannot move toward this direction */ int MoveBlock(Block *block,int dx,int dy) int b_canmove=CanMove(dx,dy); if(b_canmove)EraseBlock(block,
24、BoardLeft,BoardTop,CellSize);curBlock.x+=dx;curBlock.y+=dy;DrawBlock(block,BoardLeft,BoardTop,CellSize);return b_canmove;/* drop the block to the bottom! */int DropBlock(Block *block)EraseBlock(block,BoardLeft,BoardTop,CellSize); while(CanMove(0,1)curBlock.y+;DrawBlock(block,BoardLeft,BoardTop,CellS
25、ize);return 0;/* return value is assign to the blocks alive */ /* init the graphics mode, draw the board grid */ void InitGame()int i,j,gdriver=DETECT,gmode;struct time sysTime;/* draw board cells */memset(Board,0,BoardWidth*BoardHeight*2); memset(nextBlock.c,0,16);strcpy(info_help,P:Pause Game. -by
26、 hoodlum1980);initgraph(&gdriver,&gmode,);setcolor(BorderColor); for(i=0;i=BoardWidth;i+) BoardTop, BoardLeft+i*CellSize,BoardTop+i*CellSizeBoardTop+ i*CellSize);rect */BoardTop-CellSize/4,line(BoardLeft+i*CellSize,BoardTop+ BoardHeight*CellSize); for(i=0;i=BoardHeight;i+)line(BoardLeft,BoardLeft+Bo
27、ardWidth*CellSize,/* draw board outer borderrectangle(BoardLeft-CellSize/4,BoardLeft+BoardWidth*CellSize+CellSize/4,BoardTop+BoardHeight*CellSize+CellSize/4);/* draw next block grids */for(i=0;i=4;i+)line(NBBoardLeft+i*NBCellSize, NBBoardTop,NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);line(NB
28、BoardLeft, NBBoardTop+i*NBCellSize,NBBoardLeft+4*NBCellSize, NBBoardTop+i*NBCellSize);/* draw score rect */ rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,S coreBoardTop+ScoreBoardHeight);DisplayScore();/* set new seed! */ gettime(&sysTime); srand(sysTime.ti_hour*3600+sysTime.
29、ti_min*60+sysTime.ti_sec);GenerateBlock(&nextBlock);NextBlock(); /* create first block */setcolor(DARKGRAY);outtextxy(InfoLeft,InfoTop+20,Up-rotateSpace-drop);outtextxy(InfoLeft,InfoTop+35,Left-left Right-right); outtextxy(InfoLeft,InfoTop+50,Esc-exit);DisplayInfo(info_help);data to the board */* se
30、t the isFilled and fillcolor void _INNER_HELPEFRillBoardData()int i,j;for(i=0;icurBlock.size;i+)for(j=0;j=0)BoardcurBlock.x+icurBlock.y+j0=1;BoardcurBlock.x+icurBlock.y+j1=curBlock.color;/* draw one line of the board */void _INNER_HELPEPRaintBoard()int i,j,fillcolor; for(j=max(TopLine-4),0);jBoardHe
31、ight;j+)for(i=0;iBoardWidth;i+) fillcolor=Boardij0? Boardij1:BkGndColor; setfillstyle(SOLID_FILL,fillcolor);floodfill(BoardLeft+i*CellSize+CellSize/2,BoardTop+j*CellSize+CellSiz e/2,BorderColor);/* check if one line if filled full and increase the totalScore! */ void _INNER_HELPECRheckBoard()int i,j
32、,k,score=10,sum=0,topy,lines=0;/* we find the top empty line! */ j=topy=BoardHeight-1;dosum=0;for(i=0;i0 & topy0);/* remove the full filled line (max remove lines count = 4) */ dosum=0;for(i=0;i topy;k-) for(i=0;iBoardWidth;i+) Boardik0=Boardik-10;Boardik1=Boardik-11;/*make the top line empty! */ fo
33、r(i=0;iBoardWidth;i+) Boarditopy0=0;Boarditopy1=0;topy+; /* move the topline downward one line! */ lines+; /* lines 0 & jtopy & lines=FrameTime)/* our block has dead! (cant move down), we get nextblock */if(!MoveBlock(&curBlock,0,1)UpdateBoard();NextBlock();if(!CanMove(0,1)goto GameOver;tick=0;delay
34、(100);switch(key)case K_LEFT:MoveBlock(&curBlock,-1,0);break;case K_RIGHT:MoveBlock(&curBlock,1,0);break;case K_DOWN:MoveBlock(&curBlock,0,1);break;case K_UP:RotateBlock(&curBlock);break;case K_SPACE:DropBlock(&curBlock);break;case K_P:PauseGame();break;GameOver:DisplayInfo(GAME OVER! Press any key
35、to exit!); getch(); /* wait the user Press any key. */ QuitGame();測試計劃1.1 測試方案本游戲的測試方法采用檢查各個功能能否實現的方法1.2 測試項目及功能 控制區 開始: 實現游戲的開始 暫停: 實現游戲暫停 繼續:實現游戲繼續 提高級數: 提高級數增加游戲的難度 降低級數: 降低 級數減小游戲的難度 菜單區新游戲: 游戲結束從新開始新一輪的游戲 提高級數: 提高游戲難度 降低級數: 減小游戲難度退出:退出游戲開始: 開始游戲暫停: 暫停正在進行的游戲從新開始: 重新開始游戲停止: 停止正在進行的游戲幫助信息: 游戲控制鍵顯
36、示區: 顯示俄羅斯方塊提前顯示窗口: 顯示下一個方塊的樣式測試進度: 本游戲在我和同組李帥同學的辛苦努力下用了半天的時間完成了1.3 測試準備編寫相應的驅動模塊,并精心設計測試用例1.4 測試機構測試人員 : 王新勃職責: 找出程序中的錯誤,實現游戲的功能1.5 測試項目說明測試 1:名稱:控制區功能測試目的:測試控制區各個功能的按鈕。內容: 包括游戲開始,暫停,繼續,停止,提高級數,降低級數的 功能步驟:打開游戲窗口,按下開始按鈕,看游戲區是否有方塊下落,若 有則在按暫停按鈕看其是否暫停,若暫停,則按繼續看其是否繼續下落。按停 止按鈕方塊觀察方塊是否停止不動,按提高級數,降低級數看顯示區級數是否 在變化,并觀察游戲中方塊的下落書讀是否變化,按提高級數按鈕,方塊的下 落速度應加快;按降低級數按鈕,方塊的速度應減慢。測試 2:名稱:菜單區功能測試目的:測試菜單區各個子菜單的功能內容:游戲菜單下的子菜單:新游戲,提高級數,降低級數,退出 按鈕的功能實現,控制菜單下的子菜單:開始,暫停,重新開始,停止的功能 實現。步驟: 打開游戲窗口,按下控制菜單下的開始按鈕,看游戲區是否有方塊下落, 預顯區是否顯示下一個方塊的樣式。在按測試控制區的功能一樣分別測試各個 子菜單的功能。測試 3:名稱:顯示區功能測試目的: 測試玩家操作的功能內容: 實現方塊的左右移動,快速下落,翻轉變化,滿行消除,游戲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園舞蹈與運動教育安排計劃
- 幼兒園小班生活與學習的結合計劃
- 活動后評價與總結反饋計劃
- 制定職業規劃實現長遠發展計劃
- 增強前臺文員抗壓能力的計劃
- 急診科室評估與改進機制計劃
- 市場預判國際金融理財師試題及答案
- 2024年小語種證書考試創新思路試題及答案
- 業務指標的達成與分析計劃
- 有效的庫存周轉率提升方案計劃
- 初中物理中考實驗題總匯
- 環境因素識別評價表
- 2023-2024年攜程入出境游消費趨勢洞察報告-攜程研究院-202405
- CJJT191-2012 浮置板軌道技術規范
- 2024年同等學力申碩-同等學力(法學)筆試參考題庫含答案
- 部編版二年級語文下冊第一單元大單元整體作業設計
- 高三下學期綜評自我陳述報告
- 國際人權法與非洲人權體系的重要案例研究
- 中建懸挑卸料平臺專項施工方案
- 中建總工程師的職業基本素養
- 【房地產項目成本控制問題研究文獻綜述2300字】
評論
0/150
提交評論