关于字符游戏——智能蛇

首先我们先看我从网上找的一条智能蛇:
这里写图片描述
(图片来自互联网)
如何才能做出能让其自己运动且至少不会很快死的程序((T_T)!)
以下给出实验情况:
一、实验目的
了解 算法 与 “智能” 的关系
通过算法赋予蛇智能
了解 Linux IO 设计的控制
二、实验环境
Linux Only. 你可以选择 Unbutu、Centos 等发行版。
建议编辑环境 Vim 或 Vscode, 编译 gcc
第一次使用 Linux,建议使用虚拟机。可以使用其他同学准备好的 Vbox 镜像

三、控制输入/输出设备
你知道为什么一行代码要控制在80(字符)列以内? 原因是 … 原来历史上读程序的卡片机只能读80个字符。当然,超过 80 个字符也打不出来阅读了。

那么一个语句超过 80 个字符怎么办? 续行符…

言归正传,早期的输出设备显示器、打印机,输入设备键盘(打字机)都是80列行缓冲顺序输入和输出设备。即你打印文件时,打印机必须等收到行结束符,打印机才会动作。然而,输入/输出随着应用需求不断进化,字符界面控制与管理已经非常标准化了。

由于要使用linux,首先用v-box打开虚拟机(表示上次装了win7后又要装一遍Linux,无语。。)
以下给出上一次中关于一些基本元素的代码函数:
这里写图片描述

以上也是老师提供的,相信上一次你看过我的那些函数,还是和老师有些异同的。
经过老师的课上点拨,我也想试试关于字符贪吃蛇运用ASCII中的字符来代表贪吃蛇。
以下为ASCII码表,我首先尝试了用0000 0100代表食物,然后H代表头部,0001 0110代表身体。(这仅仅是个想法!!)

这里写图片描述

然后就目前而言我的智能蛇代码暂时如下(还未完工):

“`
int len = 5;
int life = 0;
int food = 0;
int Fx = 0, Fy = 0;//食物坐标
int Hx = 1, Hy = 5;//蛇头坐标
int X[SNAKE_MAX_LENGTH]={1,1,1,1,1};//sanke
int Y[SNAKE_MAX_LENGTH]={1,2,3,4,5};//snake
char map[12][12] = {“**”,
XXXXH “,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
**”,};
void snakeMove(int x, int y) {
char ch;
int i;
if ((X[len - 1] - X[len - 2] == -x && Y[len - 1] == Y[len - 2]) || (Y[len - 1] - Y[len - 2] == -y && X[len - 1] == X[len - 2])) {
return;
}//若键盘输入的方向与蛇头方向相反,则什么事都不发生
if (map[X[len - 1] + x][Y[len - 1] + y] == WALL_CELL || map[X[len - 1] + x][Y[len - 1] + y] == SNAKE_BODY) {
life++;
}//若碰到墙壁或者自己就死掉
if (map[X[len - 1] + x][Y[len - 1] + y] == SNAKE_FOOD) {
map[X[len - 1]][Y[len - 1]] = SNAKE_BODY;
map[X[len - 1] + x][Y[len - 1] + y] = SNAKE_HEAD;
len++;
X[len - 1] = X[len - 2] + x;
Y[len - 1] = Y[len - 2] + y;
Hx = X[len - 1];
Hy = Y[len - 1];
food–;
}//碰到食物就增长
else {
map[X[0]][Y[0]] = BLANK_CELL;
for (i = 0; i < len - 1; i++) {
X[i] = X[i + 1];
Y[i] = Y[i + 1];
}
X[len - 1] += x;
Y[len - 1] += y;
Hx = X[len - 1];
Hy = Y[len - 1];
map[Hx][Hy] = SNAKE_HEAD;
for (i = 0; i < len - 1; i++) {
map[X[i]][Y[i]] = SNAKE_BODY;
}
}//没碰到食物

}
void put_money(void) {
if (food == 0) {
srand(time(NULL));
Fx = rand() % 9 + 1;
Fy = rand() % 9 + 1;
if (map[Fx][Fy] == BLANK_CELL) {
map[Fx][Fy] = SNAKE_FOOD;
food++;
}
}
}
void output(void) {
int i, j;
for (i = 0; i < 12; i++) {
for (j = 0; j < 12; j++)
printf(“%c”, map[i][j]);
printf(“\n”);
}
}
void gameover(void) {
printf (“GAME OVER!!!”);
return;
}
char whereGoNext(int Hx, int Hy, int Fx, int Fy) {
int i;
int temp = 0;
int min = 10000;
char moveble[4] = “WASD”;
int distance[4]={0, 0, 0, 0};
distance[0] = abs(Fx - (Hx - 1)) + abs(Fy - Hy);
distance[1] = abs(Fx - Hx) + abs(Fy - (Hy - 1));
distance[2] = abs(Fx - (Hx + 1)) + abs(Fy - Hy);
distance[3] = abs(Fx - Hx) + abs(Fy - (Hy + 1));
if (map[Hx - 1][Hy] == ‘*’ || map[Hx - 1][Hy] == ‘X’)
distance[0] = 9999;
if (map[Hx][Hy - 1] == ‘*’ || map[Hx][Hy - 1] == ‘X’)
distance[1] = 9999;
if (map[Hx + 1][Hy] == ‘*’ || map[Hx + 1][Hy] == ‘X’)
distance[2] = 9999;
if (map[Hx][Hy + 1] == ‘*’ || map[Hx][Hy + 1] == ‘X’)
distance[3] = 9999;
//
printf(“%d %d %d %d \n”,distance[0], distance[1], distance[2], distance[3]);
//
for (i = 0; i < 4; i++) {
if (min > distance[i]) {
temp = i;
min = distance[i];
}
else continue;
}
printf(“%d\n”, min);
return moveble[temp];
}
int main() {
put_money();
output();
while (1) {
put_money();
char ch = whereGoNext(Hx, Hy, Fx, Fy);
//
printf(“%d %d %d %d “,Hx, Hy, Fx, Fy);
printf(“%c”, whereGoNext(Hx, Hy, Fx, Fy));
//
Sleep(100);
switch (ch) {
case ‘A’:
snakeMove(0, -1); break;
case ‘S’:
snakeMove(1, 0); break;
case ‘D’:
snakeMove(0, 1); break;
case ‘W’:
snakeMove(-1, 0); break;
}
system(“cls”);
if (life != 0) {
gameover();
break;
}
if (len == 20) {
printf(“you win!!!”);
break;
}
output();
}
}

求大佬们放过。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值