【实践】关于智能蛇的三次尝试

贪吃蛇是大家耳熟能详的游戏,在开始智能蛇之前,我先简单介绍一下贪吃蛇的游戏规则:蛇可以上下左右进行移动,如果蛇遇到墙壁或者障碍物GAMEOVER,如果蛇吃到钱币长度就增加1。
在此之前我们已经写了一个贪吃蛇的小游戏。现在我们需要做的是让蛇能够自己的动起来,完成任务。
智能蛇的要求如下:贪吃蛇每秒走一步并且能够由最短路径吃到食物。
这个贪吃蛇的智能版我写了三种,依次进化。

第一版智能蛇

首先我们看第一个版本:
简单的思考:
1.首先我们要知道蛇的头部位置和钱币的位置。
2.根据头部位置和钱币位置的坐标差确定行走路径,如果没有障碍物那么就走一个L型或者I型。
3.如果遇到障碍物就随机改变行走方向,然后重新规划线路。

代码如下

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

#define SNAKE_MAX_LENGTH 100
#define SNAKE_HEAD H
#define SNAKE_BODY X 

void start(); //开始游戏
void snakeMove(); //贪吃蛇移动
void put_money(); //随机产生钱的坐标
void move_left(); //左转
void move_right(); //右转
void move_down(); //向下转
void move_up(); //向上转
void create_map(); //产生新的地图
void clear_map(); //清空地图
void snake_moveon(); //蛇继续移动
void print_map(); //打印地图
int if_die(); //判断蛇是否死亡
void snake_eat_money(); //蛇吃到钱之后的变化


char map[12][12] = { //初始地图
    "************",
    "*          *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "************"
};

int snakeX[SNAKE_MAX_LENGTH] = {1,2,3,4,5}; //蛇的初始X坐标
int snakeY[SNAKE_MAX_LENGTH] = {1,1,1,1,1}; //蛇的初始Y坐标
int snake_length = 5; //蛇的初始长度
char snake_direction = 'd'; //蛇的初始方向 
int moneyX; //钱的坐标X
int moneyY; //钱的坐标Y
int distanceX; //钱的X坐标和蛇的头部X坐标之差
int distanceY; //钱的Y坐标和蛇的头部Y坐标之差

void move_right() {
    sleep(1); //停1S
    system("cls"); //清屏
    int i,j,z;
    snake_moveon(); //蛇的身体跟着蛇头走
    snakeX[snake_length-1]++; //蛇头向右走
    clear_map(); //清空地图
    if(!if_die()) { //判断蛇是否死亡
        return;
    }
    snake_eat_money(); //蛇是否吃到钱币
    create_map();   //根据上面所有情况创造地图
    print_map();    //打印地图
}

void move_left() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeX[snake_length-1]--;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();   
    print_map();
}

void move_down() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeY[snake_length-1]++;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();
    print_map();
}

void move_up() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeY[snake_length-1]--;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();   
    print_map();
}



