贪吃蛇是大家耳熟能详的游戏,在开始智能蛇之前,我先简单介绍一下贪吃蛇的游戏规则:蛇可以上下左右进行移动,如果蛇遇到墙壁或者障碍物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); //停1Ssystem("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  智能制造的三个支点 第一个需要考虑的是推动智能制造的目标是什么.显然,企业追求的是产 ...

  2. 初试linux编译(ubuntu+vim)+玩转智能蛇

    一.初试linux编译(ubuntu+vim) 步骤: ①下载vmware15+ubuntu桌面版映像 ②安装ubuntu ③下载vim+gcc 在ubuntu终端输入: sudo apt-get i ...

  3. Python编程:从入门到实践——列表简介(第三章+课后答案)

    对应书目:Python编程:从入门到实践 列表简介(第三章) 要理解新的编程概念,最佳的方法是尝试在程序中使用它们 Python通过将索引指定为-1,可以让Python返回最后一个列表元素 动手试一试 ...

  4. 贪吃蛇之智能蛇的实现

    历经很长时间,在下终于把贪吃蛇人工控制的版本写好,虽然略显粗糙,但也为自己初步写好一个简单游戏高兴不已.近日,又尝试了智能蛇的实现. 智能蛇与人工蛇很相似,不同之处在于一个不需要手动输入字符,另一个则 ...

  5. 智能硬件(2)---手机访问智能硬件的三种模式

    手机访问智能硬件的三种模式 手机访问智能硬件的三种基本模式:B/S模式.C/S模式.云模式. http://blog.csdn.net/zoomdy/article/details/51594977  ...

  6. linux 适配电脑内核,Linux内核实践 如何添加网络协议[三]:实现 -电脑资料

    内核版本:2.6.34 接上篇<添加网络协议>, 为了用户方便查看brcm设备的工作状态,使用proc文件系统是很好的方 式.一个网络协议模块可以注册到网络空间中register_pern ...

  7. 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  8. 使用ThreeJs从零开始构建3D智能仓库——第三章(选中物体与特效)

    使用ThreeJs从零开始构建3D智能仓库--第三章 写在前面--目录结构 如何选中物体 选中物体的原理 选中物体的实现 添加选中后的发光特效 HTML更新如下 结束语 写在前面--目录结构 这一章我 ...

  9. 暑假DIY智能车第三天

    暑假DIY智能车第三天 超声波放大电路 微波雷达感应模块HB100 超声波放大电路 微波雷达感应模块HB100 多普勒原理 工作原理 原理图分析 注意事项 软件实现 超声波放大电路 微波雷达感应模块H ...

  10. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...

最新文章

  1. 深入理解风格迁移三部曲(三)--FUNIT
  2. java 类的重载_Java自学-类和对象 方法重载
  3. 5款最适合新手的包管理器
  4. JDK6u25里添加的按线程统计分配内存量: JMX
  5. 算法设计与分析——动态规划——数字三角形问题
  6. 实战GraphQL+express+mysql项目完整demo
  7. 大智慧公式系统:指标公式
  8. 基于QT实现的图形软件图片编辑器
  9. 【Paper-Attack】A Targeted Universal Attack on Graph Convolutional Network
  10. 【单片机毕业设计】【mcuclub-jj-037】基于单片机的电热毯的设计
  11. 自学Java day53 使用jvav实现 字典树 数据结构 从jvav到架构师
  12. fsck.ext3:unable to resolve 'LABLE=/home'
  13. 题目 1567: 超级玛丽
  14. 0416 leetcode每日一题 1042. 不邻接植花
  15. 洞见2020企业服务:“我的平台,你的花开”
  16. 十一、kotlin的协程(一)
  17. 解决Maven打包没有依赖jar包问题
  18. android 数据库查看工具 mac,关于android studio:在MacOS上查看Realm数据库并将adb定义为环境变量...
  19. 理解设计模式——工厂模式
  20. 微信小程序全面实战,架构设计 躲坑攻略

热门文章

  1. 深度学习图像-半自动和自动标注工具
  2. mbedTLS中的握手建立操作
  3. Spring Kafka:@KafkaListener 单条或批量处理消息
  4. php经验之谈,php+mysql经验之谈
  5. ac68无线网卡 linux驱动下载,华硕ac68驱动|华硕USB-AC68无线网卡驱动下载 V2.1.2.1 官方版 - 比克尔下载...
  6. CVE-2022-28512 Fantastic Blog CMS 存在SQL注入漏洞
  7. 新混响预设合集 – Audio Ease Altiverb 7 New Impulse Responses
  8. 中国近12个月以来的搜索引擎市场份额
  9. 计算机科学与技术的培养方案,计算机科学与技术专业培养方案2017版.PDF
  10. ktv无线服务器,KTV无线网络覆盖方案-无死角WIFI信号全覆盖方法