您的位置:首页 > 其它

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

2017-12-20 16:52 246 查看
贪吃蛇是大家耳熟能详的游戏,在开始智能蛇之前,我先简单介绍一下贪吃蛇的游戏规则:蛇可以上下左右进行移动,如果蛇遇到墙壁或者障碍物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
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*寻路算法~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: