![c語言俄羅斯方塊實驗報告_第1頁](http://file4.renrendoc.com/view/5dc0418033769b88d1ce47e7531aa2fe/5dc0418033769b88d1ce47e7531aa2fe1.gif)
![c語言俄羅斯方塊實驗報告_第2頁](http://file4.renrendoc.com/view/5dc0418033769b88d1ce47e7531aa2fe/5dc0418033769b88d1ce47e7531aa2fe2.gif)
![c語言俄羅斯方塊實驗報告_第3頁](http://file4.renrendoc.com/view/5dc0418033769b88d1ce47e7531aa2fe/5dc0418033769b88d1ce47e7531aa2fe3.gif)
![c語言俄羅斯方塊實驗報告_第4頁](http://file4.renrendoc.com/view/5dc0418033769b88d1ce47e7531aa2fe/5dc0418033769b88d1ce47e7531aa2fe4.gif)
![c語言俄羅斯方塊實驗報告_第5頁](http://file4.renrendoc.com/view/5dc0418033769b88d1ce47e7531aa2fe/5dc0418033769b88d1ce47e7531aa2fe5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-PAGE . z. C語言之游戲俄羅斯方塊課程設計報告 專業(yè): 學生*: 指導教師: 完成時間: -. z.目錄 TOC o 1-3 h z u HYPERLINK l _Toc271612941一、需求分析 PAGEREF _Toc271612941 h 2HYPERLINK l _Toc271612942二、概要設計 PAGEREF _Toc271612942 h 2HYPERLINK l _Toc271612943三、詳細設計 PAGEREF _Toc271612943 h 4HYPERLINK l _Toc271612944四、調試分析 PAGEREF _Toc271612944 h
2、 8HYPERLINK l _Toc271612945五、用戶手冊 PAGEREF _Toc271612945 h 9HYPERLINK l _Toc271612946六、測試數據 PAGEREF _Toc271612946 h 9HYPERLINK l _Toc271612947七、附錄 PAGEREF _Toc271612947 h 10一、需求分析格式:黑體,四號字,英文用times new roman,以下的標題格式均采用該格式。行距為多倍行距,設置值為1.73該程序是完成一個簡易的俄羅斯方塊的任務,其要完成幾個重要的功能:界面,方塊下落,旋轉,判斷是否還能下落,左右移動,分數,速度設
3、置,清楚滿的每行,下個方塊的預覽等;可用#include 的頭文件來實用幾個函數來控制并完成游戲的界面;可用7個二維5*5數組去實現下落方塊的全部類型,再用隨機函數使其隨機下落;用#include 的頭文件去使用按鍵的控制,以保證用戶能夠合理操作;并用#include 的頭文件來使用rand函數來隨機出示七種方塊;完成正常的顯示和下個方塊的預覽;用 #include 來運用時針去控制時間;程序執(zhí)行過程:然后加上幾個根本的頭文件來執(zhí)行函數,首先設置按鍵操作,用:w,a,d,s控制,然后進展界面的初始化設置,啟動,時針參數設置,開場新游戲,開場隨機下落方塊,顯示下一個方塊,再行旋轉,移動,去除,加
4、分,速度參數,最后判斷是否已滿,停頓游戲,打出分數,完畢的畫面設置,游戲終止.二、概要設計格式:黑體、四號字,同標題一該程序中的函數設置總體主要功能大致如下1.找到適宜的方塊盒子7種使其一一下落 bo*MA*_C55 = /*MA*_C(7)種預定義的盒子*/ 這樣用類似的7個5*5二維數組來實現每個盒子方塊的形狀,自此就引薦兩個作為介紹, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 ,如此中用1代表顯示的格子,0代表空
5、。設置時間指針,實現旋轉,移動,消去,顯示加分,改變速度分別用下面函數表示 int setTimer(Timer *t, unsigned int intv, BOOL en); /*設置時鐘t,參數分別為時鐘指針,時間間隔,是否活動*/ void rotateBo*(int bo*155, int bo*255) /*旋轉bo*1輸出到bo*2*/int move(int dir) /*實現移動,返回成功與否*/ void clear() /*去除掉滿行*/ void prscore() /*打印現在的分數*/void spe()/*顯示速度的改變*/ 益智游戲 俄羅斯方塊3.外部函數功能如
6、下列圖判斷最后,游戲完畢的操作;用prscore和界面設置完成界面設置void initMap函數和void render繪圖函數分數的改變與速度設置;用prscore與spe來完成判斷是否能繼續(xù)下落;用int test函數來完成;方塊的旋轉和移動下落;用roratemove與drop來實現隨機顯示方塊,并建立下一個;用rand 與void rebuidNe*t 開場界面4.建立整個函數的流程圖如下: 時間指針設定 隨機出示方塊, 并顯示下個方塊實現方塊的旋轉,移動判斷是否到底NY 加分,速度設置 Y判斷是否已滿N 打印分數,完畢處理 游戲完畢流程簡介:玩家定義游戲開場,游戲顯示開場界面,時針
7、已經設定好,然后隨機出示方塊,玩家進展方塊的旋轉,左右移動,和下落控制,然后在旁邊的表格中出示另一個表格顯示下一個即將下落的方塊,然后判斷是否到達底部,假設到,繼續(xù)出示方塊,假設沒,則可繼續(xù)變換,下落到低端后在進展判斷,是否可以消除該行,再進展分數的變換,速度的調整,然后判斷是否已經滿,假設未滿,則繼續(xù)出示下一個方塊,假設滿,則完畢游戲,打印分數,出示完畢界面,游戲終止。三、詳細設計格式同標題二1.設置七種方塊:這個用int bo*MA*_C55 = /*MA*_C(7)種預定義的盒子*/ 來實現;即七個5*5的盒子數組,方塊實體用1表示,0表示空;七種如下所示,細心就會發(fā)現 0,0,0,0,
8、0, 0,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,1,1,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,1,1,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,0,1,
9、0,0, 0,0,1,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0 ; 這樣七種盒子的方塊就被清楚的展現在你們面前。用來保證方塊不會出來我們要進展按鍵的設置#define KEY_UP w /*定義上下左右按按鍵*/ #define KEY_DOWN s #define KEY_LEFT a #define KEY_RIGHT d #define KEY_ESC 27 /*退出*/時鐘的控制 ,用來控制方塊的下落間隔時間及速度/*時鐘構造控制*/ typedef struct /*時鐘構造*/ BO
10、OL enabled; /*時鐘是否開啟*/ unsigned int intervel; /*定時間隔*/ unsigned int lasttime; /*這個屬于部使用變量*/ Timer; int GetTickCount() /*讀取BIOS時鐘*/ int ret; ret = peek(0*0,0*46e); /*實際上讀取了存0:046e處的容*/ ret enabled = en; /*設置一個時鐘羅*/ t - intervel = intv; t - lasttime = GetTickCount(); /*lasttime記錄的是上一個*/ /*tickcount返回的
11、東西*/ /*這樣當再一次測試時間時新的tickcount產生了 它來減去上一次的tickcount就得出了一個時間 間隔,這個就可以和intervel比擬從而得出是否 激活了 */ return 0; 實現了以上的操作后,接下來要實現界面的設置一方便盒子在界面上的顯示和操作;5.void initMap(void) /*初始化地圖*/ /*我們須要一圈衛(wèi)兵呵呵,全是1.用來保證方塊不會出來*/ int *, y; for(y = 0; y MA*_Y; y+) for(* = 0; * MA*_*; *+) if(* MA*_* - 3 | y MA*_Y - 3) mapy* = 1; e
12、lse mapy* = 0; /*這里初始化出這個形狀*/ /*當然是無蓋的.*/ void render(void) /*這里唯一的繪圖函數*/ int *, y; static int cPage = 0; /*當前頁,換頁用*/ #define START* 50 /*定義幾個常量*/ #define STARTY 0 /*數值根據自己的需要可以自己設置*/ #define LEN 18 setactivepage(cPage=(cPage = 01:0); /*選擇頁*/ cleardevice(); /*清屏*/ setcolor(12);/*前景顏色*/ prscore(); se
13、tcolor(15); rectangle( START* + LEN * 2 - 2, STARTY + LEN * 3 - 2, START* + LEN * (MA*_* - 2) + 2, STARTY + LEN * (MA*_Y - 2) + 2); /*用白色畫一個外框*/ setfillstyle(SOLID_FILL, 5); for(y = 3; y MA*_Y - 2; y+) /*畫地圖 */ for(* = 2; * MA*_* - 2; *+) if(mapy*) rectangle( * * LEN + START*, y * LEN + STARTY, * *
14、LEN + START* + LEN, y * LEN + STARTY + LEN); bar( * * LEN + START* + 1, y * LEN + STARTY + 1, * * LEN + START* + LEN - 2, y * LEN + STARTY + LEN - 2); /*繪圖操作就不要作太復雜的介紹了,這只寫作用*/ /*以上段,根據地圖上的點陣情況將地圖反映到屏幕上*/ for(y = 0; y 5; y+) /*畫下落物*/ for(* = 0; * 2) rectangle( (* + cur*) * LEN + START*, (y + cury) *
15、 LEN + STARTY, (* + cur*) * LEN + START* + LEN, (y + cury) * LEN + STARTY + LEN); bar( (* + cur*) * LEN + START* +1, (y + cury) * LEN + STARTY + 1, (* + cur*) * LEN + START* + LEN - 2, (y + cury) * LEN + STARTY + LEN - 2); /*以上將下落的盒子按昭它在地圖上的坐標,畫到對應的區(qū)域里*/ for(y = 0; y 5; y+) /*畫下一個*/ for(* = 0; * 5;
16、*+) if(ne*tbo*y*) rectangle( * * LEN + 320, y * LEN + 10, * * LEN + 338, y * LEN + 28); bar( * * LEN + 321, y * LEN + 11, * * LEN + 336, y * LEN + 26); /*這個畫出下一個盒子的預覽*/ setvisualpage(cPage); /*確認在cPage頁里畫好了*/ /*將它顯示出來*/ 這樣我們的初始化界面和盒子在圖上的意義顯示已經完成;接下里我們要對即將出現的方塊的形狀進展預覽即建立一個新的函數用來顯示下一個下落的盒子; void rebui
17、dNe*t() /*新建下一個形狀并放到ne*tbo*中*/ int i, *, y; i = random(MA*_C); /*從幾種方塊里面選一種*/ for(y = 0; y 5; y+) /*并復制過來*/ for(* = 0; * 5; *+) ne*tbo*y* = bo*iy*; /*復制*/ void putBo*() /*將curbo*填充到地圖上*/ int *, y; for(y = 0; y 5; y+) /*這個也簡單,主要是要根*/ for(* = 0; * 5; *+) /*據cur*,cury指出位置 */ if(curbo*y*) mapy + cury* +
18、 cur* = curbo*y*; int newfall() /*創(chuàng)立下落元素失敗返回0*/ int *, y; cur* = MA*_* / 2 - 2; /*重新指定小盒位置*/ cury = 0; for(y = 0; y 5; y+) for(* = 0; * 5; *+) curbo*y* = ne*tbo*y*;/*將ne*tBo*復制過來*/ rebuidNe*t(); /*重建ne*tBo*/ return test(cur*, cury, curbo*); 這樣一來,我們的預覽盒子也就完成了。完成以后,我們要進展下落的控制,這個在開場的控制指針已經做好的下落間隔設置,然后開
19、場隨機出示方塊,玩家應開場進展旋轉,移動的操作,下落的過程;void rotateBo*(int bo*155, int bo*255) /*旋轉bo*1輸出到bo*2*/ int *, y; for(* = 0; * = 0; y-) /*編寫一下才能印像深刻*/ bo*2y* = bo*1*4 - y; int rotate() /*整個旋轉的操作并將盒子打印到屏幕上*/ int *, y; int newbo*55; /*我們必須將當前盒子轉動到新的盒子*/ /*再對這個新的盒子的沖突作測試*/ rotateBo*(curbo*, newbo*); /*轉動到新的盒子*/ if(test
20、(cur*, cury, newbo*) /*并且新的盒子能放到地圖上而不沖突*/ for(y = 0; y 5; y+) for(* = 0; * 5; *+) curbo*y* = newbo*y*; /*復制進來*/ return 1; else return 0; int move(int dir) /*返回成功與否*/ int new*; if(dir) new* = cur* + 1; /*與drop一樣,準備移動后的坐標*/ else new* = cur* - 1; if(test(new*, cury, curbo*) /*測試是否沖突*/ cur* = new*; /*可以
21、的話切換cur*/ return 1; return 0; 這個就完成了左右移動的操作;int drop() /*下落,返回成功與否*/ int newy; /*盒子要下落的新位置*/ newy = cury + 1; /*為當前Y位置+1*/ if(test(cur*, newy, curbo*) cury = newy; /*測試下落盒在這個位置*/ return 1; /*上是否有沖突,沒有的話*/ /*直接設置cury*/ return 0; int test(int m*, int my, int bo*55) /*測試bo*在map里m*,my位置上是否能著陸*/ /*這個是最關鍵
22、的一個函數,它判斷是否產生非空沖突*/ /*但算法還是很簡單的*/ int *, y; for(y = 0; y 5; y+) for(* = 0; * 5; *+) if(mapy + my* + m* & bo*y*) return 0; return 1; 這樣就完成了旋轉,移動,測試并下落的功能。6.接下來我們要完成下落后的分數的改變速度的重新設定; void clear() /*去除掉滿行*/ /*具體的算法為: 從第0行開場到最后一行,測試地圖點陣是否為滿,如果是的話 從當前行算起,之上的地圖向下掉一行*/ int *, y; int d*, dy; int fullflag; f
23、or(y = 0; y MA*_Y - 2; y+) /*最后兩行保存行*/ fullflag = 1; /*假設為滿*/ for(* = 2; * 0; dy-) for(d* = 2; d* MA*_* - 2; d*+) mapdyd* = mapdy - 1d*; for(d* = 2; d* MA*_* - 2; d*+) map0d* = 0; score+=10;/*輸出新得分*/ /*并去除掉第一行*/ void prscore()/*輸出分數*/ char str10;setfillstyle(SOLID_FILL,YELLOW); rectangle(90,15,260,3
24、5);setcolor(6); sette*tstyle(0,0,2);sprintf(str,score:%d,score); outte*t*y(115,20,str); void spe()/*顯示速度的改變*/ if(score%50=0&score!=0) setTimer(&tDown, speed-, 1);7.然后在主函數之前中定義以下的操作,這個應該會很容易理解 int mapMA*_Y+4MA*_*+4; /*地圖大盒子.MA*_*,Y是可見面積*/ /*我已說過需要在外面布兩圈衛(wèi)兵*/ int curbo*55; /*當前下落的盒子*/ int cur*, cury; /
25、*保存著當前活動盒子在地圖上的位置*/ int ne*tbo*55; /*保存著下一個形狀的盒子*/ 接下倆用newgame函數將其串聯起來,實現函數的嵌; void newGame() /*新建游戲*/ int *, y; initMap(); /*初始化地圖*/ srand(GetTickCount(); /*初始化隨機發(fā)生器*/ rebuidNe*t(); /*建立下一個*/ setTimer(&tDown, speed, 1); /*啟動時鐘(快慢兩個)*/ setTimer(&tFast, FAST_INTV, 1); newfall(); /*對下落的盒子操作一下*/ /*這樣第一
26、個下落的方塊 就在地圖頂部準備好了*/ 接下來最為重要的主函數將要開場;int main() char key; /*記錄當前按鍵*/ int i; int gd = VGA, gm = VGAMED; /*初始化的圖形模式*/ Timer *ptDown; /*下落所指向的時鐘(有快慢)*/ Timer trender; /*為了防止渲染給程序造成過大的負擔*/ /*用一個時鐘來控制渲染速度*/ /*把它設置interval = 1,*/ /*這樣就是18 FPS了,當然無法到達標*/ /*準的60 FPS.畢竟這是DOS.*/ setTimer(&trender, 1, 1); initg
27、raph(&gd, &gm, ); /*初始化圖形*/ newGame(); /*新游戲.*/ prscore();while(1) /*主游戲循環(huán)*/ if(kbhit() /*如果鍵盤有按下*/ key = getch(); /*讀取一個按鍵值到key*/ else key = 0; switch(key) /*對讀到的key進展判斷*/ case KEY_UP: rotate(); /*上,旋轉下落盒子*/ break; case KEY_DOWN: ptDown = &tFast; /*使用tFast時鐘 */ break; case KEY_LEFT: move(0); /*左移*/
28、 break; case KEY_RIGHT: move(1); /*右移*/ break; case KEY_ESC: closegraph(); /*完畢游戲*/ e*it(0); default: ptDown = &tDown; /*使用原來速度 */ if(testTimer(ptDown) /*在上面已設置了下落要 使用的時鐘在ptDown里*/ if(!drop() /*下落,失敗返回0*/ putBo*(); /*寫到地圖里*/ clear();prscore();spe();setcolor(6) ;/*去除滿行*/ if(!newfall() /*新建下落,失敗則游戲完畢*
29、/ setcolor(14); sette*tstyle(0,0,2); outte*t*y(100,200,GAME OVER);/*游戲完畢,在屏幕上打印字符串*/ outte*t*y(100,240,THANK YOU); sleep(3); e*it(0); if(testTimer(&trender) /*最后.渲染.*/ render(); 最后main函數已經介紹完畢,只需在開場加上程序所需的頭文件和值的宏定義后整個程序就全部完畢#include #include #include /*這里須要讀取系統(tǒng)運行時間來作為定時器*/ #include /*很不幸,TC2的簡單圖形,讓我放棄了用*/ #include /*win32+openGL來講解.*/ #define MA*_* 14 /*可見最大*/ #define MA*_Y 21 /*可見最大Y*/ /*我們定義了最大的可見*和Y,則即還有不可見的局部,事實上地圖(大盒子)里的左右兩側和底部各兩行都被1填充,這樣大大簡化 出界的判斷,事實上,在本例中沒有這樣的代碼,因為旁邊有一圈1阻止小盒子越出大盒子的按制圍 */#define MA*_C 7 /*最大種類,這個無須解釋*/ #define FALSE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現代產品設計中的民族圖案與色彩研究
- 現代紋樣設計在商業(yè)品牌推廣中的應用實踐
- 現代辦公環(huán)境下的AI餐廳服務應用研究
- 現代物流行業(yè)的服務創(chuàng)新與升級
- 現代辦公環(huán)境下的報告制作技巧
- 2024年五年級語文上冊 第六單元 口語交際:父母之愛說課稿 新人教版
- Module7 Unit2 This little girl can't walk(Period 1) (說課稿) -2024-2025學年外研版(三起)英語五年級上冊
- 7《什么比獵豹的速度更快》說課稿-2024-2025學年五年級上冊語文統(tǒng)編版001
- 13美麗的冬天 說課稿-2024-2025學年道德與法治一年級上冊統(tǒng)編版
- 2024-2025學年高中化學 第1章 第4節(jié) 第2課時 有機物分子式與分子結構的確定說課稿 新人教版選修5
- 數字證書使用承諾函
- 獵聘網在線人才測評題庫
- 《社區(qū)康復》課件-第八章 視力障礙患者的社區(qū)康復實踐
- 透析患者的血糖管理
- 瀝青拌合站講義課件
- 《逆向建模與產品創(chuàng)新設計》課程標準
- 前置審方合理用藥系統(tǒng)建設方案
- 人教高中生物必修1第三章細胞核-系統(tǒng)的控制中心課件25張
- 2022年甘肅省蘭州市診斷考試(一診)數學試題(含答案解析)
- 裝載機裝車施工方案
- 國壽增員長廊講解學習及演練課件
評論
0/150
提交評論