Змея движется быстрее при многократном нажатии клавиши - PullRequest
0 голосов
/ 03 мая 2019

Я создаю игру со змеями с библиотекой python и curses. Однако я нашел ошибку в программе. При повторном нажатии клавиши змея движется быстрее. Вот какая-то часть кода

# standard initialization
s = curses.initscr()

curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)

curses.noecho()
curses.curs_set(0)
sh, sw = 30, 60
w = curses.newwin(sh, sw, 0, 0)
w.keypad(1)
w.timeout(100)
w.nodelay(1)

#Snake moving loop

while True:

next_key = w.getch()

#Check if user is pressing the key or not, or pressing the opposite direction key
if (next_key == -1):
    key = key
elif (key == curses.KEY_DOWN and next_key == curses.KEY_UP) or (key == curses.KEY_UP and next_key == curses.KEY_DOWN):
    key = key
elif (key == curses.KEY_LEFT and next_key == curses.KEY_RIGHT) or (key == curses.KEY_RIGHT and next_key == curses.KEY_LEFT):
    key = key
else:
    key = next_key

#Current location of the head
new_head = [snake[0][0], snake[0][1]]

 #moving up, down,left,right according to the key
if key == curses.KEY_DOWN:
    new_head[0] += 1
if key == curses.KEY_UP:
    new_head[0] -= 1
if key == curses.KEY_LEFT:
    new_head[1] -= 1
if key == curses.KEY_RIGHT:
    new_head[1] += 1

snake.insert(0, new_head)

Я думаю, это потому, что getch () вызывается много раз при нажатии клавиши и попадает в движущийся цикл, не дожидаясь истечения времени ожидания.

Я пробовал curses.napms (100), curses.cbreak (1), curses.halfdelay (1) ничего не работает.

1 Ответ

1 голос
/ 03 мая 2019

Вызов s.nodelay(0) устанавливает режим нодли на 0 (что означает ложь, поэтому - это задержка), и он находится на неправильном объекте окна (s вместо w.)

Вы вызываете getch в экземпляре окна w, поэтому я считаю, что вам нужно вызвать w.nodelay(1) (для включить режим нодли).

Вы будететакже необходимо изменить цикл ввода, чтобы он распознал, что если getch() возвращает -1, это означает, что ни одна клавиша не была нажата.(Это будет обычный результат, поскольку нажатие клавиши занимает значительную долю секунды, но теперь этот цикл будет выполняться много сотен или даже тысяч раз в секунду.)

РЕДАКТИРОВАТЬ:

Я думаю, что я неправильно понял вашу проблему.Приведенный выше код полезен, но не решает основной проблемы.Возможно, вы захотите добавить постоянную задержку в цикл ввода, чтобы больше нажатий клавиш не позволяло выполнять больше действий.

Возможно, что-то вроде этого:

while True:
    keypress = w.getch()
    if keypress != -1:
        # process keypress
    sleep(100 milliseconds)
...