c语⾔中ai是什么,C语⾔⼿把⼿教你实现贪吃蛇AI(下)
本⽂实例为⼤家分享了C语⾔实现贪吃蛇AI的具体代码,供⼤家参考,具体内容如下
1. ⽬标
这⼀部分的⽬标是把之前写的贪吃蛇加⼊AI功能,即⾃动的去寻⾷物并吃掉。
2. 控制策略
为了保证蛇不会⾛⼊“死地”,所以蛇每前进⼀步都需要检查,移动到新的位置后,能否到⾛到蛇尾的路径,如果可以,才可以⾛到新的位置;否则在当前的位置寻⾛到蛇尾的路径,并按照路径向前⾛⼀步,开始循环之前的操作,如下图所⽰。这个策略可以⼯作,但是并不⾼效,也可以尝试其他的控制策略,⽐如易⽔寒的贪吃蛇AI
运⾏效果如下:
3. 源代码
需要注意的是,由于mapnode的数据量⽐较⼤,这⾥需要把栈的⼤⼩设置⼤⼀点,如下图所⽰,否则会出现栈溢出的情况。
整个项⽬由以下三个⽂件组成:
a. snake AI.h
#define SNAKE_H_
#include
#include //SetConsoleCursorPosition, sleep函数的头函数#include //time()的头函数
#include //malloc()的头函数
#define N 32 //地图⼤⼩
#define snake_mark '#'//表⽰蛇⾝
#define food_mark '$'//表⽰⾷物
#define sleeptime 50//间隔时间
#define W 10//权重
typedef struct STARNODE{
int x;//节点的x,y坐标
int y;
int G;//该节点的G, H值
int H;
int is_snakebody;//是否为蛇⾝,是为1,否则为0;
int in_open_table;//是否在open_table中,是为1,否则为0;int in_close_table;//是否在close_table中,是为1,否则为0;struct STARNODE* ParentNode;//该节点的⽗节点
} starnode, *pstarnode;
extern starnode (*mapnode)[N + 4];
extern pstarnode opentable[N*N / 2];
extern pstarnode closetable[N*N / 2];
extern int opennode_count;
extern int closenode_count;
/*表⽰蛇⾝坐标的结构体*/
typedef struct SNAKE{
int x; //⾏坐标
int y; //列坐标
struct SNAKE* next;
}snake_body, *psnake;
extern psnake snake;
extern psnake food;
extern psnake nextnode;
void set_cursor_position(int x, int y);
void initial_map();
void initial_mapnode();
void update_mapnode();
void printe_map();
void initial_snake();
void create_food();
int is_food();
void heapadjust(pstarnode a[], int m, int n);
void swap(pstarnode a[], int m, int n);
void crtheap(pstarnode a[], int n);
void heapsort(pstarnode a[], int n);
void insert_opentable(int x1, int y1, pstarnode pcurtnode, psnake endnode); void find_neighbor(pstarnode pcurtnode, psnake endnode);
int search_short_road(psnake snakehead, psnake endnode);
int search_snaketail(psnake snakehead);
c语言游戏贪吃蛇源码void update_snaketail(psnake snakehead);
void snake_move();
psnake create_tsnake();
void snake_control();
#endif
b. source.cpp
#include"Snake AI.h"
/*控制光标的坐标*/
void set_cursor_position(int x, int y)
{
COORD coord = { x, y };//x表⽰列,y表⽰⾏。
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }
/*初始化后的地图为 N列 N/2⾏*/
/*游戏的空间为2⾄N+1列,1⾄N/2⾏*/
void initial_map()
int i = 0;
//打印上下边框(每个■占⽤⼀⾏两列)
for (i = 0; i
{
set_cursor_position(22 * i, 0);
printf("■");
set_cursor_position(22 * i, N / 2 + 1); printf("■");
}
for (i = 0; i
{
set_cursor_position(0, i);
printf("■");
set_cursor_position(N + 2, i);
printf("■");
}
}
//初始化mapnode
void initial_mapnode()
{
int i = 0, j = 0;
for (i = 0; i < N / 2 + 2; i++)
for (j = 0; j < N + 4; j++)
{
mapnode[i][j].G = 0;
mapnode[i][j].H = 0;
mapnode[i][j].in_close_table = 0; mapnode[i][j].in_open_table = 0; mapnode[i][j].is_snakebody = 0; mapnode[i][j].ParentNode = NULL; mapnode[i][j].x = i;
mapnode[i][j].y = j;
}
//初始化mapnode
void update_mapnode()
{
psnake temp = snake;
int x, y;
initial_mapnode();//初始化mapnode while (temp)
{
x = temp->x;
y = temp->y;
mapnode[x][y].is_snakebody = 1;
temp = temp->next;
}
}
void printe_map()
{
psnake temp = snake;
while (temp)
{
set_cursor_position(temp->y, temp->x); printf("%c", snake_mark);
temp = temp->next;
}
if (food)
set_cursor_position(food->y, food->x); printf("%c", food_mark);
set_cursor_position(0, N / 2 + 2);
}
/*初始化蛇⾝*/
/*蛇⾝初始化坐标为(8,5),(8,4), (8,3) */ void initial_snake()
{
int i = 5;//列
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论