C语言: 贪吃蛇异常退出

C语言: 贪吃蛇

标签: C语言 贪吃蛇

by 小威威


这个贪吃蛇是作业来着,所以按照作业的要求做的,只在12*12的区域移动。在放代码之前,我要说一下我在做贪吃蛇的时候遇到的非常隐蔽的BUG:就是已经实现了贪吃蛇,在吃食物的时候,有的时候程序会出现异常,即贪吃蛇.exe遇到问题需要退出。其实,这主要是栈溢出导致的。那哪里栈溢出了呢?

你可以检查一下生成随机食物那一部分代码,你是否用了递归?
如果有,那问题就出在这了。解决方法就是将递归改成while循环,注意将srand((unsigned)time(NULL))放在循环外。

为什么要这样做呢?因为随机数字时以秒为单位产生,即一秒产生一组随机数字,然而,倘若你用递归,产生的随机数字不符合要求而再次调用此函数时,用的时间远远小于1s,随机数字并没有改变,即是此时的随机数依旧是不符合的所以它会继续递归,最终导致栈溢出(因为CPU执行的速度很快,不到1s就已经把栈填满了)

我的代码没有改成while循环,确实有点瑕疵,不过为了赶交作业嘛~

还有一个问题要说明一下:就是一定要自己思考,争取自己把贪吃蛇做出来。遇到不懂的就去查,而不是一味看别人的代码。比如:我想实现清屏,我就去查清屏函数怎么用,而不是看别人的贪吃蛇代码照搬照用。再如,别人的代码中有kbhit()和getch(),而我们想要的是读取键盘输入的值,只需要getch(),根本不需要kbhit()。你就不能照抄别人的,把kbhit()也给写上去,因为你不知道kbhit究竟有什么用。当你用getch()函数编写出贪吃蛇代码,发现只能通过按键来实现贪吃蛇移动,不能实现贪吃蛇自动移动,我们就会想到,怎样让我的贪吃蛇在我没有按键盘时保持原来的方向继续移动,通过查询我们就知道了kbhit()函数就是发挥这个作用,我们也就理所当然的将这个函数用到我们的代码中去。还有其他小细节阿如怎么产生随机食物阿,rand()后的%有什么作用阿…这些都要通过思考,转变成自己的知识,再应用到贪吃蛇代码,如此,当你完成了贪吃蛇代码后,你就会觉得收获颇丰,而不是吐槽这份作业是多么多么地坑!!!

下面放代码:

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

# define SNAKE_MAX_LENGTH 20
# define SNAKE_HEAD 'H'
# define SNAKE_BODY 'X'
# define BLANK_CELL ' '
# define SNAKE_FOOD '$'
# define WALL_CELL '*'

void snakemove(int, int);  // Achieve the snake's movement
void put_money(void);  // Achieve the random money occurring
void output(void); // Print the array of map
void gameover(void); // Stop the game and print "game over"

char map[12][13] = {
    "************",
    "*XXXXH     *",
    "*          *",
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值