計(jì)算機(jī)實(shí)習(xí)-益智游戲程序開發(fā)_第1頁
計(jì)算機(jī)實(shí)習(xí)-益智游戲程序開發(fā)_第2頁
計(jì)算機(jī)實(shí)習(xí)-益智游戲程序開發(fā)_第3頁
計(jì)算機(jī)實(shí)習(xí)-益智游戲程序開發(fā)_第4頁
計(jì)算機(jī)實(shí)習(xí)-益智游戲程序開發(fā)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

益智游戲程序的開發(fā)參考資料:【1】網(wǎng)站《計(jì)算機(jī)實(shí)習(xí)》中的“游戲軟件開發(fā)技術(shù)”北京電子科技學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系章小莉分析游戲類實(shí)習(xí)任務(wù)游戲類任務(wù)2.翻牌游戲(難度系數(shù):3級)3.開窗游戲(難度系數(shù):3級)4.DOS界面下的簡單洗發(fā)紙牌(難度系數(shù):2級)5.五子棋游戲(難度系數(shù):5級)6.DOS界面下的多種游戲的洗發(fā)紙牌(難度系數(shù):3級)7.配對游戲(難度系數(shù):4級)8.對對碰(難度系數(shù):3級)9.連子游戲(難度系數(shù):4級)10.連圖游戲(難度系數(shù):3級)12.走迷宮(難度系數(shù):4級)14.丟炸彈(難度系數(shù):3級)目錄益智游戲的特點(diǎn)益智游戲開發(fā)的難點(diǎn)益智游戲核心的構(gòu)建(不變內(nèi)容)游戲狀態(tài)的變化益智游戲操作界面的設(shè)計(jì)與實(shí)現(xiàn)(要因環(huán)境而變);游戲狀態(tài)的顯示(DOS版【C語言-OOP/OOB】,Windows版【VB,C++語言<API,MFC>】)游戲交互的實(shí)現(xiàn)以上內(nèi)容以“俄羅斯方塊”游戲的開發(fā)為例1益智游戲的特點(diǎn)掃雷;俄羅斯方塊游戲;空當(dāng)接龍;連連看;……從一個狀態(tài)走向另一個狀態(tài)游戲開發(fā)就是2益智游戲開發(fā)的難點(diǎn)如何記錄狀態(tài)信息?如何顯示狀態(tài)信息?如何接收(鍵盤、鼠標(biāo)、游戲操縱桿等)交互?如何根據(jù)交互改變狀態(tài)??3益智游戲核心的構(gòu)建(不變內(nèi)容)3.1狀態(tài)信息的記錄(1)狀態(tài)信息的數(shù)據(jù)結(jié)構(gòu)很多情況下都是用數(shù)組來存儲狀態(tài)信息;例如:俄羅斯方塊例如:俄羅斯方塊下墜物7種下墜物形狀如下所示:typedefstructdot{intx,y;}DOT每個下墜物是一個二維坐標(biāo)(x,y)//4坐標(biāo)點(diǎn)取值DOTActiveStatus[4];DOTNextStatus[4];下墜物可以向左右下移動,形狀不變逆時(shí)針旋轉(zhuǎn),形狀變化7種下墜物點(diǎn)陣信息的記錄:DOTSourceData[7][4][4];7種下墜物4種形狀4個坐標(biāo)點(diǎn)注意每個形狀其實(shí)只有4個坐標(biāo)有值。Q:其中發(fā)生了信息冗余?是什么?為什么?參考資料陳強(qiáng)編<<編程大講壇:C語言核心開發(fā)技術(shù)從入門到精通>>電子出版2009-8(TC)structSHAPEshapes[MAX_BOX]={/*口口口口口口口*口口口口口口*口口口*/{0x88,0xc0,CYAN,1},{0xe8,0x0,CYAN,2},{0xc4,0x40,CYAN,3},{0x2e,0x0,CYAN,0},/*口口口口口口*口口口口*口口口口口口*/{0x44,0xc0,MAGENTA,5},{0x8e,0x0,MAGENTA,6},{0xc8,0x80,MAGENTA,7},{0xe2,0x0,MAGENTA,4},/*口*口口口口*口口口*/{0x8c,0x40,YELLOW,9},{0x6c,0x0,YELLOW,8},/*口口口*口口口口*口*/{0x4c,0x80,BROWN,11},{0xc6,0x0,BROWN,10},/*口口口*口口口口口口口口口口*口口口*/{0x4e,0x0,WHITE,13},{0x8c,0x80,WHITE,14},{0xe4,0x0,WHITE,15},{0x4c,0x40,WHITE,12},/*口*口*口口口口口*口*/{0x88,0x88,RED,17},{0xf0,0x0,RED,16},/*口口*口口*/{0xcc,0x0,BLUE,18}}游戲區(qū)域intm_StatusMap[MAX_R*MAX_C];intm_AvtiveStatus[4*4];intm_NextStatus[4*4];狀態(tài)值對于m_AvtiveStatus和m_NextStatus0-不占用,非0-占用m_StatusMap0-不占用,1-占用且靜態(tài),2-占用且動態(tài)Q:基于設(shè)計(jì),界面上游戲區(qū)、活動塊、下一塊的狀態(tài)數(shù)組取值是什么?3.2狀態(tài)信息的顯示涉及到具體的外設(shè),這與開發(fā)環(huán)境有很大關(guān)系。C語言printf語句就是根據(jù)m_StatusMap、m_AvtiveStatus[4*4]、m_NextStatus[4*4]狀態(tài)取值輸出信息VB版VC版用Label控件是否顯示,展示狀態(tài)信息用畫出的矩形,展示狀態(tài)信息3.3交互(鍵盤、鼠標(biāo)、游戲操縱桿等)涉及到具體的外設(shè),這與開發(fā)環(huán)境有很大關(guān)系。C語言輸入語句

