C语言控制台贪吃蛇游戏水果无法显示问题排查求助
贪吃蛇水果无法显示问题原因及修复方案
问题原因
- 未移动光标到水果坐标就打印:生成
fruitx和fruity后没有调用gotoxy(fruitx, fruity)移动控制台光标到水果位置,直接打印的*会输出到上一次光标停留的位置(也就是最后一次画边界的坐标),用户无法看到正确位置的水果。 - 打印判断逻辑错误:代码中
if (i == fruitx) printf("*")里的i是for循环的局部变量,循环结束后i的值为18,只有随机生成的fruitx等于18时才会触发打印,而你的游戏边界最大为17,等于18的水果直接在边界外,几乎不会触发打印逻辑。 - 随机数种子未初始化:调用
rand()前没有设置随机数种子,每次启动游戏生成的水果坐标都是固定值,容易出现异常。 - 水果坐标范围错误:用
rand()%20生成的坐标范围是019,而你的游戏可用区域是116,很容易生成到边界外,用户无法看到。
修复代码
// 第一步:在startscr函数开头添加随机种子初始化 void startscr() { srand((unsigned int)time(NULL)); // 初始化随机数种子,保证每次水果位置不同 system("mode con cols=100 lines=40"); start: // 原有代码保持不变 } // 第二步:替换为修正后的make_stage函数 void make_stage() { for (int i = 1; i <= 17; i++) { gotoxy(i, 1); printf("#"); gotoxy(1, i); printf("#"); gotoxy(17, i); printf("#"); gotoxy(i, 17); printf("#"); } x = height / 2; y = width / 2; // 生成1~16范围内的坐标,不会超出边界 fruitx = rand() % 16 + 1; fruity = rand() % 16 + 1; score = 0; // 移动光标到水果位置后打印 gotoxy(fruitx, fruity); printf("*"); }
后续开发提示
你后续要实现连击得分规则,只需要在每次吃到水果时用clock()记录当前时间戳,下次吃到水果时计算两次的时间差,再对应乘不同的得分系数即可。
内容的提问来源于stack exchange,提问作者Andrew Choi
相关产品推荐
相关产品推荐

