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;
}
posted @ 2022-10-01 20:38  风吹云动  阅读(142)  评论(0编辑  收藏  举报