void snake_move_auto() { //蛇自动运行函数
    int i,j;
    distanceX = moneyX - snakeX[snake_length-1]; //坐标之差
    distanceY = moneyY - snakeY[snake_length-1];
    if(snake_direction == 'w') { //判断蛇的方向,根据距离之差的正负决定上下左右的移动方向
        if(distanceY > 0) {
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }   
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }
            }                           
            for(i=0;i<distanceY;i++) {
                if(if_move_down()) {
                    move_down();
                }
                else {
                    move_left();
                    snake_direction = 'a';  
                    snake_move_auto();      
                }
            }
            snake_direction = 's';  
        }
        else if(distanceY < 0) {
            for(i=0;i<-distanceY;i++) {
                if(if_move_up()) {
                    move_up();
                }
                else {
                    move_left();
                    snake_direction = 'a';
                    snake_move_auto();
                }
            }
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();

                    }
                }   
                snake_direction = 'a';  
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }
                snake_direction = 'd';
            }
        }
    }
    if(snake_direction == 's') {
        if(distanceY > 0) {
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_down();
                        snake_direction = 's';
                        snake_move_auto();
                    }
                }   
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_down();
                        snake_direction = 's';
                        snake_move_auto();
                    }
                }
            }                           
            for(i=0;i<distanceY;i++) {
                if(if_move_down()) {
                    move_down();
                }
                else {
                    move_left();
                    snake_direction = 'a';  
                    snake_move_auto();      
                }
            }
            snake_direction = 's';  
        }
        else if(distanceY < 0) {
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_down();
                        snake_direction = 's';
                        snake_move_auto();

                    }
                }   
                for(i=0;i<-distanceY;i++) {
                    if(if_move_up()) {
                        move_up();
                    }
                    else {
                        move_left();
                        snake_direction = 'a';
                        snake_move_auto();
                    }
                }
                snake_direction = 'w';  
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }
                snake_direction = 'd';
            }
        }

    }
    if(snake_direction == 'a') {
        if(distanceY > 0) {
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }   
                for(i=0;i<distanceY;i++) {
                    if(if_move_down()) {
                        move_down();
                    }
                    else {
                        move_left();
                        snake_direction = 'a';  
                        snake_move_auto();      
                    }
                }           
            }

            else if(distanceX > 0) {
                for(i=0;i<distanceY;i++) {
                    if(if_move_down()) {
                        move_down();
                    }
                    else {
                        move_left();
                        snake_direction = 'a';  
                        snake_move_auto();      
                    }
                }
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }

            }                           
            snake_direction = 's';  
        }
        else if(distanceY < 0) {
            for(i=0;i<-distanceY;i++) {
                if(if_move_up()) {
                    move_up();
                }
                else {
                    move_left();
                    snake_direction = 'a';
                    snake_move_auto();
                }
            }
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();

                    }
                }   
                snake_direction = 'a';  
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }
                snake_direction = 'd';
            }
        }
    }
    if(snake_direction == 'd') {
        if(distanceY > 0) {
            if(distanceX < 0) {
                for(i=0;i<distanceY;i++) {
                    if(if_move_down()) {
                        move_down();
                    }
                    else {
                        move_left();
                        snake_direction = 'a';  
                        snake_move_auto();      
                    }
                }

                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }   

            }

            else if(distanceX > 0) {
                for(i=0;i<distanceY;i++) {
                    if(if_move_down()) {
                        move_down();
                    }
                    else {
                        move_left();
                        snake_direction = 'a';  
                        snake_move_auto();      
                    }
                }
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }

            }                           
            snake_direction = 's';  
        }
        else if(distanceY < 0) {
            for(i=0;i<-distanceY;i++) {
                if(if_move_up()) {
                    move_up();
                }
                else {
                    move_left();
                    snake_direction = 'a';
                    snake_move_auto();
                }
            }
            if(distanceX < 0) {
                for(i=0;i<-distanceX;i++) {
                    if(if_move_left()) {
                        move_left();                        
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();

                    }
                }   
                snake_direction = 'a';  
            }
            else if(distanceX > 0) {
                for(i=0;i<distanceX;i++) {
                    if(if_move_right()) {
                        move_right();
                    }
                    else {
                        move_up();
                        snake_direction = 'w';
                        snake_move_auto();
                    }
                }
                snake_direction = 'd';
            }
        }
    }

snake_move_auto();
}

void put_money() { //随机产生钱币的坐标
    while(1) {
        moneyX = rand() % 10 + 1;
        moneyY = rand() % 10 + 1;       
        int i;
        for(i=0;i<snake_length;i++) {
            if(snakeX[i] == moneyX && snakeY[i] == moneyY || (moneyX == 6 && (moneyY == 2 || moneyY == 3 || moneyY == 4 || moneyY == 5 || moneyY == 6)) ) {
                break;
            }           
        }
        if(i == snake_length) {
            return;
        }

    }

} 

