1. 程式人生 > >貪吃蛇的製作過程中遇到的一些小問題

貪吃蛇的製作過程中遇到的一些小問題

第一步是介面的設計
首先定義一個二維陣列,做出一個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。然後隨機按鍵,重新開始遊戲。