#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<time.h>
const char Shead = '@';//蛇头
const char Sbody = '#';//蛇身
const char Sfood = '*';//食物
const char Snode = '.';//地图的每一个node
const int High = 8;//地图的高
const int Long = 16;//地图的宽度
char GameMap[High][Long];//地图
int Key; //按键保存
int Sum = 1;//蛇的结束
int Over = 0; //蛇的生命(死亡)
int dy[4] = {0,0,-1,1};//上下左右
int dx[4] = {1,-1,0,0};
struct Snake //定义蛇的结构体
{
int x;
int y;//位置
int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右
}Snake[High*Long] //蛇的最大大小(node)
void Initial();//地图的初始化
void Create_Food(); //随机构造食物
void Show();//刷新并显示地图
void Button();//取出按键并且判断方向
void Move();// 蛇的移动
void Check_Border();//检查蛇头是否越界
void Check_Head(int x,int y);
int main(void)
{
Initial();
show();
return 0;
}
void Initial()//地图的初始化
{
int i,j;
int hx,hy;
system("title 贪吃蛇");//窗口的标题
memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.'
system("cls");
srand(time(0));//随即的某个种子
hx = rand()%Long;//产生随即的蛇头
hy = rand()%High;
GameMap[hx][hy] = Shead; //待测试
Snake[0].x = hx;//待测试
Snake[0].y = hy;//初始化随即的蛇头
Snake[0].now = -1;//初始化方向
Create_Food();//随即生成食物
for(i = 0;i < High;i++) //地图的显示
{
for(j = 0;j < Long;j++)
pritnf("%c",GameMap[i][j]);
printf("\n");
}
printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
printf("按任意方向键开始游戏\n");
getch();//接受一个按键
Button();//取出输入的按键,并且判断方向
}
void Create_Food()
{
int fx,fy;
while(1)
{
fx = rand()%High;
fy = rand()%Long;
if(GameMap[fx][fy] == '.')//不能出现在蛇的身上
{
GameMap[fx][fy] = Sfood;
break;
}
}
}
void show()//刷新显示地图
{
int i,j;
while(1)
{
sleep(500);//延迟半秒刷新一次地图,1000为1s
Button();//判断方向
Move(); //
if(over)
{
printf("贪吃蛇死亡!\n");
printf("再来一次吧!\n");
getchar();
break;
}
system("cls");//清空地图并且显示地图
for(i = 0;i < High;i++)
{
for(j = 0;j <Long;j++)
{
printf("%c",GameMap[i][j]);
printf("\n");
}
}
printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
pritnf("按任意方向键开始游戏\n");
}
}
void Button()
{
if(kbhit =! 0) //kbhit检测是否输入按键,若有则返回一个非零值。
{
while(kbhit =! 0) //可能存在许多的按键,要都取完,以最后一个为主
key = getch;
switch(key)
{
case 75: Snake[0].now = 0;/*左*/
break;
case 77: Snake[0].now = 1;/*右*/
break;
case 72: Snake[0].now = 2;/*上*/
break;
case 80: Snake[0].now = 3;/*下*/
break;
}
}
}
void Move()//蛇的移动
{
int i,x,y;
int t =sum;//保存蛇的节数
x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';//前进后设置蛇头为空
Snake[0].x = Snake[0].x + dx[Snake[0].now];//蛇头的移动
Snake[0].y = Snake[0].y + dy[Snake[0].now];
Check_Border();//判断是否越界
Check_Head(); //判断蛇头的目前坐标参数
if(sum = t)//如果未吃到食物,移动
{
for(i = 1;i < sum; i++)
{
if(i == 1) //尾节点设置为空再移动
GameMap[ Snake[i].x ][ Snake[i].y ] = '.';
if(i = sum - 1)
{
Snake[i].x = x;
Snake[i].y = y;
Snake[i].now = Snake[0].now;
}
else
{
Snake[i].x = Snake[i+1].x;
Snake[i].y = Snake[i+1].y;
Snake[i].now = Snake[i+1].now;
}
GameMap[Snake[i].x][Snake[i].y] = '#';
}
}
void Check_Border() //检查蛇头是否越界
{
if(Snake[0].x < 0 || Snake[0].x >= High
|| Snake[0].y < 0 || Snake[0].y >= Long)
over = 1;
}
void Check_Head()
{
if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空
GameMap[ Snake[0].x ][ Snake[0].y ] = '@';
else
if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物
{
GameMap[ Snake[0].x ][ Snake[0].y ] = '@';
Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个
Snake[sum].y = y;
Snake[sum].now = Snake[0].now;
GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';
sum++;
Create_Food(); //食物吃完了马上再产生一个食物
}
else
over = 1;
}
贪吃蛇语法有问题 求各位大神帮帮忙
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- tookkke 2016-03-13 06:19关注
错误有点多,这里不一一列举,主要是很多变量名打错,如声明的Sum,下面使用时却用了sum,还有kbhit是函数,却不加括号。
除了语法的问题,还有一些算法上的,出生地点可能直接就判定失败,方向输入有问题(这里修改了下),还有个最大的问题,就是蛇尾不跟着一起动啊,出来了就直接停在那里了啊,还有建议改成回车后直接开始下一回合,否则每次都要重启很烦的有没有,写出这样长的代码,也算是很有毅力了,加油吧!#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<time.h> #include <windows.h> const char Shead = '@';//蛇头 const char Sbody = '#';//蛇身 const char Sfood = '*';//食物 const char Snode = '.';//地图的每一个node const int High = 8;//地图的高 const int Long = 16;//地图的宽度 char GameMap[High][Long];//地图 int Key; //按键保存 int Sum = 1;//蛇的结束 int Over = 0; //蛇的生命(死亡) int dy[4] = {0,0,-1,1};//上下左右 int dx[4] = {1,-1,0,0}; struct Snake //定义蛇的结构体 { int x; int y;//位置 int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右 }Snake[High*Long]; //蛇的最大大小(node) void Initial();//地图的初始化 void Create_Food(); //随机构造食物 void Show();//刷新并显示地图 void Button();//取出按键并且判断方向 void Move();// 蛇的移动 void Check_Border();//检查蛇头是否越界 void Check_Head(int x,int y); int main(void) { Initial(); Show(); return 0; } void Initial()//地图的初始化 { int i,j; int hx,hy; system("title 贪吃蛇");//窗口的标题 memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.' system("cls"); srand(time(0));//随即的某个种子 hx = rand()%Long;//产生随即的蛇头 hy = rand()%High; GameMap[hx][hy] = Shead; //待测试 Snake[0].x = hx;//待测试 Snake[0].y = hy;//初始化随即的蛇头 Snake[0].now = -1;//初始化方向 Create_Food();//随即生成食物 for(i = 0;i < High;i++) //地图的显示 { for(j = 0;j < Long;j++) printf("%c",GameMap[i][j]); printf("\n"); } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); printf("按任意方向键开始游戏\n"); getch();//接受一个按键 Button();//取出输入的按键,并且判断方向 } void Create_Food() { int fx,fy; while(1) { fx = rand()%High; fy = rand()%Long; if(GameMap[fx][fy] == '.')//不能出现在蛇的身上 { GameMap[fx][fy] = Sfood; break; } } } void Show()//刷新显示地图 { int i,j; while(1) { Sleep(500);//延迟半秒刷新一次地图,1000为1s Button();//判断方向 Move(); // if(Over) { printf("贪吃蛇死亡!\n"); printf("再来一次吧!\n"); getchar(); break; } system("cls");//清空地图并且显示地图 for(i = 0;i < High;i++) { for(j = 0;j <Long;j++) { printf("%c",GameMap[i][j]); //printf("\n");/************************************这里严重错误 ***************************************/ } printf("\n"); } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); printf("按任意方向键开始游戏\n"); } } void Button() { if(kbhit() != 0) //kbhit检测是否输入按键,若有则返回一个非零值。 { while(kbhit() != 0) //可能存在许多的按键,要都取完,以最后一个为主 Key = getch(); switch(Key) { case 's':case 'S': Snake[0].now = 0;/*下*/ break; case 'w':case 'W': Snake[0].now = 1;/*上*/ break; case 'a':case 'A': Snake[0].now = 2;/*左*/ break; case 'd':case 'D': Snake[0].now = 3;/*右*/ break; } } } void Move()//蛇的移动 { int i,x,y; int t =Sum;//保存蛇的节数 x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';//前进后设置蛇头为空 Snake[0].x = Snake[0].x + dx[Snake[0].now];//蛇头的移动 Snake[0].y = Snake[0].y + dy[Snake[0].now]; Check_Border();//判断是否越界 Check_Head(x,y); //判断蛇头的目前坐标参数 if(Sum = t)//如果未吃到食物,移动 { for(i = 1;i < Sum; i++) { if(i == 1) //尾节点设置为空再移动 GameMap[ Snake[i].x ][ Snake[i].y ] = '.'; if(i = Sum - 1) { Snake[i].x = x; Snake[i].y = y; Snake[i].now = Snake[0].now; } else { Snake[i].x = Snake[i+1].x; Snake[i].y = Snake[i+1].y; Snake[i].now = Snake[i+1].now; } GameMap[Snake[i].x][Snake[i].y] = '#'; } } } void Check_Border() //检查蛇头是否越界 { if(Snake[0].x < 0 || Snake[0].x >= High || Snake[0].y < 0 || Snake[0].y >= Long) Over = 1; } void Check_Head(int x,int y) { if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空 GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; else if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物 { GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; Snake[Sum].x = x; //新增加的蛇身为蛇头后面的那个 Snake[Sum].y = y; Snake[Sum].now = Snake[0].now; GameMap[ Snake[Sum].x ][ Snake[Sum].y ] = '#'; Sum++; Create_Food(); //食物吃完了马上再产生一个食物 } else Over = 1; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 求京东批量付款能替代天诚
- ¥15 slaris 系统断电后,重新开机后一直自动重启
- ¥15 51寻迹小车定点寻迹
- ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
- ¥15 关于vue2中methods使用call修改this指向的问题
- ¥15 idea自动补全键位冲突
- ¥15 请教一下写代码,代码好难
- ¥15 iis10中如何阻止别人网站重定向到我的网站
- ¥15 滑块验证码移动速度不一致问题
- ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含