void create_map() { //根据情况产生地图
    int i,j,z;
    for(i=1;i<11;i++) {
        for(j=1;j<11;j++) {
            if(j == 6 && (i == 2 || i == 3 || i == 4 || i == 5 || i == 6)) {
                map[i][j] = '*';
            }
            if(i == snakeY[snake_length-1] && (j == snakeX[snake_length-1])) {
                map[i][j] = 'H';
            }
            if(i == moneyY && (j == moneyX)) {
                map[i][j] = '$';
            }
            for(z=0;z<snake_length-1;z++) {
                    map[snakeY[z]][snakeX[z]] = 'X';                
            }

        }
    }   
}

void print_map() { //打印地图
    int i,j;
    for(i=0;i<12;i++) {
        for(j=0;j<12;j++) {
            printf("%c",map[i][j]);
        }
        printf("\n");
    }   
}

void clear_map() { //产生地图前的清空地图
    int i,j;
    for(i=1;i<11;i++) {
        for(j=1;j<11;j++) {
            map[i][j] = ' ';
        }
    }   
}

int if_die() { //判断是否死亡
    int i;
    if(snakeX[snake_length-1] == 0 || snakeX[snake_length-1] == 11 || snakeY[snake_length-1] == 0 || snakeY[snake_length-1] == 11 || (snakeX[snake_length-1] == 6 && (snakeY[snake_length-1] == 2 || snakeY[snake_length-1] == 3 || snakeY[snake_length-1] == 4 || snakeY[snake_length-1] == 5 || snakeY[snake_length-1] == 6))) {
        system("cls");
        printf("game over");
        exit(0);
    }
    for(i=0;i<snake_length-1;i++) {
        if(snakeX[snake_length-1] == snakeX[i] && snakeY[snake_length-1] == snakeY[i]) {
            system("cls");
            printf("game over");
            exit(0);
        }
    }   
    return 1;
}

void snake_moveon() { //蛇身体跟着蛇头走
    int i;
    for(i=0;i<snake_length-1;i++) {
        snakeX[i] = snakeX[i+1];
        snakeY[i] = snakeY[i+1];
    }
}

void snake_eat_money() { //判断蛇头是否吃到钱币
    int i;
    if(snakeX[snake_length-1] == moneyX && snakeY[snake_length-1] == moneyY) {
        map[moneyY][moneyX] = ' ';
        snake_length++;
        for(i=snake_length-1;i>1;i--) {
            snakeX[i] = snakeX[i-1];
            snakeY[i] = snakeY[i-1];
        }    
        put_money();
    }   
}


void snakeMove() { //蛇的移动
    char choice = _getch(); 
    if(choice == 'w' && snake_direction != 'w' && snake_direction != 's') {
        turn_up();      
        snake_direction = choice;       
        snakeMove();
    }
    else if(choice == 's' && snake_direction != 'w' && snake_direction != 's') {    
        turn_down();    
        snake_direction = choice;
        snakeMove();
    }
    else if(choice == 'a' && snake_direction != 'a' && snake_direction != 'd') {    
        turn_left();        
        snake_direction = choice;
        snakeMove();
    }
    else if(choice == 'd' && snake_direction != 'a' && snake_direction != 'd') {
        turn_right();   
        snake_direction = choice;   
        snakeMove();
    }
    else{
        snakeMove();
    }


}

void start() {
    int i,j;
    for(i=0;i<12;i++) {
        for(j=0;j<12;j++) {
                if(i==1 && (j==2||j==3||j==4||j==5||j==1)) {
                    if(j==5) {
                        map[i][j] = 'H';
                    }
                    else {
                        map[i][j] = 'X';
                    }
                }
                printf("%c",map[i][j]);
        }       
        printf("\n");
    }
    put_money();
    snake_move_auto();
    snakeMove();
}

int main() {
    printf("欢迎来到C语言版贪吃蛇~\n");
    printf("按回车键开始游戏\n");
    printf("wsad控制上下左右\n"); 
    while(1){
        if(getchar() == '\n') {
            system("cls");
            start();
            break;  
        }       
    }


}

