我的键盘命中为什么评估错误

时间:2018-04-22 18:34:54

标签: c++ if-statement getch kbhit

我是编写蛇游戏的C ++ noob。整个程序完美地绘制了板,水果和蛇头,但是我似乎无法通过键盘命中功能使蛇头坐标发生变化。当通过输入函数获取蛇形运动的键盘敲击时,看起来if(kbhit)在运行程序时评估为false,我的错误是什么以及如何让蛇头移动?

感谢。

#include <iostream>
#include <stdlib.h> 
#include <time.h>
#include <windows.h>
#include <conio.h>
using namespace std;

int X, Y, fruitX, fruitY;
enum eDir { STOP = 1, UP = 2, DOWN = 3, RIGHT = 4, LEFT = 5 }; //declare variables
eDir direction;
const int height = 20;
const int width = 20;
int board[height][width];
bool gameOver;

void setup()
{
    gameOver = false;
    srand(time(NULL));          // initilize game set up
    fruitX = (rand() % width);
    fruitY = (rand() % height);
    X = height / 2;
    Y = width / 2;
    direction = STOP;
    int board[height][width];
};

void draw()
{
    system("cls");

    for (int i = 0; i < width + 2; i++)
        cout << '#';

    cout << endl;

    for (int i = 0; i < height; i++)    //loop through matrix to draw board
    {
        for (int j = 0; j < width; j++)
        {

            if (j == 0)
                cout << '#';
            if (i == Y && j == X) // draw snake head
                cout << 'T';
            else if (i == fruitY && j == fruitX) // draw fruit
                cout << 'F';
            else
                cout << ' ';

            if (j == width - 1)
                cout << '#';
        }
        cout << endl;
    }

    for (int i = 0; i < width + 2; i++)
        cout << '#';

    cout << endl;
};

void input()
{
    if (_kbhit())
    {
        switch (_getch())
        {
        case 'w':
            direction = UP;
            break;
        case 's':
            direction = DOWN;
            break;
        case 'a':
            direction = LEFT;
            break;
        case 'd':
            direction = RIGHT;
            break;
        default:
            break;
        }

    }
};

void logic()
{
    switch (direction)
    {
    case UP:
        Y--;
        break;
    case DOWN:
        Y++;
        break;
    case LEFT:
        X--;
        break;
    case RIGHT:
        X++;
        break;
    default:
        break;
    }
};

int main()
{
    setup();
    while (!gameOver)
    {
        draw();
        input();
        logic();
        return 0;
    }
};

1 个答案:

答案 0 :(得分:0)

首先,你在游戏循环中执行return 0;,这只会在我认为你不想要的一次迭代后杀死程序。

我用类似的方法制作蛇,我的看起来像这样:

bool play = true;

while(play) {
    while (_kbhit) {
        switch (_getch) {
        case 'w':
            //code
            break;
        case 's':
            //code
            break;
        case 'a':
            //code
            break;
        case 'd':
            //code
            break;
        }
    }
}

这种方法适用于我,我认为唯一的区别是我使用了while循环而不是if。