C语言做贪吃蛇,不知道哪里出错…

vonnie_ 2018-04-23 05:34:01
程序有时候能正常执行,有时候执行后报错…


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h >
#include <time.h>


#define ERROR 0
#define OK 1

//游戏窗口
#define frameX 4
#define frameY 4
#define f_height 20
#define f_width 20
void start();

typedef struct Snake //链表控制
{
int x;
int y;
struct Snake *next;
int count; //食物个数
int speed; //运行速度
int length; //长度
}Snake,*SNake;

typedef struct FOod //食物的坐标
{
int x;
int y;
}FOod;

void gotoxy(int x, int y) //光标函数,指定到某一位置
{
COORD coord; //定义一个坐标结构变量,表示一个字符在控制台屏幕上的坐标
HANDLE hscr; //定义一个句柄
coord.X = x; //给坐标赋值
coord.Y = y;
hscr = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄(就是显示器)
//定义了一个句柄变量hscr,将其赋值为GetStdHandle((STD_OUTPUT_HANDLE)),即标准输出的句柄
SetConsoleCursorPosition(hscr, coord); //定位光标位置的函数,设置控制台光标的到指定坐标
}

void gameover(SNake snake)
{
system("CLS");
gotoxy(30,15);
printf("GAME OVER");
gotoxy(30,17);
printf("恭喜你获得了%d积分!",snake->count);

Sleep(600);

}

void make_frame() //设定游戏窗口
{
gotoxy(frameX,frameY);
printf(" ");
gotoxy(frameX+2*f_width,frameY);
printf(" ");
gotoxy(frameX,frameY+f_height);
printf(" ");
gotoxy(frameX+2*f_width,frameY+f_height);
printf(" ");
int i;
gotoxy(frameX+1,frameY);
for(i=1;i<2*f_width-1;i++)
printf("-");

gotoxy(frameX+1,frameY+f_height);
for(i=1;i<2*f_width-1;i++)
printf("-");

for(i=1;i<f_height;i++) //f_width=2*f_weight
{
gotoxy(frameX,frameY+i);
printf("|");
gotoxy(frameX+2*f_width,frameY+i);
printf("|");
}

}


void init_snack(SNake &snake) //构建链表(初始化蛇)
{
snake=(SNake)malloc(sizeof(snake));
SNake p,q,k;
q=(SNake)malloc(sizeof(snake));
p=(SNake)malloc(sizeof(snake));
snake->next=NULL;
snake->count=0;
snake->length=3;
q=snake;

p->x=frameX+2;
p->y=frameY+f_height/2;
q->next=p;
q=p;
int i;
for(i=1;i<snake->length;i++)
{
p=(SNake)malloc(sizeof(snake));
p->x=q->x;
p->y=q->y-1;
q->next=p;
q=p;
}
q->next=NULL;
}

void print_snake(SNake snake) //打印蛇
{
int i;
SNake p;
p=snake->next;
gotoxy(p->x,p->y); //蛇头
printf("¤");
p=p->next;
while(p!=NULL) //蛇尾
{
gotoxy(p->x,p->y);
printf("⊙");
p=p->next;
}
}

void initFood(SNake snake,FOod &food) //随机产生食物
{
srand((unsigned)time(NULL));
SNake p;
while(1)
{

food.x=rand() % (f_width-1); //产生0-f_width-1的随机数 20
food.y=rand()%f_height; //产生0-f_height的随机数 20
if(food.x==0||food.y==0) continue;
food.x=2*food.x+ frameX;
food.y=food.y+frameY;
p=(SNake)malloc(sizeof(snake));
p=snake->next;

while(p!=NULL)
{
if(p->x==food.x&&p->y==food.y) break;
p=p->next;
}
if(p==NULL)
{
gotoxy(food.x,food.y);
printf("⊙");
break;
}

}
}

void headInsert(SNake &snake,int x,int y) //添头
{
SNake q;
q=(SNake)malloc(sizeof(Snake));
q->x=x;
q->y=y;
q->next=snake->next;
snake->next=q;
}