scanf,getchar,getch等由于游戲中輸入是控制狀態(tài)變化,并不需要顯示輸入的是什么,所以選擇getch()函數(shù)交互控制代碼框架(C語言)switch(KeyAscii){case74:case106://按J或j鍵,向左移動下墜物左移下墜物一格;

刷新狀態(tài)顯示;break;

case75:case107://按K或k鍵,逆時(shí)針旋轉(zhuǎn)下墜物旋轉(zhuǎn)下墜物;

刷新狀態(tài)顯示;break;

case76:case108://按L或l鍵,向右移動下墜物按了L鍵,右移下墜物一格;

刷新狀態(tài)顯示;break;

case73:case105://按I或i鍵,向下移動下墜物下移下墜物一格;if(沉底?)

沉底處理;else{

下移一格;

刷新狀態(tài)顯示;

}

break;case27://按下ESC鍵 報(bào)告成績; 結(jié)束游戲;

}VB版就是開發(fā)Form窗體的按鍵過程代碼。PrivateSubForm_KeyPress(KeyAsciiAsInteger)SelectCaseKeyAsciicase74,106:‘按J或j鍵,向左移動下墜物左移下墜物一格;

刷新狀態(tài)顯示;

case75,107:'按K或k鍵,逆時(shí)針旋轉(zhuǎn)下墜物旋轉(zhuǎn)下墜物;

刷新狀態(tài)顯示;

case76,108:‘按L或l鍵,向右移動下墜物按了L鍵,右移下墜物一格;

刷新狀態(tài)顯示;

case73,105:’按I或i鍵,向下移動下墜物下移下墜物一格;If(沉底?)Then

沉底處理;Else

下移一格;

刷新狀態(tài)顯示;

EndIf

case27:'按下ESC鍵 報(bào)告成績; 結(jié)束游戲;EndSelectWindows(API版)就是開發(fā)WndProc主窗口過程中的相應(yīng)鍵盤事件LRESULTWINAPIWndProc(HWNDhWnd,

