greedysnake 貪喫蛇

大一上學期軟導的貪喫蛇代碼,當時實現了很久,努力自己實現了大部分,
另外參考了師兄給的代碼,最終才完整實現,但是沒有實現自動的部分


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

void turnUp(void);
void turnDown(void);
void turnLeft(void);
void turnRight(void);
void put_money(void);
void output(void);
void gameover(void);

int X[20] = {1, 2, 3, 4, 5};
int Y[20] = {1, 1, 1, 1, 1};
int snakeLength = 5;
int game = 0;

char map[13][13] =              //  直接打印遊戲版面    
      {"************",
      "*XXXXH     *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "*          *",
      "************"};

void put_money(void) {
    int i = 0, j = 0;
    srand(time(NULL));
    while (map[i][j] == 'X'||map[i][j] == 'Y'||map[i][j] == '*') {  //  如果生成的$所在的位置不當,則重新生成 
        i = rand()%10 + 1;       //  生成隨機數使$出現 
        j = rand()%10 + 1;
    }
    map[i][j] = '$';
    return;
} 

void output(void) {
    system("cls");   //  實現清屏的功能  每走一步清屏並將遊戲版面輸出 
    int i, j; 
    printf("A -> left;  D -> right;  W -> up;  S -> down, then press enter\n" );
    for (i = 0; i < 12; i++)
    for (j = 0; j < 12; j++) {
    printf("%c", map[i][j]);
    if (j == 11) printf("\n");
    }
    return;
}
/* 實現每一步的動作:
以turnup 爲例,其他的類似:
IF position of head after movement is not wallsell or bodysell THEN
    IF position of head after movement is money THEN
    Put the head to the money
    ELSE
    Put the head up one step
    Set the last bodysell to be empty
    move every bodysell to the bodysell in front of it
    END IF
ELSE
    gameover
END IF  
*/
void turnUp() {
    int i, sy, sx;
    if ((Y[snakeLength - 1] - 1) == 0||map[Y[snakeLength - 1] - 1][X[snakeLength - 1]] == 'X') {
        gameover();
    } else if (map[Y[snakeLength - 1] - 1][X[snakeLength - 1]] == '$') {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1] - 1][X[snakeLength - 1]] = 'H';
        snakeLength += 1;
        Y[snakeLength - 1] = Y[snakeLength - 2] - 1;
        X[snakeLength - 1] = X[snakeLength - 2];
        put_money();
        output();
    } else {
        map[Y[snakeLength - 1] - 1][X[snakeLength - 1]] = 'H';
        sx = X[snakeLength - 1];
        sy = Y[snakeLength - 1];
        Y[snakeLength - 1] -= 1;
        for (i = 0; i < snakeLength - 1; i++) {
            if (i == 0) map[Y[0]][X[0]] = ' ';
            if (i == snakeLength - 2) {
                Y[i] = sy;
                X[i] = sx;
            } else {
                X[i] = X[i + 1];
                Y[i] = Y[i + 1]; 
            }
            map[Y[i]][X[i]] = 'X';
        }
        output();
    }
    return;
}

void turnDown() {
    int i, sx, sy;
    if ((Y[snakeLength - 1] + 1) == 11||map[Y[snakeLength - 1] + 1][X[snakeLength - 1]] == 'X') {
        gameover();
    } else if (map[Y[snakeLength - 1] + 1][X[snakeLength - 1]] == '$') {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1] + 1][X[snakeLength - 1]] = 'H';
        snakeLength += 1;
        Y[snakeLength - 1] = Y[snakeLength - 2] + 1;
        X[snakeLength - 1] = X[snakeLength - 2];
        put_money();
        output();
    } else {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1] + 1][X[snakeLength - 1]] = 'H';
        sx = X[snakeLength - 1];
        sy = Y[snakeLength - 1];
        Y[snakeLength - 1] += 1;
        for (i = 0; i < snakeLength - 1; i++) {
            if (i == 0) map[Y[0]][X[0]] = ' ';
            if (i == snakeLength - 2) {
                X[i] = sx;
                Y[i] = sy;
            } else {
            Y[i] = Y[i + 1];
            X[i] = X[i + 1];
            }
            map[Y[i]][X[i]] = 'X';
        }
        output();
    }
    return;
}

void turnLeft() {
    int i, sx, sy;
    if ((X[snakeLength - 1] - 1) == 0||map[Y[snakeLength - 1]][X[snakeLength - 1] - 1] == 'X') {
        gameover();
    } else if (map[Y[snakeLength - 1]][X[snakeLength - 1] - 1] == '$') {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1]][X[snakeLength - 1] - 1] = 'H';
        snakeLength += 1;
        X[snakeLength - 1] = X[snakeLength - 2] - 1;
        Y[snakeLength - 1] = Y[snakeLength - 2];
        put_money();
        output();
    } else {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1]][X[snakeLength - 1] - 1] = 'H';
        sx = X[snakeLength - 1];
        sy = Y[snakeLength - 1];
        X[snakeLength - 1] -= 1;
        for (i = 0; i < snakeLength - 1; i++) {
            if (i == 0) map[Y[0]][X[0]] = ' ';
            if (i == snakeLength - 2) {
               X[i] = sx;
               Y[i] = sy;
            } else {   
            X[i] = X[i + 1];
            Y[i] = Y[i + 1];
            }
            map[Y[i]][X[i]] = 'X';
        }
        output();
    }
    return;
}

void turnRight() {
    int i, sx, sy;
    if ((X[snakeLength - 1] + 1) == 11||map[Y[snakeLength - 1]][X[snakeLength - 1] + 1] == 'X') {
        gameover();
    } else if (map[Y[snakeLength - 1]][X[snakeLength - 1] + 1] == '$') {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1]][X[snakeLength - 1] + 1] = 'H';
        snakeLength += 1;
        X[snakeLength - 1] = X[snakeLength - 2] + 1;
        Y[snakeLength - 1] = Y[snakeLength - 2];
        put_money();
        output();
    } else {
        map[Y[snakeLength - 1]][X[snakeLength - 1]] = 'X';
        map[Y[snakeLength - 1]][X[snakeLength - 1] + 1] = 'H';
        sx = X[snakeLength - 1];
        sy = Y[snakeLength - 1];
        X[snakeLength - 1] += 1;
        for (i = 0; i < snakeLength - 1; i++) {
            if (i == 0) map[Y[0]][X[0]] = ' ';
            if (i == snakeLength - 2) {
                X[i] = sx;
                Y[i] = sy;
            } else {
            X[i] = X[i + 1];
            Y[i] = Y[i + 1];
            }
            map[Y[i]][X[i]] = 'X';
        }
        output();
    }
    return;
}

void gameover(void) {
    game = 1;
    printf("Game Over!\n");
    return; 
}

int main() {
    int flag = 1;
    put_money();
    output();
    char ch;
    while (flag) {
        scanf("%c", &ch);
        if (ch == 'A') {
        turnLeft(); 
        }
        if (ch == 'D') {
        turnRight();
        }
        if (ch == 'W') {
        turnUp();
        }
        if (ch == 'S') {
        turnDown();
        }
        if (game == 1)
        flag = 0;
    }
    return 0;
} 
/* 僞代碼:
While not gameover Do
    Get char
   IF char is A THEN
      turn left
   END IF
   IF char is D THEN
      turn right
   END IF
   IF char is W THEN
      turn up
   END If
   IF char is S THEN
      turn down
   END IF
END WHILE 
*/

自己實現的遊戲,挺激動的當時,把代碼貼到這裏,或許以後有用.

中間的部分,四個方向的實現方法其實都是一樣的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章