第14章-簡單的游戲設(shè)計(jì)_第1頁
第14章-簡單的游戲設(shè)計(jì)_第2頁
第14章-簡單的游戲設(shè)計(jì)_第3頁
第14章-簡單的游戲設(shè)計(jì)_第4頁
第14章-簡單的游戲設(shè)計(jì)_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

哈爾濱工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院蘇小紅

sxh@

第14章簡單的游戲設(shè)計(jì)第14章學(xué)習(xí)內(nèi)容設(shè)計(jì)動(dòng)畫的一般步驟常用的動(dòng)畫函數(shù)動(dòng)畫設(shè)計(jì)實(shí)例:走迷宮,flippybird2/65屏幕上的每個(gè)點(diǎn),稱為一個(gè)像素(Pixel),它是構(gòu)成圖形的基本元素。14.1動(dòng)畫的基本原理3/65設(shè)計(jì)動(dòng)畫的一般化實(shí)現(xiàn)步驟如下:while(1)//循環(huán)播放,即循環(huán)顯示不斷更新的圖形{

清屏//system(“cls”)向dos發(fā)送清屏指令,需包含stdlib.h 顯示圖形 延時(shí) //使用Sleep()函數(shù),需包含windows.h 更新圖形}14.1動(dòng)畫的基本原理4/6514.2迷宮游戲intmain(void){charstr[N][M]={"************","*o*","***********","*****","*******","******","******","*******","*******","*******","****","************"};//保存迷宮地圖數(shù)據(jù)

intn=12;Show(str,n);//顯示迷宮

UpdateWithInput(str,n);//與用戶輸入有關(guān)的更新

return0;}14.2迷宮游戲x-1,y-1x-1,yx-1,y+1x,y-1x,yx,y+1x+1,y-1x+1,yx+1,y+1intmain(void){charstr[N][M]={"************","*o*","***********","*****","*******","******","******","*******","*******","*******","****","************"};//保存迷宮地圖數(shù)據(jù)

intn=12;Show(str,n);//顯示迷宮

UpdateWithInput(str,n);//與用戶輸入有關(guān)的更新

return0;}//函數(shù)功能:顯示迷宮地圖voidShow(charstr[][M],intn){inti;for(i=0;i<n;i++)//顯示n行迷宮地圖數(shù)據(jù)

{

puts(str[i]);}}如何走迷宮?voidUpdateWithInput(charstr[][M],intn)//函數(shù)功能:完成與用戶輸入有關(guān)的迷宮更新{intx=1,y=1;//初始位置

intexitX=10,exitY=10;//迷宮出口

charinput;while(x!=exitX||y!=exitY)//判斷是否到達(dá)迷宮出口

{

if(kbhit())//檢測是否有鍵盤輸入,沒有就繼續(xù)循環(huán)

{

input=getch();//從鍵盤獲取輸入

if(input=='a'&&str[x][y-1]!='*')//左移

{

str[x][y]='';y--;str[x][y]='o';}if(input=='d'&&str[x][y+1]!='*')//右移

{

str[x][y]='';y++;str[x][y]='o';}if(input=='w'&&str[x-1][y]!='*')//上移

{

str[x][y]='';x--;str[x][y]='o';}if(input=='s'&&str[x+1][y]!='*')//下移

{

str[x][y]='';x++;str[x][y]='o';}}system("cls");//清屏

Show(str,n);//顯示更新后的迷宮地圖

Sleep(200);//延時(shí)200ms}printf("Youwin!\n");system("PAUSE");}如何自動(dòng)走迷宮?#defineN50#defineM50intflag=0;//flag用來標(biāo)記是否路徑全部走完inta[N][N]={{1,1,1,1,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,0,0,0,0,1},{1,0,1,1,1,1,1,1,1,1,1,1},{1,0,1,0,0,0,1,0,0,0,1,1},{1,0,1,0,1,0,1,0,1,0,1,1},{1,0,1,0,1,0,1,0,1,0,0,1},{1,0,1,0,1,0,1,0,1,0,0,1},{1,0,1,0,1,0,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1,1,0,1},{1,0,0,0,1,0,0,0,1,1,0,0},{1,1,1,1,1,1,1,1,1,1,1,1}};intmain(void){intx1,y1,x2,y2;intn=12,m=12;Show(a,n,m);//顯示初始迷宮

printf("Inputx1,y1,x2,y2:");//輸入入口和出口

scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2);if(Go(x1,y1,x2,y2)==0)//設(shè)置起始點(diǎn)為1,1{

printf("沒有路徑!\n");}else{printf("Youwin!\n");system("PAUSE");}return0;}如何自動(dòng)走迷宮?//函數(shù)功能:顯示迷宮地圖voidShow(inta[][M],intn,intm){inti,j;for(i=0;i<n;++i)//顯示n行m列迷宮地圖數(shù)據(jù)

{

for(j=0;j<m;++j){if(a[i][j]==0){printf("");}elseif(a[i][j]==1){printf("*");}elseif(a[i][j]==2){printf("o");}}printf("\n");}}如何自動(dòng)走迷宮?//函數(shù)功能:自動(dòng)走迷宮intGo(intx1,inty1,intx2,inty2){a[x1][y1]=2;//迷宮入口

system("cls");//清屏

Show(a,12,12);//顯示更新后的迷宮地圖