最简单的一个智能蛇就完成了,但是,运行之后,我发现这里面有很多bug,如下:
1.如上的程序判断障碍物只判断了蛇的前方是否有固态的障碍物,不能判断蛇的前方是否有自己的身体的一部分。
2.这条蛇很有可能把自己卡在死胡同里把自己走死。

第二版智能蛇

所以,我又写了第二个版本的贪吃蛇,思路如下:
1.上一个思路是考虑整条路线蛇的走向,这个思路是蛇每走一步都重新规划行走方向,比如说,蛇向右走时,钱币的位置在蛇的右下角,那么蛇可以先判断是否可以向右走,然后向右继续行进;如果蛇不可以向右走,那么蛇再判断是否可以向下走;如果蛇也不可以向下走,那么再让蛇向上走;如果向上走都不可以,那就gg了……
2.根据第一条的描述,智能蛇的一个很关键步骤在于,判断是否可以向上下左右这四个方向走,所以我们需要写一个函数来判断。我们不妨再设置一个fsnake(伪蛇),然后让这条fsnake上走一步,或者下走一步等等,判断这条伪蛇是否死亡,然后由此来确定真正的蛇是否可以上一步或者下走一步等等。

由此我把之前写的智能蛇代码注释掉,写了一个新的智能蛇程序,代码如下。

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

#define SNAKE_MAX_LENGTH 100
#define SNAKE_HEAD H
#define SNAKE_BODY X 

void start();
void snakeMove();
void put_money();
void turn_left();
void turn_right();
void turn_down();
void turn_up();
void create_map();
void clear_map();
void snake_moveon();
void print_map();
void snake_eat_money();
void fsnake_eat_money(); //伪蛇是否能吃到钱币
void f_snake_moveon(); //伪蛇的移动
void snake_move_auto(); //智能蛇的程序

char map[12][12] = {
    "************",
    "*          *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*     *    *",
    "*          *",
    "*          *",
    "*          *",
    "*          *",
    "************"
};

int snakeX[SNAKE_MAX_LENGTH] = {1,2,3,4,5};
int snakeY[SNAKE_MAX_LENGTH] = {1,1,1,1,1};
int fsnakeX[SNAKE_MAX_LENGTH] = {1,2,3,4,5};
int fsnakeY[SNAKE_MAX_LENGTH] = {1,1,1,1,1};
int snake_length = 5;
char snake_direction = 'd'; //蛇的初始方向 
int moneyX;
int moneyY;
int distanceX;
int distanceY;


void fsnake_moveon() {
    int i;
    for(i=0;i<snake_length-1;i++) {
        fsnakeX[i] = snakeX[i+1];
        fsnakeY[i] = snakeY[i+1];
    }
}

void fsnake_eat_money() {
    int i;
    int fsnake_length = snake_length;
    if(fsnakeX[fsnake_length-1] == moneyX && fsnakeY[fsnake_length-1] == moneyY) {
        fsnake_length++;
        for(i=fsnake_length-1;i>1;i--) {
            fsnakeX[i] = fsnakeX[i-1];
            fsnakeY[i] = fsnakeY[i-1];
        }
    }
}
int f_if_die() {
    int i;
    if(fsnakeX[snake_length-1] == 0 || fsnakeX[snake_length-1] == 11 || fsnakeY[snake_length-1] == 0 || fsnakeY[snake_length-1] == 11 || (fsnakeX[snake_length-1] == 6 && (fsnakeY[snake_length-1] == 2 || fsnakeY[snake_length-1] == 3 || fsnakeY[snake_length-1] == 4 || fsnakeY[snake_length-1] == 5 || fsnakeY[snake_length-1] == 6))) {
        return 1;
    }
    for(i=0;i<snake_length-1;i++) {
        if(fsnakeX[snake_length-1] == fsnakeX[i] && fsnakeY[snake_length-1] == fsnakeY[i]) {
            return 1;
        }
    }   
    return 0;
}

