第14章-簡單的游戲設計_第1頁
第14章-簡單的游戲設計_第2頁
第14章-簡單的游戲設計_第3頁
第14章-簡單的游戲設計_第4頁
第14章-簡單的游戲設計_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

哈爾濱工業大學計算機科學與技術學院蘇小紅

sxh@

第14章簡單的游戲設計第14章學習內容設計動畫的一般步驟常用的動畫函數動畫設計實例:走迷宮,flippybird2/65屏幕上的每個點,稱為一個像素(Pixel),它是構成圖形的基本元素。14.1動畫的基本原理3/65設計動畫的一般化實現步驟如下:while(1)//循環播放,即循環顯示不斷更新的圖形{

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

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

UpdateWithInput(str,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*","***********","*****","*******","******","******","*******","*******","*******","****","************"};//保存迷宮地圖數據

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

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

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

{

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

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

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

{

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

{

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);//延時200ms}printf("Youwin!\n");system("PAUSE");}如何自動走迷宮?#defineN50#defineM50intflag=0;//flag用來標記是否路徑全部走完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)//設置起始點為1,1{

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

{

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");}}如何自動走迷宮?//函數功能:自動走迷宮intGo(intx1,inty1,intx2,inty2){a[x1][y1]=2;//迷宮入口

system("cls");//清屏

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

Sleep(200);//延時200msif(x1==x2&&y1==y2)//迷宮出口設置為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;}游戲設計要求如下:1)在游戲窗口中顯示從右向左運動的障礙物,顯示三根柱子墻;2)用戶使用空格鍵控制小鳥向上移動,以不碰到障礙物為準,即需要從柱子墻的縫隙中穿行,確保隨機產生的障礙物之間的縫隙大小可以足夠小鳥通過;3)在沒有用戶按鍵操作情況下,小鳥受重力影響會自行下落,為了不讓小鳥掉下來,需要用戶間歇性地點擊空格鍵讓小鳥往上飛,并躲避途中可能遇到的高低不平的障礙物;4)進行小鳥與障礙物的碰撞檢測,如果沒有碰到,則給游戲者加1分。5)如果小鳥碰到障礙物或者超出游戲畫面的上下邊界,則游戲結束。14.3Flagppybird游戲11/65游戲的第一個難點:如何讓小鳥不會飛出屏幕?

讓小鳥從左向右運動的問題就轉化為讓柱子從右向左運動的問題首先使用WindowsAPI中定義的結構體類型COORD來表示字符在控制臺屏幕上的坐標。14.3Flagppybird游戲12/65WindowsAPI中定義的一種結構類型表示一個字符在控制臺屏幕上的坐標#include<windows.h>

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

COORDpos={x,y};//獲取標準輸出設備的句柄(HANDLE),即資源的標識

//操作系統通過句柄找到要管理和操作的資源

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

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

CursorInfo.bVisible=0;//隱藏控制臺光標

SetConsoleCursorInfo(handle,&CursorInfo);//設置控制臺光標狀態}避免清屏和反復刷新屏幕帶來的閃爍效應14.3Flagppybird游戲游戲的第二個難點問題:小鳥與柱子的碰撞檢測問題解決思路是:記錄每根柱子的橫縱坐標范圍檢測小鳥當前所在位置的橫縱坐標是否落入柱子的橫縱坐標范圍如果落入,則表示小鳥碰到了墻體14.3Flagppybird游戲14.3Flagppybird游戲typedefstructbird{COORDpos;intscore;}BIRD;//小鳥的初始位置和分數BIRDbird={{22,10},0};Flappybird//3個柱子的初始位置和高度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))//未發生碰撞{Begin(&bird);//清屏并顯示上下邊界和分數

CheckWall(wall);//顯示柱子

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

Sleep(200);

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

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

{bird.pos.Y-=1;//小鳥向上移動一格

}}

else//未檢測到鍵盤輸入

{bird.pos.Y+=1;//小鳥向下移動一格

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

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

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

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

wall[1]=wall[

溫馨提示

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

最新文檔

評論

0/150

提交評論