UINTmsg,WPARAMwParam,

LPARAMlParam)switch(msg){caseWM_KEYDOWN:

switch(wParam){

caseVK_LEFT://按左移鍵左移下墜物一格;

觸發(fā)刷新屏幕;return0;

caseVK_UP://按向上鍵,做逆時(shí)針旋轉(zhuǎn)旋轉(zhuǎn)下墜物;

觸發(fā)刷新屏幕;

return0;

caseVK_RIGHT://按右移鍵

按了L鍵,右移下墜物一格;

觸發(fā)刷新屏幕;

return0;caseVK_DOWN://按向下鍵下移下墜物一格;if(沉底?)

沉底處理;else{

下移一格;

觸發(fā)刷新屏幕; }

return0;caseVK_ESCAPE://按下ESC鍵 報(bào)告成績; 觸發(fā)程序結(jié)束;}//mParam……}//WM_KEYDOWNWindows(MFC版)就是開發(fā)單文檔的按鍵消息WM_KeyDown的OnKeyDown相應(yīng)鍵盤事件voidCElsGameMFCView::

OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)switch(nChar){

caseVK_LEFT://按左移鍵左移下墜物一格;

觸發(fā)刷新屏幕;break;

caseVK_UP://按向上鍵,做逆時(shí)針旋轉(zhuǎn)旋轉(zhuǎn)下墜物;

觸發(fā)刷新屏幕;

break;

caseVK_RIGHT://按右移鍵

按了L鍵,右移下墜物一格;

觸發(fā)刷新屏幕;break;caseVK_DOWN://按向下鍵下移下墜物一格;if(沉底?)

沉底處理;else{

下移一格;

觸發(fā)刷新屏幕; }break;caseVK_ESCAPE://按下ESC鍵 報(bào)告成績; 觸發(fā)程序結(jié)束;}3.4根據(jù)交互改變狀態(tài)就是交互代碼框架中的操作的具體實(shí)現(xiàn)。boolIsLeft是最左否?是,返回true,否則,falseboolIsRight是最右?是,返回true,否則,falseboolIsBottom是最底否?是,返回true,否則,falseboolIsRotate是否可旋轉(zhuǎn)?是,返回true,否則,falseboolIsGameEnd游戲結(jié)束否?是,返回true,否則,falsevoidMoveLeft活動塊左移一格voidMoveRight活動塊右移一格voidMoveDown活動塊下移一格voidMoveBottom置底處理。含銷行,活動塊轉(zhuǎn)靜態(tài),是否結(jié)束判斷,激活下一個下墜物,選新的下個下墜物VoidDestoryLine銷行,即判斷某行全為1否,是,消除該行交互代碼框架中的問題解決最左、最右、沉底如何判斷??第一種形狀最左判斷點(diǎn)第一種形狀最右判斷點(diǎn)第二種形狀最左判斷點(diǎn)第一種形狀沉底判斷點(diǎn)(2,1)(3,2)(2,3)(2,3)(3,2)(2,1)(3,2)(1,2)(2,2)(3,2)……定義以下數(shù)組存儲邊界判斷數(shù)據(jù):DOTLeftEdge[7][4][4];DOTRightEdge[7][4][4];DOTBottomEdge[7][4][4];判斷函數(shù)就是判斷相應(yīng)點(diǎn)的左(右或下)邊位置占用否?其他代碼開發(fā)FlushMap根據(jù)m_StatusMap狀態(tài)數(shù)組取值,重新繪制游戲區(qū)域FlushNext根據(jù)m_NextStatus狀態(tài)數(shù)組取值,重新繪制下一個下墜物FlushActive根據(jù)m_ActiveStatus狀態(tài)數(shù)組取值,重新繪制當(dāng)前下墜物FlushInfo顯示當(dāng)前用去的時(shí)間、積分等其他文字信息刷新游戲界面初始化InitStatus()清空游戲狀態(tài)數(shù)組m_StatusMap[MAX_R*MAX_C]=0InitShape(anyStatus)初始化參數(shù)anyStatus數(shù)組,數(shù)組取值=0??捎糜谇蹇债?dāng)前下墜物,即m_ActiveStatus[16]=0;下一個下墜物,m_NextActive[16]=0游戲函數(shù)Operate(charch)交互操作過程輔助函數(shù)LoadShape(DOT*currStatus,DOTSourceData[7][4][4],intNo,intkind)取第No個下墜物的第kind種形狀的左標(biāo)點(diǎn)值,存入currStatus備用DrawShape(intanyStatus[],DOTDotData[],intcurrRow,intcurrCol,introwNum,intValue)依據(jù)DotData[]的坐標(biāo)點(diǎn)修改anyStatus[]狀態(tài)數(shù)組的取值。這里anyStatus[]可以是m_StatusMap,m_ActiveStatus,m_NextStatus,即可以修改游戲區(qū)、當(dāng)前下墜物、下一個下墜物的狀態(tài)數(shù)據(jù)。currRow,CurrCol指定左上角坐標(biāo)點(diǎn),rowNum說明狀態(tài)數(shù)組最大列數(shù),Value=0/1/2。小結(jié)開發(fā)游戲程序的流程:第一步:用熟悉的環(huán)境開發(fā)游戲;明確游戲的游戲規(guī)則;設(shè)計(jì)游戲的狀態(tài)數(shù)組,即建立初步的數(shù)據(jù)結(jié)構(gòu);用自己熟悉的方法實(shí)現(xiàn)一個簡單的狀態(tài)顯示;依據(jù)游戲規(guī)則建立游戲交互操作代碼框架;完善數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì);逐步實(shí)現(xiàn)交互代碼;第二步:移植到希望的環(huán)境;處理狀態(tài)顯示;移植其他代碼;面向過程與面向?qū)ο蟮膮^(qū)別Procedure-OrientedprogrammingVSObject-Orientedprogramming閱讀以下代碼,判斷實(shí)現(xiàn)功能voidchicken(intn,int&k,intg[],intm[],ints[]){inti,j,a,b,c;k=0;i=n/5;j=n/3;for(a=0;a<n;a++){for(b=0;b<=j;b++){c=n-a-b;if((5*a+3*b+c/3==n)&&(c%3==0)){g[k]=a;m[k]=b;s[k]=c;k++;}}}}publicclassbuy_chicken{publicstaticvoidmain(String[]args){inta,b,c;floatsum;cock_classcock=newcock_class;hen_classhen=newhen_class;chick_classchick=newchick_class;for(a=1;a<100;a++){for(b=1;b<100;b++){cock.num(a);hen_num(b);chick_num(100-a-b);

sum=cock.amount(cock.num)+hen.amount(hen.num)+chick.amount(chick.num);

if((cock.num+hen.num+chick.num=100)&&(sum=100)&&(chick_num%3=0))System.out.println(“公雞”+cock.num+

“母雞”+hen.num+“小雞”+chick.num);}}}}閱讀代碼,判斷實(shí)現(xiàn)功能面向過程程序編程思想的特點(diǎn)“面向過程”是一種以事件為中心的編程思想。用面向過程語言編程時(shí),重點(diǎn)是理解待處理問題的處理步驟,然后分別描述處理對象(數(shù)據(jù))以及處理過程(程序),之后執(zhí)行程序,實(shí)現(xiàn)問題求解。特點(diǎn)站在計(jì)算機(jī)角度,定義數(shù)據(jù)與數(shù)據(jù)處理流程;參看“百錢百雞”問題的求解過程,會發(fā)現(xiàn)求解過程已經(jīng)很難看出實(shí)際中的原問題,即數(shù)據(jù)與處理相分離。面向?qū)ο蟪绦蚓幊趟枷氲奶?/p>

溫馨提示

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

最新文檔

評論

0/150

提交評論