-1

我有一个简单的小型控制台游戏,它严重依赖用户输入在游戏板上移动。最初,我们实现标准输入并处理每次移动都必须按 Enter 键;但是,我们现在正在研究特定于平台的用户输入方法,因此我们可以坚持按字符而不是等待输入键。

为此,我们已经像这样设置了我们的环境:

#if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS_)
    #define PLATFORM_NAME "windows" // Windows
    #include <conio.h>
#elif defined(__APPLE__) || defined(__linux__)
    #define PLATFORM_NAME "unix"
#endif

我们计划在_getch()检测到 Windows 平台时使用,否则getchar()用于基于 unix 的平台。

目前我们的输入调用设置如下:

void handleKeybinds() {
    char ascii = 0;
    if (PLATFORM_NAME == "windows") {
        ascii = tolower(_getch());
    } else {
        system("/bin/stty raw");
        ascii = tolower(getchar());
        system("/bin/stty cooked");
    }
    //move player
}

这在 Windows 上编译时完全正常(查看 conio.h 如何兼容)但是,_getch()由于 conio 不包含在 linux 服务器上的头文件中,因此会导致未定义。我们如何让编译器在除 windows 之外的任何东西上完全忽略这一行,类似于标题仅conio.h在 windows 系统上包含时的方式。

谢谢!

4

1 回答 1

0

感谢 BessieTheCow 的帮助!我的用户输入在两个平台上都有效!正如上面在他们的评论中提到的,我已将平台定义检查移至记录输入的位置,这允许编译器忽略备用平台上未声明的方法!

char GameBoard::getInputs() {
    char ascii = 0;
    #if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS_)
        ascii = tolower(_getch());
    #else
        system("/bin/stty raw");
        ascii = tolower(getchar());
        system("/bin/stty cooked");
    #endif

    return ascii;
}

谢谢您的帮助!

于 2020-06-01T20:45:24.613 回答