为什么交换机总是默认运行? (包括休息;包括在内)

时间:2014-06-17 22:26:33

标签: c++ windows switch-statement

C ++新手尝试在2D阵列上制作简单的文字游戏。

当我使用switch语句时,如图所示。无论发生什么,它都将始终打印默认值。

在其他主题和论坛中,我发现它可能与getch()有关,并且它会返回char以及\n

我已经尝试了一个小时,但我无法解决这个问题。我使用getch()的原因是:C++ change canonical mode in windows(供参考)。

我现在的部分代码:

//Set up game field
generateField();
setPlayerStart();

//printGameInfo(); TO BE MADE

//Start game while loop
int userInput;

do{
    //system("cls"); DISABLED FOR TESTING PURPOSES
    printField();
    userInput = getch();

    switch(userInput){
        case 72:{ //ARROW UP
            cout << "1What" << endl; //ALSO FOR TESTING PURPOSES
            break;
        }

        case 80:{ //ARROW DOWN
            cout << "2What" << endl;
            break;
        }

        case 75:{ //ARROW LEFT
            cout << "3What" << endl;
            break;
        }

        case 77:{ //ARROW RIGHT
            cout << "4What" << endl;
            break;
        }

        case 113:{ //"q"
            return false; //Quit game
        }

        default:{
            cout << "Default..." << endl;
        }
    }
} while(userInput != 5);

2 个答案:

答案 0 :(得分:4)

由于这是Windows,因此您可以使用 ReadConsoleInput来读取关键事件。我已将部分分成函数,但我并不认为handleInput的返回语义非常好。

#include <iostream>
#include <stdexcept>
#include <windows.h>

HANDLE getStdinHandle() {
    HANDLE hIn;
    if ((hIn = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
        throw std::runtime_error("Failed to get standard input handle.");
    }

    return hIn;
}

WORD readVkCode(HANDLE hIn) {
    INPUT_RECORD rec;
    DWORD numRead;
    while (ReadConsoleInput(hIn, &rec, 1, &numRead) && numRead == 1) {
        if (rec.EventType == KEY_EVENT && rec.Event.KeyEvent.bKeyDown) {
            return rec.Event.KeyEvent.wVirtualKeyCode;
        }
    }

    throw std::runtime_error("Failed to read input.");
}

bool handleInput(WORD vk) {
    switch (vk) {
        case VK_UP:
            std::cout << "up\n";
            break;

        case VK_DOWN:
            std::cout << "down\n";
            break;

        case VK_LEFT:
            std::cout << "left\n";
            break;

        case VK_RIGHT:
            std::cout << "right\n";
            break;

        case 'Q': //it's Windows; ASCII is safe
            return true;
    }

    return false;
}

int main() {
    try {
        auto hIn = getStdinHandle();

        while (auto vk = readVkCode(hIn)) {
            if (handleInput(vk)) {
                return 0;
            }
        }
    } catch (const std::exception &ex) {
        std::cerr << ex.what();
        return 1;
    }
}

其他有用的链接:

答案 1 :(得分:4)

嗯,我想你已经忘记了如何接收扩展密钥..

扩展键时带有0xe0,功能键(F1-F12)带有0x00

改变它

userInput = getch();

userInput = getch();
if (userInput == 0xe0) // for extended keys
{
    userInput = getch();
}
else if (userInput == 0x00) // for function keys
{
    userInput = getch();
}