貪吃蛇的製作過程中遇到的一些小問題
阿新 • • 發佈:2018-12-27
第一步是介面的設計
首先定義一個二維陣列,做出一個17*17的方陣,每個二維陣列map的座標就是方陣中的座標,然後我們用’‘和‘ ’空格,來定義這些字元,構成一個圖形介面,這個就是貪吃蛇的活動框即活動範圍,如果蛇頭碰到牆壁即‘’則遊戲結束。
如下圖
定義好介面,並printf之後,定義蛇的座標,定義結構體struct snake,代表蛇身蛇頭的座標,並把map地圖上對應座標的字元定義為’X’(蛇身)或‘H’(蛇頭),初始化蛇的長度為5.
然後接下來就遇到困難了,怎麼蛇運動呢?
下面是程式碼
void food() { //生成食物
int x, y;
while (1 ) {
x = (int)(15 * rand() / (RAND_MAX + 1.0)); //隨機產生一組食物座標
y = (int)(15 * rand() / (RAND_MAX + 1.0));
if (map[x][y] == ' ') { //如果是空格則在該處生成食物
map[x][y] = 'O';
//foodx = x; //記錄食物座標
//foody = y;
break;
}
}
}
void move() { //蛇移動
int i, x, y;
int t = sum; //t記錄當前蛇總長度
check(); //移動前檢查按當前方向移動一步後的情況
if (t == sum) { //沒有吃到蘋果
for (i = 0; i < sum - 1; i++) {
if (i == 0) { //蛇尾座標處變成空格,把蛇尾座標變成前一個蛇身的座標
map[A[i].x][A[i].y] = ' ';
A[i].x = A[i + 1].x;
A[i].y = A[i + 1 ].y;
}
else { //每個蛇身座標都變為它前一個蛇身的座標
A[i].x = A[i + 1].x;
A[i].y = A[i + 1].y;
}
map[A[i].x][A[i].y] = 'X'; //把地圖上蛇身座標處的字元設定成‘X’
}
A[sum - 1].x = A[sum - 1].x + dx[A[sum - 1].dir]; //蛇頭按當前方向移動一格
A[sum - 1].y = A[sum - 1].y + dy[A[sum - 1].dir];
map[A[sum - 1].x][A[sum - 1].y] = 'H'; //把地圖上蛇頭座標處的字元設定成‘H’
}
else { //吃到蘋果(sum會加1)
map[A[sum - 2].x][A[sum - 2].y] = 'X'; //把地圖上原蛇頭座標處的字元設定成‘X’
A[sum - 1].x = A[sum - 2].x + dx[A[sum - 2].dir]; //新蛇頭的座標是原蛇頭沿當前方向移動一格後的座標
A[sum - 1].y = A[sum - 2].y + dy[A[sum - 2].dir];
A[sum - 1].dir = A[sum - 2].dir; //新蛇頭方向為原蛇頭的方向
map[A[sum - 1].x][A[sum - 1].y] = 'H'; //把地圖上蛇頭座標處的字元設定成‘H’
food();
}
先判斷是否吃到食物,然後將座標代表的字元進行改變,表面上看起來是蛇在動實際上是地圖上的字元改變,從而致蛇運動。
其中是使用無限迴圈的方式來使蛇不斷運動的,裡面的邏輯關係需要稍微思考一下。
然後是如何轉彎
主要是利用輸入字元對應的數字對座標進行加減乘除,然後改變蛇頭的座標,從而進行轉彎,一下是程式碼
void turn() { //轉彎
if (_kbhit()) {
char dir = _getch(); //讀取輸入的鍵
switch (dir) { //改變方向
case 119: A[sum - 1].dir = (A[sum - 1].dir == 2)?2:0; break;
case 100: A[sum - 1].dir = (A[sum - 1].dir == 3)?3:1; break;
case 115: A[sum - 1].dir = (A[sum - 1].dir == 0)?0:2; break;
case 97: A[sum - 1].dir = (A[sum - 1].dir == 1)?1:3; break;
}
}
}
做完蛇的功能然後就是生成食物了。利用隨機函式生成座標,同時要保證實在方框內的座標,即字元已經被初始化為‘ ’的字元,不可以出現在邊框上或蛇身上。
然後就是吃下食物,在蛇身變化之前,判斷下一個座標上的字元是空格還是食物,如果是食物要在蛇尾多加上一個新的字元‘X’,並使sum即snake_length+1。
接下來是判斷如何結束遊戲,與判斷是否為食物相同,判斷下一個座標是否為‘*’,如果是,則表明遊戲結束,輸出game over。然後隨機按鍵,重新開始遊戲。