版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、北京郵電大學信息與通信工程學院程序設計實踐設計報告課題名稱: 彩色控制臺下的俄羅斯方塊 學生姓名: 班 級:_ _班內(nèi)序號: 學 號: 日 期: 2014年4月29日 1 課題概述 1.1課題目標和主要內(nèi)容 本程序采用vs2005在控制臺下編寫了彩色俄羅斯方塊游戲,能夠實現(xiàn)消行、反轉、計分、改變下落速度、分難度等級游戲等功能。 1.2系統(tǒng)的主要功能 1.可以靈活控制方塊在圖形框中運動。 2.游戲過程中方塊可以自由旋轉。 3.當某一行的方塊排列滿時,將自動將這一行方塊消除,然后將上面所有方塊向下移動,可以支持連續(xù)消行。并且當連續(xù)消行時分數(shù)會有一定獎勵。 4.可以提示下一個出現(xiàn)的方塊 5.游戲前可
2、以選游戲的等級,不同等級對應不同速度,不同等級消行后的加分不同,等級越高分數(shù)越高 ,方便不同水平的玩家游戲。 6.游戲結束后彈出對話框提醒結束游戲還是繼續(xù)游戲。 7.初始化界面和游戲中有音樂,使游戲更吸引人。2. 系統(tǒng)設計 2.1 系統(tǒng)總體框架 2.2 系統(tǒng)詳細設計 1 模塊劃分圖及描述 2 類關系圖及描述 3 程序流程圖及描述 4 存儲結構、內(nèi)存分配 上述4個內(nèi)容也可以按照模塊劃分分別設計。 2.3 關鍵算法分析 算法1:getblocks() 1 算法功能 生成隨機方塊 2 算法基本思想 利用srand() rand()函數(shù)產(chǎn)生隨機數(shù),隨機數(shù)對7取余得到06的隨機數(shù),對應7種隨機方塊。 3
3、 算法空間、時間復雜度分析 空間復雜度O() 時間復雜度O(1) 4 代碼邏輯(可用偽代碼描述)getblocks() /隨機方塊生成int * getblocks() /隨機方塊生成int * m=NULL;srand(time(NULL); int n=rand()%7; switch(n)case 0:m=&a100;break;case 1:m=&a200;break;case 2:m=&a300;break;case 3:m=&a400;break;case 4:m=&a500;break;case 5:m=&a600;break;ca
4、se 6:m=&a700;break;return m; 算法2:move 1 算法功能方塊的移動、下落等 2 算法基本思想通過_kbhit()和_getch()函數(shù)獲得鍵盤輸入,通過鍵盤控制方塊的加速下落、翻轉及左右移動 3 算法空間、時間復雜度分析 空間復雜度O(1) 時間復雜度O(1) 4 代碼邏輯(可用偽代碼描述)void move(int line) /方塊的左右移動,加速下落,翻轉等int mid=0,speed=100-10*level;while(mid<speed)if (_kbhit()switch(_getch()case 72: /翻轉turn(line)
5、;break;case 75: /左移row=row-2; /縱坐標減if(isavailable(line) /判斷是否能移動row=row+2;clearsquare(line+1); /消除原來圖案,line+1是避免line=4程序出錯row=row-2;drawblocks(line); /出現(xiàn)新圖案elserow=row+2; /若不能移動則縱坐標不變break;case 77: /右移row=row+2;if(isavailable(line)row=row-2;clearsquare(line+1);row=row+2;drawblocks(line);elserow=row-
6、2;break;case 80: /加速下落,即直接跳除循環(huán)mid=speed;break;case 27: /終止游戲end();break; case 32: /暫停int flag=1;while(flag)if (_kbhit()if(_getch()=32)flag=0;break;elseSleep(10);default:break;Sleep(8); /使方塊延遲mid+; 3. 程序運行結果分析 標題“歡迎來到俄羅斯方塊”采用了閃爍文字;下個方塊形狀隨機;消行時動畫提示;4. 總結 4.1課題的難點和關鍵點 比如調(diào)試方法、程序優(yōu)化和改進、消息機制、屏幕刷新、網(wǎng)絡傳輸?shù)确矫?,?/p>
7、什么方法解決了的什么問題。 程序設計上,封裝的函數(shù)較多,使主函數(shù)main()看起來比較簡潔,而封裝的函數(shù)可以重復運用,也減少了代碼的長度。采用了豐富的條件結構和循環(huán)結構,代碼比較簡約。此外,在關鍵處,均添加了注釋,方便了自己和其他人對代碼的檢查。4.2 本課題的評價本次實驗所要求的基本功能書上大部分都有代碼和解析,所以完成起來并不是十分困難。只是游戲的各個功能與環(huán)節(jié)的安排與相互調(diào)用對于新手來說很困難,調(diào)試起來出現(xiàn)了很多bug,需要一一解決。運行效果上,整體來看,所設計功能全部得到了實現(xiàn),效果比較理想。但是也存在不足之處,如方塊在邊緣的位置時,無法進行旋轉。另外,原本設計的雙人游戲由
8、于時間原因,未能實現(xiàn)。 4.3心得體會我這次實驗做的是俄羅斯方塊,開始時以為沒什么難度,可是當真正著手做時,發(fā)現(xiàn)很多東西并不容易實現(xiàn)。比如:如何顯示每一個俄羅斯小方塊,如何預測下一個俄羅斯小方塊,如何控制每一個方塊的下落速度,如何判斷俄羅斯方塊是否可以停止,如何通過鍵盤控制俄羅斯方塊的位置和方向等。如果有一行或多行滿行,如何刪除這些行,并重新繪制游戲區(qū)界面,同時分數(shù)如何計算并顯示等等,都要一一實現(xiàn)。真是難上加難。 不過,當我仔細研究了書上給出的算法后,這些問題被一一破解。當然,在這次課程設計中,也出現(xiàn)了許多錯誤或麻煩。主要有一些判斷條件的制定。有些判斷條件沒有想全,當執(zhí)行
9、某些操作時就出現(xiàn)異常,比如:俄羅斯方塊的停止條件的判斷,如果判斷條件不完整就會出現(xiàn)下落的方塊遇到已經(jīng)存在的方塊后還繼續(xù)下落。 通過這次課程設計,我對游戲編程有了初步認識,對游戲算法有了一定了解。從游戲的需求分析,系統(tǒng)設計,再到游戲代碼實現(xiàn)每一步都對自己是一個挑戰(zhàn),雖然過程充滿艱辛,但是從中我學到了很多課本上學不到的編程經(jīng)驗,也從中獲得了很多快樂。5. 參考文獻1c+高級語言程序設計案例與實踐輔導 徐惠民 人民郵電出版社 2012年2c+高級語言程序設計 徐惠民 人民郵電出版社 2012年附:頭文件#include <windows.h>#include <iost
10、ream>using namespace std;HANDLE initiate();BOOL textout(HANDLE hOutput,int x,int y,WORD wColors,int nColors,LPTSTR lpszString);源程序1#include "colorConsole.h"HANDLE initiate()HANDLE hOutput; hOutput = GetStdHandle(STD_OUTPUT_HANDLE);return hOutput;BOOL textout(HANDLE hOutput,int x,int y,W
11、ORD wColors,int nColors,LPTSTR lpszString) DWORD cWritten; BOOL fSuccess; COORD coord; coord.X = x; / start at first cell coord.Y = y; / of first row fSuccess = WriteConsoleOutputCharacter( hOutput, / screen buffer handle lpszString, / pointer to source string lstrlen(lpszString), / length of string
12、 coord, / first cell to write to &cWritten); / actual number written if (! fSuccess) cout<<"error:WriteConsoleOutputCharacter"<<endl; for (;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors) fSuccess = WriteConsoleOutputAttribute( hOutput, / screen
13、buffer handle wColors, / pointer to source string nColors, / length of string coord, / first cell to write to &cWritten); / actual number written if (! fSuccess) cout<<"error:WriteConsoleOutputAttribute"<<endl;return 0;源程序2#include <conio.h>#include <iostream>#i
14、nclude <windows.h>#include <mmsystem.h> #pragma comment(lib, "WINMM.LIB")#include <stdlib.h>#include <ctime>#include "colorConsole.h" using namespace std;void begin(); /開始游戲void frame(); /邊框設定int * getblocks(); /方塊產(chǎn)生void move(int line); /移動void drawblocks(
15、int line); /方塊顯示void clearsquare(int line); /方塊擦除void turn(int line); /方塊旋轉bool isavailable(int line); /判斷是否能下落void remember(int line); /記憶方塊位置void deleteline(int line); /方塊滿一行消除bool ifgameover(); /判斷是否游戲結束void end(); /游戲結束#define up 72#define down 80#define left 75#define right 77#define esc 27HAND
16、LE handle;int a144=1,1,1,1; /七種方塊的二維數(shù)組int a244=0,1,1,1,1;int a344=1,1,0,1,1;int a444=0,0,1,1,1,1;int a544=0,1,1,1,1;int a644=1,1,1,1;int a744=1,1,1,1;int row=0; /列數(shù)int score=0; /分數(shù)int level=0;int * block1=NULL; int * block2=NULL;int * block3=NULL;int coordinate1218=0; /坐標數(shù)組,邊框*18(最后一行,兩邊邊框計算在內(nèi))int j
17、udge=0;int scorex=0;int temp44=0;void main() /主函數(shù) int t=1;handle = initiate();while(t)t=0; begin(); sndPlaySound("H:/music.wav",SND_LOOP|SND_ASYNC); frame(); WORD wColors1; wColors0=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;/黃色 for(int k=1;k<=999999;k+)if(ifgameover() /判斷是否結束
18、 textout(handle,34,10,wColors,1,"Game Over"); Sleep(80); end(); else if(k=1)block2=getblocks();block3=block2; /block2指向將出現(xiàn)的方塊地址block2=getblocks(); /獲取下一個新的方塊block1=block3; row=52; clearsquare(16); /擦除next的方塊block1=block2;drawblocks(15); /在next顯示下一塊方塊圖形row=34;block1=block3;for(int i=4;i<
19、=7;i+) /所構建的方塊圖形最多只有占有兩排,所以只用-7即可對應 if(*(block1+i)textout(handle,26+i*2,4,wColors,1,""); /方塊先露出下面部分Sleep(500-50*level);for(int line=4;line<=22;line+) /方塊自主下落,方塊從第四排開始出現(xiàn)if(isavailable(line) /檢驗剛產(chǎn)生的方塊是否碰壁,碰到已落方塊clearsquare(line); /消除方塊先露初的下面分drawblocks(line); /產(chǎn)生完整的下落方塊move(line);elsereme
20、mber(line); /落定后將這些位置對應的all數(shù)組中元素置deleteline(line); /消行以及加分if(line=4)judge=1;break;void begin()int i=1;WORD wColors2;wColors0=FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY;/紫色wColors1=FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;/白色WORD wColors11;wColors10=FOREGROUND_BLU
21、E|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;/白色WORD wColors22;wColors20=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;/黃色 wColors21=FOREGROUND_RED|FOREGROUND_INTENSITY;/紅色 textout(handle,18,6,wColors,2,"");textout(handle,18,7,wColors,2," ");textout(handle,18,8,w
22、Colors,2," ");textout(handle,18,9,wColors,2," ");textout(handle,18,10,wColors,2,"");textout(handle,26,11,wColors,1,"請選擇難度");textout(handle,26,12,wColors,1,"簡單請按");textout(handle,26,13,wColors,1,"中等請按");textout(handle,26,14,wColors,1,"困
23、難請按"); textout(handle,23,15,wColors1,1,"MADE BY 通信六班王宏潔 ");textout(handle,30,16,wColors1,1," 2012210176 ");while(i)textout(handle,23,8,wColors2,2,"歡迎來到俄羅斯方塊");Sleep(800);textout(handle,23,8,wColors2,2," "); Sleep(800); if (_kbhit() /輸入等級switch(_getch()cas
24、e '1': level=1;i=0; /跳出循環(huán)break;case '2': level=4;i=0;break;case '3': level=7;i=0;break;system("cls"); /清屏void frame() /邊框的設定WORD wColors1;wColors0=FOREGROUND_BLUE|FOREGROUND_INTENSITY; /藍色WORD wColors11;wColors10=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY
25、; /藍色for(int i=0;i<=11;i+)coordinatei17=1; /底排邊框定義為for(int j=0;j<=17;j+)coordinate0j=1; /兩邊邊框定義為coordinate11j=1;char string5;textout(handle,59,5,wColors,1,itoa(level,string,10); textout(handle,52,5,wColors,1,"level: ");textout(handle,52,9,wColors,1,"score: 0");textout(handl
26、e,52,13,wColors,1,"next:");textout(handle,10,6,wColors1,1,"暫停 SPACE");textout(handle,10,7,wColors1,1,"退出 ESC");textout(handle,10,8,wColors1,1,"翻轉 ");textout(handle,10,9,wColors1,1,"向右 ");textout(handle,10,10,wColors1,1,"向左 ");textout(handle
27、,10,11,wColors1,1,"加速 ");textout(handle,33,2,wColors,1,"加油!");for(int m=13;m<=24;m+)textout(handle,2*m,3,wColors,1,""); /上邊框for(int n=4;n<=21;n+)textout(handle,26,n,wColors,1,""); /左邊框for(int k=4;k<=21;k+)textout(handle,48,k,wColors,1,""); /
28、右邊框for(int l=13;l<=23;l+)textout(handle,2*l,21,wColors,1,""); /下邊框textout(handle,26,3,wColors,1,"");textout(handle,48,3,wColors,1,"");textout(handle,26,21,wColors,1,"");textout(handle,48,21,wColors,1,"");int * getblocks() /隨機方塊生成int * m=NULL;srand
29、(time(NULL); /隨機數(shù)發(fā)生器的初始化函數(shù)int n=rand()%7; /生成隨機數(shù)switch(n)case 0:m=&a100;break;case 1:m=&a200;break;case 2:m=&a300;break;case 3:m=&a400;break;case 4:m=&a500;break;case 5:m=&a600;break;case 6:m=&a700;break;return m;void drawblocks(int line) /出現(xiàn)方塊WORD wColors1;wColors0=FOREG
30、ROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;/黃色for(int j=0;j<=15;j+) int temp;temp=j/4;if(*(block1+j)textout(handle,row+j*2-temp*8,line+temp,wColors,1,"");void clearsquare(int line) /方塊消失WORD wColors1;wColors0=FOREGROUND_BLUE|FOREGROUND_INTENSITY;if(line=4) /針對消除剛產(chǎn)生的下排textout(handle
31、,34,4,wColors,1," ");textout(handle,36,4,wColors,1," ");textout(handle,38,4,wColors,1," ");textout(handle,40,4,wColors,1," ");elsefor(int m=0;m<=15;m+) int temp;temp=m/4; /得-3對應方塊數(shù)組-4行if(*(block1+m)textout(handle,row+m*2-temp*8,line-1+temp,wColors,1,"
32、");void move(int line) /方塊的左右移動,加速下落,翻轉等int mid=0,speed=100-10*level;while(mid<speed)if (_kbhit()switch(_getch()case 72: /翻轉turn(line);break;case 75: /左移row=row-2; /縱坐標減if(isavailable(line) /判斷是否能移動row=row+2;clearsquare(line+1); /消除原來圖案,line+1是避免line=4程序出錯row=row-2;drawblocks(line); /出現(xiàn)新圖案el
33、serow=row+2; /若不能移動則縱坐標不變break;case 77: /右移row=row+2;if(isavailable(line)row=row-2;clearsquare(line+1);row=row+2;drawblocks(line);elserow=row-2;break;case 80: /加速下落,即直接跳除循環(huán)mid=speed;break;case 27: /終止游戲end();break; case 32: /暫停int flag=1;while(flag)if (_kbhit()if(_getch()=32)flag=0;break;elseSleep(1
34、0);default:break;Sleep(8); /使方塊延遲mid+;void turn(int line)clearsquare(line+1); /消除原來的圖案int b44=0; /保存旋轉前的方塊int num=0,l=0;for(int m=0;m<=3;m+)for(int n=0;n<=3;n+)bmn=*(block1+m*4+n); /把b44全賦值為當前圖形數(shù)組 tempmn=0;for(int i=3;i>=0;i-) /按行從下向上掃描for(int j=0;j<4;j+) /按列從左向右掃描if(bij) /如果為有效點,則進行度旋轉
35、tempjl=bij; num=1;if(num)l+;num=0;block1=&temp00;if(isavailable(line)drawblocks(line);elsefor(int p=0;p<=3;p+)for(int q=0;q<=3;q+)temppq=bpq;block1=&temp00;drawblocks(line);bool isavailable(int line) /檢驗,即看方塊即將存在位置是否已經(jīng)有int x,y;for(int m=0;m<=15;m+) int temp;temp=m/4;x=row/2-13-4*temp+m; /邊框左邊已有個位置y=line-4+temp; /上面已有個位置if(*(block1+m)&&coordinatexy) /相與為則返回,否則跳出并循環(huán)繼續(xù)return 0;void remember(int line) /記憶int x,y;for(int m=0;m<=15;m+) int temp;temp=m/4;x=row/2-13-temp*4+m;y=line-4+temp;if(*(block1+m) /如果當前位置為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年校園門衛(wèi)人員勞動合同編制指南3篇
- 2025年度殘疾人勞動合同簽訂中的殘疾人心理關愛與職業(yè)適應3篇
- 2024藥店負責人任期藥店品牌形象塑造聘用合同3篇
- 二零二五年度版權許可合同許可范圍和許可費用6篇
- 年度新型鋁基軸瓦材料市場分析及競爭策略分析報告
- 年度密封用填料及類似品競爭策略分析報告
- 二零二五年度精裝修住宅租賃管理服務合同3篇
- 2024-2025學年高中歷史第五單元近現(xiàn)代中國的先進思想第22課孫中山的民主追求課后作業(yè)含解析岳麓版必修3
- 2025年度智能交通系統(tǒng)建設合同6篇
- 二零二五年度餐館員工餐飲服務規(guī)范合同3篇
- 100個超高難度繞口令大全
- 《鄭伯克段于鄢》-完整版課件
- (日文文書模板范例)請求書-請求書
- 土壤肥料全套課件
- 畢業(yè)生延期畢業(yè)申請表
- 學校6S管理制度
- 肽的健康作用及應用課件
- T.C--M-ONE效果器使用手冊
- 8小時等效A聲級計算工具
- 人教版七年級下冊數(shù)學計算題300道
- 社會實踐登記表
評論
0/150
提交評論