void noteat2(SNake &snake) //没吃到食物 去尾
{
SNake p,q;
q=(SNake)malloc(sizeof(Snake));
p=(SNake)malloc(sizeof(Snake));
p=snake;
while(p->next->next!=NULL)
{
p=p->next;
}
q=p->next; //尾
gotoxy(q->x,q->y);
printf(" ");
p->next=NULL;
free(q);
}

void eat(SNake &snake,int x,int y) //吃到食物
{
snake->count++;
snake->length++;
headInsert(snake,x,y);
}

int is_knock(int x,int y) //是否撞墙
{
if((x>=frameX&&x<=frameX+2*f_width&&y==frameY)||(x>=frameX&&x<=frameX+2*f_width&&y==frameY+f_height)||(x==frameX&&y<=frameY+f_height&&y>=frameY)||(x==frameX+2*f_width&&y<=frameY+f_height&&y>=frameY))
return OK; // 撞了
else return ERROR;
}

int is_eatself(SNake snake,int x,int y)
{
SNake p;
p=snake->next;
while(p!=NULL)
{
if(p->x==x&&p->y==y) return OK; //吃到了自己
p=p->next;
}
return ERROR;
}

void input(SNake &snake) //方向控制
{
char ch1=80;
SNake p;
int x,y,speed=600;
FOod food;
initFood(snake,food); //随机产生食物
while(1)
{
p=snake->next; //找蛇头

if(kbhit()) //判断是否有键按下
{
getch();
if(kbhit())
{
ch1=getch(); //上下左右没有ASCII码
}
}
switch(ch1)
{
case 72: //上
x=p->x;y=p->y-1;break;
case 80: //下
x=p->x;y=p->y+1;break;
case 75: //左
x=p->x-2;y=p->y;break;
case 77: //右
x=p->x+2;y=p->y;break;
default:break;
}
if(is_knock(x,y)||is_eatself(snake,x,y) ) //撞墙或者吃到自己
{ gameover(snake);break;}
else if(x==food.x&&y==food.y) //吃到食物
{
eat(snake,x,y);
initFood(snake,food);
}
else //没吃到食物
{
noteat2(snake); //去尾
headInsert(snake,x,y); //添头
}
print_snake(snake);
Sleep(speed);

}
}

void start()
{
SNake snake;
FOod food;
init_snack(snake);
print_snake(snake);
make_frame(); //游戏窗口
input(snake);
}

int main()
{
system("title 贪吃蛇小游戏");
start();
}
...全文
1175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
@风轻云淡_ 2018-12-04
  • 打赏
  • 举报
回复
void noteat2(SNake &snake)    //没吃到食物 去尾 
{
SNake p, q;
q = (SNake)malloc(sizeof(Snake));
p = (SNake)malloc(sizeof(Snake));
p = snake;
while (p->next->next != NULL)
{
p = p->next;
}
q = p->next; //尾
gotoxy(q->x, q->y);
printf(" ");
p->next = NULL;
//free(q);//这里去掉好像就没问题了
}
Moti_31 2018-12-04
  • 打赏
  • 举报
回复
逻辑上没有问题,有可能是边界或者食物刷新,吃了食物之后有可能出错吧
https://blog.csdn.net/Messi_31/article/details/82079691 看一下这个
qq_33601473 2018-10-09
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/392201633
boy_going 2018-10-09
  • 打赏
  • 举报
回复
老铁,你这c中有引用吗,怎么看见你的参数老是设置引用,你这么做不会报错吗
天外怪魔 2018-05-24
  • 打赏
  • 举报
回复
麻烦具体说下,如何操作会报错?
赵4老师 2018-05-23
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
leetow2006 2018-05-23
  • 打赏
  • 举报
回复
都是牛人!!
zilaishuichina 2018-04-24
  • 打赏
  • 举报
回复
贪吃蛇 仅供参考

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