【实践】关于智能蛇的三次尝试
贪吃蛇是大家耳熟能详的游戏,在开始智能蛇之前,我先简单介绍一下贪吃蛇的游戏规则:蛇可以上下左右进行移动,如果蛇遇到墙壁或者障碍物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 智能制造的三个支点 第一个需要考虑的是推动智能制造的目标是什么.显然,企业追求的是产 ...
- 初试linux编译(ubuntu+vim)+玩转智能蛇
一.初试linux编译(ubuntu+vim) 步骤: ①下载vmware15+ubuntu桌面版映像 ②安装ubuntu ③下载vim+gcc 在ubuntu终端输入: sudo apt-get i ...
- Python编程:从入门到实践——列表简介(第三章+课后答案)
对应书目:Python编程:从入门到实践 列表简介(第三章) 要理解新的编程概念,最佳的方法是尝试在程序中使用它们 Python通过将索引指定为-1,可以让Python返回最后一个列表元素 动手试一试 ...
- 贪吃蛇之智能蛇的实现
历经很长时间,在下终于把贪吃蛇人工控制的版本写好,虽然略显粗糙,但也为自己初步写好一个简单游戏高兴不已.近日,又尝试了智能蛇的实现. 智能蛇与人工蛇很相似,不同之处在于一个不需要手动输入字符,另一个则 ...
- 智能硬件(2)---手机访问智能硬件的三种模式
手机访问智能硬件的三种模式 手机访问智能硬件的三种基本模式:B/S模式.C/S模式.云模式. http://blog.csdn.net/zoomdy/article/details/51594977 ...
- linux 适配电脑内核,Linux内核实践 如何添加网络协议[三]:实现 -电脑资料
内核版本:2.6.34 接上篇<添加网络协议>, 为了用户方便查看brcm设备的工作状态,使用proc文件系统是很好的方 式.一个网络协议模块可以注册到网络空间中register_pern ...
- 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试
系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...
- 使用ThreeJs从零开始构建3D智能仓库——第三章(选中物体与特效)
使用ThreeJs从零开始构建3D智能仓库--第三章 写在前面--目录结构 如何选中物体 选中物体的原理 选中物体的实现 添加选中后的发光特效 HTML更新如下 结束语 写在前面--目录结构 这一章我 ...
- 暑假DIY智能车第三天
暑假DIY智能车第三天 超声波放大电路 微波雷达感应模块HB100 超声波放大电路 微波雷达感应模块HB100 多普勒原理 工作原理 原理图分析 注意事项 软件实现 超声波放大电路 微波雷达感应模块H ...
- TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化
文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...
最新文章
- 深入理解风格迁移三部曲(三)--FUNIT
- java 类的重载_Java自学-类和对象 方法重载
- 5款最适合新手的包管理器
- JDK6u25里添加的按线程统计分配内存量: JMX
- 算法设计与分析——动态规划——数字三角形问题
- 实战GraphQL+express+mysql项目完整demo
- 大智慧公式系统:指标公式
- 基于QT实现的图形软件图片编辑器
- 【Paper-Attack】A Targeted Universal Attack on Graph Convolutional Network
- 【单片机毕业设计】【mcuclub-jj-037】基于单片机的电热毯的设计
- 自学Java day53 使用jvav实现 字典树 数据结构 从jvav到架构师
- fsck.ext3:unable to resolve 'LABLE=/home'
- 题目 1567: 超级玛丽
- 0416 leetcode每日一题 1042. 不邻接植花
- 洞见2020企业服务:“我的平台,你的花开”
- 十一、kotlin的协程(一)
- 解决Maven打包没有依赖jar包问题
- android 数据库查看工具 mac,关于android studio:在MacOS上查看Realm数据库并将adb定义为环境变量...
- 理解设计模式——工厂模式
- 微信小程序全面实战,架构设计 躲坑攻略
热门文章
- 深度学习图像-半自动和自动标注工具
- mbedTLS中的握手建立操作
- Spring Kafka:@KafkaListener 单条或批量处理消息
- php经验之谈,php+mysql经验之谈
- ac68无线网卡 linux驱动下载,华硕ac68驱动|华硕USB-AC68无线网卡驱动下载 V2.1.2.1 官方版 - 比克尔下载...
- CVE-2022-28512 Fantastic Blog CMS 存在SQL注入漏洞
- 新混响预设合集 – Audio Ease Altiverb 7 New Impulse Responses
- 中国近12个月以来的搜索引擎市场份额
- 计算机科学与技术的培养方案,计算机科学与技术专业培养方案2017版.PDF
- ktv无线服务器,KTV无线网络覆盖方案-无死角WIFI信号全覆盖方法