




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康管理公司合同范例
- 雙經(jīng)銷合同范本
- 單位裝修工程合同范本
- 銷售藥膏合同范本
- 2025年太陽能發(fā)電機(jī)組項(xiàng)目合作計(jì)劃書
- 各類合同范本超全
- 合同范本紙制
- 商鋪的出租合同范本
- 承接糧庫工程合同范本
- 廠房設(shè)備合同范例
- 【企業(yè)盈利能力探析的國內(nèi)外文獻(xiàn)綜述2400字】
- 危急值的考試題及答案
- 工商管理綜合課程設(shè)計(jì)
- 食品安全制度目錄
- 新犯罪學(xué)完整版課件電子教案
- 2025新高考方案一輪物理參考答案與詳解
- 數(shù)字孿生與光伏儲(chǔ)能集成
- 2025屆高考語文復(fù)習(xí):補(bǔ)寫語句+課件
- 文化人類學(xué)第一章課件
- 四川省高職單招汽車類《汽車文化》復(fù)習(xí)備考試題庫(濃縮500題)
- 養(yǎng)牛購料購銷合同范本
評(píng)論
0/150
提交評(píng)論