最近刷leetcode學資料結構,閒下來了想著自己做個遊戲玩玩,於是想到了小時候玩的貪吃蛇,因此決定實踐,用了一天的時間終於完成,有很多地方都是邊寫邊改,以後還是先規劃好然後依次寫完,養成良好的習慣,並且為了保證封裝性,每乙個類的屬性都應該是私有屬性
分析:
1.小彭(蛇)需要乙個地圖移動,並且這個地圖不可能是無限大的,因此用乙個char型的二維陣列來表示map[25][50]來表示地圖,並且地圖的周圍一圈用 # 來圍住表示地圖邊界
*2.小彭 本身需要座標來表示位置,由許多節組成,那麼這每一節都包含乙個座標,頭部在地圖中由 @ 來表示 身體部分用 來表示 因此寫乙個結構體point,其中包含x,y,蛇就由point型別的陣列組成
小彭由幾個部分組成,我們來進行拆分:
第一點、畫小彭
因為小彭需要在地圖中被顯示出來,所以在進行繪畫畫面時我們要先畫出小彭
第二點、小彭是否還存活
這需要判斷小彭的頭有沒有與自己的身體相撞,也就是自噬,還需要判斷有沒有撞牆,即其頭部座標有沒有到牆壁
第三點、小彭有沒有吃到食物(此處要把小彭作為食物的友元類,才能訪問到食物的座標)
如果小彭吃到了食物,就是小彭此時的頭部座標與食物的座標重合,將地圖中食物此時的符號修改為空格,代表食物已經被吃掉,而且小彭是需要增長的,這就代表我們需要在類中有乙個小彭的靜態變數代表小彭現在的長度,並以此為依據來進行畫小彭的操作
第四點、小彭的移動
在貪吃蛇中,如果我們不進行操作,蛇也是會自動向前運動的,小彭也是同理,因此我們設定乙個char佇列用來存鍵盤是否有進行操作,如果鍵盤按到了 wasd就將這些鍵位入隊,然後從對頭開始來依次改變小彭頭部方向
第五點、小彭的方向
用乙個point型的變數來代表其頭部目前指向的方向:有四個狀態(1,0)(-1,0)(0,1)(0,-1)分別代表著向上、向下、向右、向左的移動方向,小彭此時的行進狀態就以這個為準,移動過程其實就是後面的每一節到其之前的那一節的座標,然後蛇頭向著目前的方向移動乙個座標即可
新學習的地方:
1.使用system(「cls」)清屏再重構畫面,導致畫面閃爍
2.利用了kbhit()判斷鍵盤是否發生敲擊,ch=getch()來讀取輸入的字元,並且不用在介面顯示
#include
#include
//字串
#include
#include
//數學
#include
//精度控制
#include
//字串
#include
//容器
#include
//演算法
#include
//用system("cls")清屏
#include
//用於鍵盤操作
#include
//棧#include
#include
#include
using
namespace std;
void
startpic()
;class
food
;class
snake
;void
createmap
(char imap[25]
[50],
int mapsize)
;//初始化地圖
void
gameover()
;//遊戲結束
void
drawhuamian()
;//畫出蛇,食物和地圖
void
startgame()
;//遊戲開始
char map[25]
[50];
int source =0;
queue<
char
> direction;
void
gameover()
}system
("cls");
startpic()
;}else
}void
startpic()
else
if(a ==2)
else
if(a ==3)
}class
food
void
panduanfood()
}};void
createmap
(char imap[25]
[50])
}}for(
int i =
0; i <
25; i++
)else
cout << imap[i]
[j];}}
}struct point
;class
snake
; mysnake[1]
=;mysnake[2]
=;snakehead.x =0;
snakehead.y =1;
snakesize =3;
}~snake()
void
drawsnake()
}void
movesnake()
else
if(p ==
's'&& snakehead.x ==0)
else
if(p ==
'a'&& snakehead.y ==0)
else
if(p ==
'd'&& snakehead.y ==0)
} map[mysnake[snakesize -1]
.x][mysnake[snakesize -1]
.y]=
' ';
//將map中原本尾巴的位置變為空
for(
int i = snakesize -
1; i >=
1; i--);
} mysnake[0]
=;}void
is_eatfood
(food &f1)
; map[f1.x]
[f1.y]
=' '
;//食物已經被吃掉}}
bool
is_life()
for(
int i =
1; i < snakesize; i++)}
return
true;}
protected
: point mysnake[
100]
;//蛇最多有100節,用於存座標
int snakesize;
//蛇目前的節數
point snakehead;
//蛇的方向由awsd控制};
void
drawhuamian
(food &f, snake &s1)
void
startgame()
}drawhuamian
(f1,s1);}
if(!s1.
is_life()
)}intmain()
c 實現貪吃蛇
include include include include include include include include include word square color 7 義方向 define key up 72 define key down 80 define key left 75...
貪吃蛇 c 實現
週末無聊,嘗試寫了下貪吃蛇。先上 include include include include include includeusing namespace std define up 72 define down 80 define left 75 define right 77 struct ...
C 實現貪吃蛇
vs 2015 easyx 蛇能上下左右移動 蛇能吃食物 能判斷蛇的死亡 蛇的長度,每節蛇的座標,蛇移動的方向 蛇初始化,移動,改變方向,吃食物,畫蛇,蛇是否死亡 食物的座標,食物是否被吃掉 初始化食物,新的食物,畫食物 因為蛇吃食物時需要知道食物的座標,所以需要獲得食物座標的方法 因為蛇吃食物後需...