Как использовать getch (), не дожидаясь ввода?

 for (;;)
{
    cout << "You are playing for:" << playtime << "seconds." << endl;
    cout << "You have " << bytes << " bytes." << endl;
    cout << "You are compiling " << bps << " bytes per second." << endl;
    cout << "Press a to buy assembler monkey (produces 1 byte per second)/(cost 10 bytes)" << endl;
    switch(getch())
    {
        case 'a': bytes = bytes - 10; bps++; break;
    }
    bytes = bytes + bps;
playtime++;
Sleep(1000);
system("cls");
}

Допустим, это моя инкрементальная игра. Я хочу обновить свою игру через 1 секунду. Как заставить getch () ждать ввода без остановки всего остального?


person Fairlight    schedule 20.07.2014    source источник
comment
stackoverflow.com/questions/2654504/   -  person Retired Ninja    schedule 20.07.2014
comment
Для чего-то кроссплатформенного вы можете select() на STDIN_FILENO узнать, какие нажатия клавиш ожидают считывания.   -  person John Zwinck    schedule 20.07.2014
comment
Я все еще не понимаю. Не могли бы вы показать мне это в моем коде?   -  person Fairlight    schedule 20.07.2014


Ответы (3)


Используйте функцию khbit (), чтобы определить, была ли нажата клавиша :)

что-то типа:

 for (;;)
{
    cout << "You are playing for:" << playtime << "seconds." << endl;
    cout << "You have " << bytes << " bytes." << endl;
    cout << "You are compiling " << bps << " bytes per second." << endl;
    cout << "Press a to buy assembler monkey (produces 1 byte per second)/(cost 10 bytes)" << endl;
    if(kbhit()){  //is true when a key was pressed
        char c = getch();   //capture the key code and insert into c

        switch(c)
        {
            case 'a': bytes = bytes - 10; bps++; break;
        }
    }
    bytes = bytes + bps;
    playtime++;
    Sleep(1000);
    system("cls");
}
person Mario    schedule 20.03.2015

Вы можете использовать другой поток, чтобы получить ввод пользователя.

for (;;) не нужен, вместо этого вы должны использовать while (true).

#include <Windows.h>
#include <iostream>
#include <conio.h>

using namespace std;

DWORD WINAPI SpeedThread(LPVOID lpParam);



int main ()
{
    int playtime = 0,
        bytes = 0,
        bps = 1;

    bool bKeyPressed = false;

    CreateThread( NULL, 0, SpeedThread, &bKeyPressed, 0, NULL);

    while (true)
    {
        cout << "You are playing for:" << playtime << "seconds." << endl;
        cout << "You have " << bytes << " bytes." << endl;
        cout << "You are compiling " << bps << " bytes per second." << endl;
        cout << "Press a to buy assembler monkey (produces 1 byte per second)/(cost 10 bytes)" << endl;
        if (bKeyPressed && bytes >= 10)
        {
            bytes -= 10;    
            bps++; 

            bKeyPressed = false;
        }
        bytes = bytes + bps;
        playtime++;
        Sleep(1000);
        system("cls");
    }

}

DWORD WINAPI SpeedThread (LPVOID lpParam)
{
    bool * bKeyPressed = (bool *) lpParam;

    while (true)
    {
        if (_getch () == 'a')
            *bKeyPressed = true;
    }
}
person schacker22    schedule 20.07.2014
comment
Вы пытались мне помочь, и я ценю это, но, к сожалению, это не работает: / - person Fairlight; 20.07.2014
comment
@Fairlight Я протестировал код и отредактировал его. У меня сейчас это работает, но расскажите, пожалуйста, какие у вас ошибки. Вам также нужно будет добавить условие if в части bKeyPressed, чтобы байты никогда не были ниже 0- - person schacker22; 20.07.2014
comment
Я сказал это неправильно. Ваш код вроде хороший, но я новичок в C ++. Я понятия не имею, как использовать WinAPI (эти DWORD и т. Д.). Я не знаю, где разместить свой код. - person Fairlight; 22.07.2014

У меня сработало не использование getch(), а использование scanf(). Чтобы scanf не останавливался, вы должны использовать:

scanf("%c \n",example);

Имейте в виду, что example - это указатель (char* example;)

person Max    schedule 03.10.2020
comment
scanf - это блокирующая функция, которая не решит проблему OP, потому что ему нужно делать другие вещи между ними. - person user; 13.04.2021