C语言每日一题——第五天
第五天
今天小明觉得自己又可以了!于是他决定继续实现游戏开发,这次从玩家行为控制入手。
在长度无限、宽度为9的地图场景中,我们可以控制角色向左右移动,移动后会留下轨迹,该轨迹保留两回合。此外,角色初始位置为第5格,输入q
可以退出游戏。
输入
每回合获取输入,l
代表向左移动,r
代表向右移动,q
表示退出游戏。
输出
回合开始前应打印地图,地图内容为前两次的轨迹(开始行动前按位置为5处理)。当输入不正确时,应当作出提示。
运行示例
---+-------
--+--------
-+---------
<l>Lift or <r>Right (Q to quit):l
--+--------
-+---------
+----------
<l>Lift or <r>Right (Q to quit):l
You cannot go left!
-+---------
+----------
+----------
<l>Lift or <r>Right (Q to quit):r
+----------
+----------
-+---------
<l>Lift or <r>Right (Q to quit):r
+----------
-+---------
--+--------
<l>Lift or <r>Right (Q to quit):0
Unknown command <0>.
-+---------
--+--------
--+--------
<l>Lift or <r>Right (Q to quit):q
进程已结束,退出代码0
提示
连续获取输入时,第二次可能拿到上一次输入时按下回车键产生的“换行符”。可以通过以下代码避免scanf
获取错误的内容:
scanf("%c", &command);
getchar(); // “拿走”换行符
关键
流程控制实战。
解答
我们可以发现,在打印地图时出现了大量重复代码。我们也可以使用函数来避免代码重复。
#include <stdio.h>
int main() {
char command;
int log_1 = 5, log_2 = 5, place = 5;
int i;
while (1) { // 游戏主循环
// 打印地图
printf("\n");
// 轨迹 1
for (i = 0; i < log_1; i++) {
printf("-");
}
printf("+");
for (; i < 10; i++) {
printf("-");
}
printf("\n");
// 轨迹 2
for (i = 0; i < log_2; i++) {
printf("-");
}
printf("+");
for (; i < 10; i++) {
printf("-");
}
printf("\n");
// 当前位置
for (i = 0; i < place; i++) {
printf("-");
}
printf("+");
for (; i < 10; i++) {
printf("-");
}
printf("\n");
// 调整轨迹
log_1 = log_2;
log_2 = place;
// 获取指令
printf("<l>Lift or <r>Right (Q to quit): ");
scanf("%c", &command);
getchar(); // “拿走”换行符
//读取指令
if (command == 'l') {
// 向左移动
if (place == 0) { // 判断能否向左
// 不能
printf("You cannot go left!\n");
continue;
} else {
// 能
place -= 1;
}
} else if (command == 'r') {
// 向右移动
if (place == 9) { // 判断能否向右
// 不能
printf("You cannot go right!\n");
continue;
} else {
// 能
place += 1;
}
} else if (command == 'q') {
// 退出游戏
break;
} else {
// 输入了未知的命令
printf("Unknown command <%c>.\n", command);
continue;
}
}
return 0;
}