【实践】关于智能蛇的三次尝试
2017-12-20 16:52
246 查看
贪吃蛇是大家耳熟能详的游戏,在开始智能蛇之前,我先简单介绍一下贪吃蛇的游戏规则:蛇可以上下左右进行移动,如果蛇遇到墙壁或者障碍物GAMEOVER,如果蛇吃到钱币长度就增加1。
在此之前我们已经写了一个贪吃蛇的小游戏。现在我们需要做的是让蛇能够自己的动起来,完成任务。
智能蛇的要求如下:贪吃蛇每秒走一步并且能够由最短路径吃到食物。
这个贪吃蛇的智能版我写了三种,依次进化。
简单的思考:
1.首先我们要知道蛇的头部位置和钱币的位置。
2.根据头部位置和钱币位置的坐标差确定行走路径,如果没有障碍物那么就走一个L型或者I型。
3.如果遇到障碍物就随机改变行走方向,然后重新规划线路。
代码如下
最简单的一个智能蛇就完成了,但是,运行之后,我发现这里面有很多bug,如下:
1.如上的程序判断障碍物只判断了蛇的前方是否有固态的障碍物,不能判断蛇的前方是否有自己的身体的一部分。
2.这条蛇很有可能把自己卡在死胡同里把自己走死。
1.上一个思路是考虑整条路线蛇的走向,这个思路是蛇每走一步都重新规划行走方向,比如说,蛇向右走时,钱币的位置在蛇的右下角,那么蛇可以先判断是否可以向右走,然后向右继续行进;如果蛇不可以向右走,那么蛇再判断是否可以向下走;如果蛇也不可以向下走,那么再让蛇向上走;如果向上走都不可以,那就gg了……
2.根据第一条的描述,智能蛇的一个很关键步骤在于,判断是否可以向上下左右这四个方向走,所以我们需要写一个函数来判断。我们不妨再设置一个fsnake(伪蛇),然后让这条fsnake上走一步,或者下走一步等等,判断这条伪蛇是否死亡,然后由此来确定真正的蛇是否可以上一步或者下走一步等等。
由此我把之前写的智能蛇代码注释掉,写了一个新的智能蛇程序,代码如下。
第二个版本的蛇智能了很多,但还是没有解决一个问题,当智能蛇长到一定程度之后,蛇会把自己困住,然后陷进死胡同。
这该怎么办呢?
这样结合一二三版本的贪吃蛇,我们可以写出一个更智能的贪吃蛇,因为博主太懒,所以不想写了,大家可以自己尝试一下哦~
另外可以研究一下A*寻路算法~
在此之前我们已经写了一个贪吃蛇的小游戏。现在我们需要做的是让蛇能够自己的动起来,完成任务。
智能蛇的要求如下:贪吃蛇每秒走一步并且能够由最短路径吃到食物。
这个贪吃蛇的智能版我写了三种,依次进化。
第一版智能蛇
首先我们看第一个版本:简单的思考:
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 19a25 (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*寻路算法~
相关文章推荐
- 由表单验证说起,关于在C#中尝试链式编程的实践
- 从百度运维实践谈“基于机器学习的智能运维”
- 来自滴滴、微博、唯品会、魅族、点评关于高可用架构的实践分享
- 关于java使用javacomm20-win32实践总结
- CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享
- 关于数字化学习的理论与实践
- 关于触屏智能手机的操作简单说明,安致机型。
- 整理网上的一些关于sharepoint编码方面的最佳实践
- 诸葛io , 面向数据智能时代的大数据实践(下)
- 关于"\r","\n","\r\n"区别的实践
- 360儿童智能手表的产品实践真知
- Java 编程中关于异常处理的 10 个最佳实践
- 关于Smartphone的智能手机键盘输入法的疑惑
- 关于Javascript解析XML跨浏览器的尝试
- 关于16位的OS尝试(1)
- javascript模块化实践——尝试require.js
- 关于TCP/IP的三次握手和四次挥手解释
- 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式
- 关于c++ 智能指针及 循环引用的问题
- 自我学习与实践---关于VS2008安装部署的学习