Sleep(200);//延時(shí)200msif(x1==x2&&y1==y2)//迷宮出口設(shè)置為x2,y2flag=1;if(flag!=1&&a[x1-1][y1]==0)//判斷向上是否有路Go(x1-1,y1,x2,y2);if(flag!=1&&a[x1+1][y1]==0)//判斷向下是否有路Go(x1+1,y1,x2,y2);if(flag!=1&&a[x1][y1+1]==0)//判斷向右是否有路Go(x1,y1+1,x2,y2);if(flag!=1&&a[x1][y1-1]==0)//判斷向左是否有路Go(x1,y1-1,x2,y2);if(flag!=1)a[x1][y1]=0;returnflag;}游戲設(shè)計(jì)要求如下:1)在游戲窗口中顯示從右向左運(yùn)動(dòng)的障礙物,顯示三根柱子墻;2)用戶使用空格鍵控制小鳥向上移動(dòng),以不碰到障礙物為準(zhǔn),即需要從柱子墻的縫隙中穿行,確保隨機(jī)產(chǎn)生的障礙物之間的縫隙大小可以足夠小鳥通過;3)在沒有用戶按鍵操作情況下,小鳥受重力影響會(huì)自行下落,為了不讓小鳥掉下來,需要用戶間歇性地點(diǎn)擊空格鍵讓小鳥往上飛,并躲避途中可能遇到的高低不平的障礙物;4)進(jìn)行小鳥與障礙物的碰撞檢測,如果沒有碰到,則給游戲者加1分。5)如果小鳥碰到障礙物或者超出游戲畫面的上下邊界,則游戲結(jié)束。14.3Flagppybird游戲11/65游戲的第一個(gè)難點(diǎn):如何讓小鳥不會(huì)飛出屏幕?

讓小鳥從左向右運(yùn)動(dòng)的問題就轉(zhuǎn)化為讓柱子從右向左運(yùn)動(dòng)的問題首先使用WindowsAPI中定義的結(jié)構(gòu)體類型COORD來表示字符在控制臺(tái)屏幕上的坐標(biāo)。14.3Flagppybird游戲12/65WindowsAPI中定義的一種結(jié)構(gòu)類型表示一個(gè)字符在控制臺(tái)屏幕上的坐標(biāo)#include<windows.h>

typedefstruct_COORD{ shortX;//horizontalcoordinate shortY;//verticalcoordinate}COORD;//在windows.h中定義#include<windows.h>voidGotoxy(intx,inty)//定位光標(biāo)位置{

COORDpos={x,y};//獲取標(biāo)準(zhǔn)輸出設(shè)備的句柄(HANDLE),即資源的標(biāo)識(shí)

//操作系統(tǒng)通過句柄找到要管理和操作的資源

HANDLEhOutput=GetStdHandle(STD_OUTPUT_HANDLE);//光標(biāo)位置定位到pos

SetConsoleCursorPosition(hOutput,pos);}typedefstruct_COORD{ shortX; shortY;}COORD;COORDpos={x,y};//等價(jià)于COORDpos;pos.X=x;pos.Y=y;利用COORD類型定位光標(biāo)位置使用WindowsAPI函數(shù)GetStdHandle(),從一個(gè)特定的標(biāo)準(zhǔn)設(shè)備(例如標(biāo)準(zhǔn)輸出)獲取標(biāo)識(shí)設(shè)備的句柄(用來標(biāo)識(shí)不同設(shè)備的一個(gè)數(shù)值)使用WindowsAPI函數(shù)SetConsoleCursorPosition()定位光標(biāo)的位置。14.3Flagppybird游戲voidHideCursor(){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFOCursorInfo;GetConsoleCursorInfo(handle,&CursorInfo);//獲取控制臺(tái)光標(biāo)信息

CursorInfo.bVisible=0;//隱藏控制臺(tái)光標(biāo)

SetConsoleCursorInfo(handle,&CursorInfo);//設(shè)置控制臺(tái)光標(biāo)狀態(tài)}避免清屏和反復(fù)刷新屏幕帶來的閃爍效應(yīng)14.3Flagppybird游戲游戲的第二個(gè)難點(diǎn)問題:小鳥與柱子的碰撞檢測問題解決思路是:記錄每根柱子的橫縱坐標(biāo)范圍檢測小鳥當(dāng)前所在位置的橫縱坐標(biāo)是否落入柱子的橫縱坐標(biāo)范圍如果落入,則表示小鳥碰到了墻體14.3Flagppybird游戲14.3Flagppybird游戲typedefstructbird{COORDpos;intscore;}BIRD;//小鳥的初始位置和分?jǐn)?shù)BIRDbird={{22,10},0};Flappybird//3個(gè)柱子的初始位置和高度COORDwall[3]={{40,10},{60,6},{80,8}};flappybirdintmain(void){BIRDbird={{22,10},0};//小鳥的初始位置

COORDwall[3]={{40,10},{60,6},{80,8}};//柱子的初始位置和高度

inti;charch;

while(CheckWin(wall,&bird))//未發(fā)生碰撞{Begin(&bird);//清屏并顯示上下邊界和分?jǐn)?shù)

CheckWall(wall);//顯示柱子

PrtBird(&bird);//顯示小鳥

Sleep(200);

if(kbhit())//檢測到有鍵盤輸入

{ch=getch();//輸入的字符存入chif(ch=='')//輸入的是空格

{bird.pos.Y-=1;//小鳥向上移動(dòng)一格

}}

else//未檢測到鍵盤輸入

{bird.pos.Y+=1;//小鳥向下移動(dòng)一格

}for(i=0;i<3;i++){wall[i].X--;//柱子向左移動(dòng)一格

}}return0;}flappybirdvoidCheckWall(COORDwall[])//顯示柱子{inti;srand(time(NULL));COORDtemp={wall[2].X+DIS,rand()%13+5};//隨機(jī)產(chǎn)生一個(gè)新柱子

if(wall[0].X<10)//超出預(yù)設(shè)的左邊界

{wall[0]=wall[1];//最左側(cè)的柱子消失,第二個(gè)柱子變成第一個(gè)

wall[1]=wall[

溫馨提示

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

評(píng)論

0/150

提交評(píng)論