int if_move_down() {
    fsnakeY[snake_length-1] = snakeY[snake_length-1];
    fsnakeY[snake_length-1]++;
    fsnake_moveon();
    fsnake_eat_money();
    return !f_if_die(); 
}

int if_move_up() {
    fsnakeY[snake_length-1] = snakeY[snake_length-1];
    fsnakeY[snake_length-1]--;
    fsnake_moveon();
    fsnake_eat_money();
    return !f_if_die();
}

int if_move_left() {
    fsnakeX[snake_length-1] = snakeX[snake_length-1];
    fsnakeX[snake_length-1]--;
    fsnake_moveon();
    fsnake_eat_money();
    return !f_if_die();
}

int if_move_right() {
    fsnakeX[snake_length-1] = snakeX[snake_length-1];
    fsnakeX[snake_length-1]++;
    fsnake_moveon();
    fsnake_eat_money();
    return !f_if_die();
}

void move_right() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeX[snake_length-1]++;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();   
    print_map();    
}

void move_left() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeX[snake_length-1]--;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();   
    print_map();
}

void move_down() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeY[snake_length-1]++;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();
    print_map();
}

void move_up() {
    sleep(1);
    system("cls");
    int i,j,z;
    snake_moveon();
    snakeY[snake_length-1]--;
    clear_map();
    if(!if_die()) {
        return;
    }
    snake_eat_money();
    create_map();   
    print_map();
}

int s() {
    if(if_move_down()) {
        move_down();
        snake_direction = 's';
        return 1;
    }
    return 0;
}

int a() {
    if(if_move_left()) {
        move_left();
        snake_direction = 'a';
        return 1;
    }
    return 0;
}

int w() {
    if(if_move_up()) {
        move_up();
        snake_direction = 'w';  
        return 1;
    }
    return 0;
}

int d() {
    if(if_move_right()) {
        move_right();
        snake_direction = 'd';
        return 1;   
    }
    return 0;
}

