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);
答案 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();
}