修改后的draw_end函数不能正确跳转有文字提示的界面,而是卡在游戏界面,而且并没有在每次选择难度时正确更改蛇的速度,请修改代码的错误部分以使正确运行
时间: 2024-10-17 07:14:05 浏览: 38
idl界面事件处理程序.zip_IDL界面程序_IDl_idl界面事件_idl界面函数_idl程序 教学示例
5星 · 资源好评率100%
为了修复 `draw_end` 函数的问题,并确保在选择难度时正确更改蛇的速度,我们需要对代码进行以下几处修改:
1. **修正 `draw_end` 函数**:确保在游戏结束时能够正确显示提示信息并等待用户输入。
2. **确保难度选择时正确更新速度**:在 `init_game` 函数中正确设置速度。
以下是修改后的代码:
### 修改后的 `draw_end` 函数
```c
void draw_end() {
cleardevice();
setbkcolor(EGERGB(116, 222, 222));
char str[4][30] = {"Game Over", "Score:", "", "Press R to restart"};
sprintf(str[1], "Score: %d", score);
setfont(40, 0, "楷体");
for (int i = 0; i < 4; i++) {
outtextxy(Height / 2 * Interval - 70, Width / 2 * Interval + 50 * i, str[i]);
}
key_msg msg;
bool flag = true;
while (flag) {
if (kbhit()) {
msg = getkey();
if (msg.key == 'r' || msg.key == 'R') {
flag = false;
game_over = false; // 游戏不再处于结束状态
closegraph(); // 关闭当前图形窗口
initgraph(Interval * Width, Interval * Height); // 重新打开图形窗口
int selected_mode = choose(); // 等待用户选择是否开始游戏
if (selected_mode != -1) {
init_game(selected_mode); // 重新初始化游戏
begin_game(selected_mode); // 如果用户选择开始游戏,则开始游戏
}
} else if (msg.key == key_esc && msg.msg == key_msg_down) {
flag = false;
}
}
}
}
```
### 修改后的 `init_game` 函数
```c
void init_game(int mode) {
for (int i = 0; i < Width; i++) {
grid[i][0] = Wall;
grid[0][i] = Wall;
grid[i][Height - 1][i] = Wall;
}
game_over = false;
food_exist = false;
ege_enable_aa(true);
setbkcolor(EGERGB(116, 206, 222));
setcolor(GREEN);
switch (mode) {
case 1: // 简单模式
speed = 110;
break;
case 2: // 中等模式
speed = 70;
break;
case 3: // 困难模式
speed = 30;
break;
}
init_snake();
prod_food();
len = 3;
init_grid();
score = 0;
dir = LEFT; // 重置方向为默认值(向左)
}
```
### 主循环中的 `begin_game` 调用
确保在主循环中调用 `begin_game` 时传递正确的模式参数:
```c
int main() {
initgraph(Interval * Width, Interval * Height);
int selected_mode = choose();
if (selected_mode != -1) {
begin_game(selected_mode); // 根据选中的模式开始游戏
}
getch();
closegraph();
return 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 (current_mode != 0) {
flag = false;
return current_mode;
}
break;
case 'e':
case 'E':
current_mode = 1; // 简单模式
break;
case 'm':
case 'M':
current_mode = 2; // 中等模式
break;
case 'h':
case 'H':
current_mode = 3; // 困难模式
break;
}
}
}
return -1; // 返回-1表示没有有效选择
}
```
通过以上修改,`draw_end` 函数应该能够在游戏结束后正确显示提示信息并等待用户输入,同时在选择不同的难度时正确更新蛇的速度。
阅读全文