void snake_move_auto() {
    int i,j;
    distanceX = moneyX - snakeX[snake_length-1];
    distanceY = moneyY - snakeY[snake_length-1];

    if(snake_direction == 's' && distanceY > 0 && distanceX >= 0) {       
        for(i=0;i<distanceY;i++) {
            if(s()){
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;
            }

            if(a()) {
                snake_move_auto();
                return;
            }
        }
    }
    else if(snake_direction == 's' && distanceY > 0 && distanceX <= 0) {       
        for(i=0;i<distanceY;i++) {
            if(s()){
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;
            }

            if(d()) {
                snake_move_auto();
                return;
            }
        }
    }
    else if(snake_direction == 's' && distanceY == 0 && distanceX >= 0) {
        if(d()) {
            snake_move_auto();
            return;
        }
        if(s()) {
            snake_move_auto();
            return;
        }
        if(a()) {
            snake_move_auto();
            return;
        }
    }
    else if(snake_direction == 's' && distanceY == 0 && distanceX <= 0) {
        if(a()) {
            snake_move_auto();
            return;
        }
        if(s()) {
            snake_move_auto();
            return;
        }
        if(d()) {
            snake_move_auto();
            return;
        }
    }
    else if(snake_direction == 's' && distanceY < 0 && distanceX >= 0) {
        for(i=0;i<-distanceY;i++) {
            if(d()){
                snake_move_auto();
                return;
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;
            }
        }
    }
    else if(snake_direction == 's' && distanceY < 0 && distanceX <= 0) {
        for(i=0;i<-distanceY;i++) {
            if(a()){
                snake_move_auto();
                return;
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;
            }
        }
    }
    if(snake_direction == 'w' && distanceY > 0 && distanceX >= 0) {
        for(i=0;i<distanceY;i++) {
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'w' && distanceY > 0 && distanceX <= 0) {
        for(i=0;i<distanceY;i++) {
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'w' && distanceY < 0 && distanceX >= 0) {
        for(i=0;i<-distanceY;i++) {
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'w' && distanceY < 0 && distanceX <= 0) {
        for(i=0;i<-distanceY;i++) {
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'w' && distanceY == 0 && distanceX >= 0) {
        if(d()) {
            snake_move_auto();
            return;
        }
        if(w()) {
            snake_move_auto();
            return;
        }
        if(a()) {
            snake_move_auto();
            return;
        }
    }
    else if(snake_direction == 'w' && distanceY == 0 && distanceX <= 0) {
        if(a()) {
            snake_move_auto();
            return;
        }
        if(w()) {
            snake_move_auto();
            return;
        }
        if(d()) {
            snake_move_auto();
            return;
        }
    }
    if(snake_direction == 'a' && distanceX > 0 && distanceY >= 0) {
        for(i=0;i<distanceX;i++) {
            if(s()) {
                snake_move_auto();
                return;
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'a' && distanceX > 0 && distanceY <= 0) {
        for(i=0;i<distanceX;i++) {
            if(w()) {
                snake_move_auto();
                return;
            }
            if(s()) {
                snake_move_auto();
                return;             
            }
            if(a()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'a' && distanceX < 0 && distanceY >= 0) {
        for(i=0;i<-distanceX;i++) {
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;
            }
        }
    }
    else if(snake_direction == 'a' && distanceX < 0 && distanceY <= 0) {
        for(i=0;i<-distanceX;i++) {
            if(a()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;
            }
        }
    }
    else if(snake_direction == 'a' && distanceX == 0 && distanceY >= 0) {
        if(s()) {
            snake_move_auto();
            return;
        }
        if(a()) {
            snake_move_auto();
            return;
        }
        if(w()) {
            snake_move_auto();
            return;
        }
    }
    else if(snake_direction == 'a' && distanceX == 0 && distanceY <= 0) {
        if(w()) {
            snake_move_auto();
            return;
        }
        if(a()) {
            snake_move_auto();
            return;
        }
        if(s()) {
            snake_move_auto();
            return;
        }
    }
    if(snake_direction == 'd' && distanceX > 0 && distanceY >= 0)  {
        for(i=0;i<distanceX;i++) {
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'd' && distanceX > 0 && distanceY <= 0)  {
        for(i=0;i<distanceX;i++) {
            if(d()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'd' && distanceX < 0 && distanceY >= 0) {
        for(i=0;i<-distanceX;i++) {
            if(s()) {
                snake_move_auto();
                return;             
            }
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
        }
    }
    else if(snake_direction == 'd' && distanceX < 0 && distanceY <= 0) {
        for(i=0;i<-distanceX;i++) {
            if(w()) {
                snake_move_auto();
                return;             
            }
            if(s()) {
                snake_move_auto();
                return;             
            }
            if(d()) {
                snake_move_auto();
                return;             
            }
        }
    }   
    else if(snake_direction == 'd' && distanceX == 0 && distanceY >= 0) {
        if(s()) {
            snake_move_auto();
            return;
        }
        if(d()) {
            snake_move_auto();
            return;
        }
        if(w()) {
            snake_move_auto();
            return;
        }
    }
    else if(snake_direction == 'd' && distanceX == 0 && distanceY <= 0) {
        if(w()) {
            snake_move_auto();
            return;
        }
        if(d()) {
            snake_move_auto();
            return;
        }
        if(s()) {
            snake_move_auto();
            return;
        }
    }
    snake_move_auto();

}

void put_money() {
    while(1) {
        moneyX = rand() % 10 + 1;
        moneyY = rand() % 10 + 1;       
        int i;
        for(i=0;i<snake_length;i++) {
            if(snakeX[i] == moneyX && snakeY[i] == moneyY || (moneyX == 6 && (moneyY == 2 || moneyY == 3 || moneyY == 4 || moneyY == 5 || moneyY == 6)) ) {
                break;
            }           
        }
        if(i == snake_length) {
            return;
        }

    }

} 

void create_map() {
    int i,j,z;
    for(i=1;i<11;i++) {
        for(j=1;j<11;j++) {
            if(j == 6 && (i == 2 || i == 3 || i == 4 || i == 5 || i == 6)) {
                map[i][j] = '*';
            }
            if(i == snakeY[snake_length-1] && (j == snakeX[snake_length-1])) {
                map[i][j] = 'H';
            }
            if(i == moneyY && (j == moneyX)) {
                map[i][j] = '$';
            }
            for(z=0;z<snake_length-1;z++) {
                    map[snakeY[z]][snakeX[z]] = 'X';                
            }

        }
    }   
}

void print_map() {
    int i,j;
    for(i=0;i<12;i++) {
        for(j=0;j<12;j++) {
            printf("%c",map[i][j]);
        }
        printf("\n");
    }   
}

void clear_map() {
    int i,j;
    for(i=1;i<11;i++) {
        for(j=1;j<11;j++) {
            map[i][j] = ' ';
        }
    }   
}

int if_die() {
    int i;
    if(snakeX[snake_length-1] == 0 || snakeX[snake_length-1] == 11 || snakeY[snake_length-1] == 0 || snakeY[snake_length-1] == 11 || (snakeX[snake_length-1] == 6 && (snakeY[snake_length-1] == 2 || snakeY[snake_length-1] == 3 || snakeY[snake_length-1] == 4 || snakeY[snake_length-1] == 5 || snakeY[snake_length-1] == 6))) {
        system("cls");
        printf("game over");
        exit(0);
    }
    for(i=0;i<snake_length-1;i++) {
        if(snakeX[snake_length-1] == snakeX[i] && snakeY[snake_length-1] == snakeY[i]) {
            system("cls");
            printf("game over");
            exit(0);
        }
    }   
    return 1;
}

void snake_moveon() {
    int i;
    for(i=0;i<snake_length-1;i++) {
        snakeX[i] = snakeX[i+1];
        snakeY[i] = snakeY[i+1];
    }
}

void snake_eat_money() {
    int i;
    if(snakeX[snake_length-1] == moneyX && snakeY[snake_length-1] == moneyY) {
        map[moneyY][moneyX] = ' ';
        snake_length++;
        for(i=snake_length-1;i>1;i--) {
            snakeX[i] = snakeX[i-1];
            snakeY[i] = snakeY[i-1];
        }    
        put_money();
    }   
}

void start() {
    int i,j;
    for(i=0;i<12;i++) {
        for(j=0;j<12;j++) {
                if(i==1 && (j==2||j==3||j==4||j==5||j==1)) {
                    if(j==5) {
                        map[i][j] = 'H';
                    }
                    else {
                        map[i][j] = 'X';
                    }
                }
                printf("%c",map[i][j]);
        }       
        printf("\n");
    }
    put_money();
    snake_move_auto();
    snakeMove();
}

int main() {
    printf("欢迎来到C语言版贪吃蛇~\n");
    printf("按回车键开始游戏\n");
    printf("wsad控制上下左右\n"); 
    while(1){
        if(getchar() == '\n') {
            system("cls");
            start();
            break;  
        }       
    }


}

第二个版本的蛇智能了很多,但还是没有解决一个问题,当智能蛇长到一定程度之后,蛇会把自己困住,然后陷进死胡同。
这该怎么办呢?

第三版智能蛇

其实解决方法很简单,我们发现,蛇头每走一步,蛇尾就会空出一格来,所以要是蛇头一直追着蛇尾走,那么贪吃蛇就永远不会死。如果贪吃蛇规划不出可以走的路线,那么贪吃蛇不妨先追随自己的尾巴,等贪吃蛇可以规划出吃钱币的路线后,再去吃钱币。
这样结合一二三版本的贪吃蛇,我们可以写出一个更智能的贪吃蛇,因为博主太懒,所以不想写了,大家可以自己尝试一下哦~

另外可以研究一下A*寻路算法~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值