Как мне заставить вашу программу многократно увеличиваться, пока не будет нажата другая клавиша в операторе switch

Я работал над одной из этих игр со змеями, и у меня есть оператор switch, который говорит, что если нажата клавиша, чтобы переместить змею в направлении путем увеличения / уменьшения, но он будет делать это только в том случае, если я буду удерживать ее. Я ищу способ, чтобы местоположение змей продолжало увеличиваться без того, чтобы пользователь держал этот ключ. Я поместил один случай ниже

if(_kbhit()) {
    switch(_getch()) {
        case 'a' : 
        dir = LEFT;
        x--;

person Ryan Shesler    schedule 07.01.2017    source источник
comment
если вы разместите код, вам нужно позвонить if(kbhit()), может быть, я могу расширить свой ответ   -  person tinkertime    schedule 08.01.2017
comment
как бы сделать поток фонового таймера @ yankee2905   -  person Ryan Shesler    schedule 08.01.2017


Ответы (3)


Я ищу способ ... продолжать приращение без того, чтобы пользователь удерживал эту клавишу ".

ИМХО, стоит учесть функцию "select ()" (если она есть в вашей ОС)


Давно я использовал "select ()" в vxWorks. Я вижу из справочной страницы, что эта функция также доступна для Ubuntu Linux. (может быть, это доступно для вашей системы?)

С помощью оператора select поток или программа могут «отслеживать несколько файловых дескрипторов, ожидая, пока один или несколько файловых дескрипторов не станут« готовы »к некоторому классу операций ввода-вывода (например, возможен ввод). Файловый дескриптор считается готовым, если можно выполнить соответствующую операцию (например, read () без блокировки или достаточно маленькую write ()) ». (со страницы руководства)

На практике система, над которой я работал, имела поток пользовательского интерфейса (один из нескольких), который считывал и отслеживал входной fd (через select) для пользовательского ввода. Наш выбор использовал тайм-аут 1/2 секунды (вы выбираете ставку). Таким образом, каждые полсекунды, если пользовательский ввод не происходил на этом порту (то есть на устройстве), тайм-аут освобождает программу для проверки битов в fd_sets.

Ничто не мешает коду выполнять дополнительные действия в течение тайм-аута.

Я предполагаю, что вам нужно будет работать только с readfds, а остальные fds можно оставить пустыми.

Другими словами, с помощью select ваш код «отслеживает» некоторый ввод пользователя с тайм-аутом и выполняет действия либо при вводе пользователем (нажатие клавиши), либо из-за тайм-аута.

Это похоже на то, что вы ищете - действие без нажатия клавиши.

person 2785528    schedule 08.01.2017
comment
Забыл упомянуть, что vxWorks обеспечивает простое преобразование между fd, FILE * и потоками (любыми в любые). Пока что я нашел только функцию fileno (), которая проверяет поток аргументов и возвращает его целочисленный дескриптор. на страницах руководства. (Сообщается, что это функция posix.) - person 2785528; 08.01.2017
comment
При чем здесь исходный вопрос о C ++? - person Soviut; 08.01.2017
comment
@Soviut В OP я ищу способ ... продолжать увеличивать без того, чтобы пользователь держал этот ключ. Select - это простой способ добиться этого, но select использует fd. - person 2785528; 08.01.2017
comment
@RyanShesler - см. Также высоко оцененный ответ на stackoverflow.com/questions/2917881/ - person 2785528; 09.01.2017

Ваш текущий дизайн звучит так, как будто он перемещает змею на пресс-конференции.

Я думаю, вы хотите изменить дизайн так, чтобы события прессы обновляли какой-то флаг текущего направления, в то время как некоторый поток фонового таймера перемещал змейку с некоторой регулярной частотой кадров.

person tinkertime    schedule 07.01.2017

Ваш код перемещает змейку только при нажатии клавиши. Вам нужно реализовать какой-то игровой цикл, который перемещает змейку с регулярным интервалом на основе переменной direction. Затем вы можете реорганизовать код нажатия клавиш, чтобы просто обновить direction.

Псевдокод:

while: # loop forever
    # below could be your switch statement
    if direction == 0: # north
        y--
    if direction == 1: # east
        x++
    if direction == 2: # south
        y++
    if direction == 4: # west
        x--

if _kbhit():
    if _getch() == 'a':
        direction == 4 # west
    # etc...
person Soviut    schedule 08.01.2017