修改完难度之后,当游戏结束按r重新开始的时候,选择好难度之后,按s游戏无法开始,程序无响应,给出修改的代码
时间: 2024-10-17 13:14:38 浏览: 16
从提供的代码来看,`begin_game()` 函数是在 `main()` 被调用的,而难度的选择和游戏重启逻辑则在 `choose()` 和 `draw_welcome()` 中实现。当玩家希望重新开始游戏时,会关闭并重新开启绘图窗口,并再次显示欢迎界面供玩家确认游戏难度。如果玩家已经选择了游戏难度,在按下 's' 或 'S' 后应当直接启动游戏。
但是有一个可能的问题点在于 `choose()` 方法里有这么一段逻辑:
```c
case 's': case 'S':
if (current_mode != 0) {
flag = false;
return current_mode;
}
break;
```
这里的逻辑是说只有在玩家选择了有效的难度后按下 's' 才能开始游戏。因此如果在重新开始游戏时不满足这个条件,即 `current_mode` 仍然等于初始设置的 0,那么游戏将不会开始。解决这个问题的方法就是确保 `choose()` 在重新开始游戏时总是返回一个正确的难度级别。
为此我们可以调整一下 `choose()` 方法的行为,在玩家重新开始游戏时强制设定一个已选择的状态。以下是修正后的部分代码:
```c
int choose() {
key_msg msg;
int current_mode = 0; // 初始模式设为未选择
bool flag = true;
while (is_run() && flag) {
draw_welcome(current_mode);
delay_fps(60);
if (kbhit()) {
msg = getkey();
switch (msg.key) {
case 's': case 'S':
// 添加检查判断游戏是否结束且要重新开始
if (game_over) {
flag = false;
return current_mode;
}
else if (current_mode != 0) {
flag = false;
return current_mode;
}
break;
case 'e': case 'E':
current_mode = EASY;
break;
case 'm': case 'M':
current_mode = MEDIUM;
break;
case 'h': case 'H':
current_mode = HARD;
break;
}
}
}
return -1; // 返回-1表示没有有效选择
}
```
上述代码增加了对 `game_over` 标志位的检测,使得即使没有事先通过按键 e/m/h 来选择难度,只要游戏结束了并且玩家按下 's' 就可以使用最后选定的难度来重新开始游戏。请注意,这里的 `EASY`, `MEDIUM`, `HARD` 应该替换为你实际定义的整数值(如 1, 2, 3)。此外,还需保证在 `draw_welcome()` 中正确更新了难度显示。
阅读全文