Один символ «отставание» в программе Python 3 Curses

Я пытаюсь создать roguelike, используя Python3 и проклятия. У меня все отображается так, как я хочу, но я столкнулся с странной ошибкой в ??коде. При обработке команд есть 1 задержка хода клавиш. Поэтому, принимая традиционные команды roguelike, нажатие «k» должно переместить вас на 1 квадрат вправо. В первый раз, когда вы нажимаете его, он ничего не делает. Во второй раз он будет двигаться. Если вы затем нажмете «g», вы не вернетесь влево, вместо этого будет обработана вторая «k», а «g» закончится «на палубе». Вот цикл, который должен обрабатывать ходы.

  def main_loop(self):
#This will catch and handle all keystrokes. Not too happy with if,elif,elif or case. Use a dict lookup eventually
    while 1:
      self.render_all()

      c = self.main.getch()
      try:
        self.keybindings[c]["function"](**self.keybindings[c]["args"])
      except KeyError:
        continue

И вот словарь поиска я обещал себе, что буду использовать в этом комментарии

    self.keybindings = {ord("h"): {"function":self.move_object, 
                               "args":{"thing":self.things[0], "direction":"North"}},
                        ord('j'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"South"}},
                        ord('g'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"West"}},
                        ord('k'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"East"}},
                        ord('y'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"NorthWest"}},
                        ord('u'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"NorthEast"}},
                        ord('b'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"SouthWest"}},
                        ord('n'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"SouthEast"}},
                        ord('l'): {"function":self.look, "args":{"origin_thing":self.things[0],}},
                        ord('q'): {"function":self.save_game,
                               "args":{"placeholder":0}}}

Наконец, вот функция move_object, которая должна быть вызвана:

  def move_object(self, thing, direction): 
"""I chose to let the Game class handle redraws instead of objects.
I did this because it will make it easier should I ever attempt to rewrite
this with libtcod, pygcurses, or even some sort of browser-based thing.
Display is cleanly separated from obects and map data.
Objects use the variable name "thing" to avoid namespace collision."""
    curx = thing.x
    cury = thing.y
    newy = thing.y + directions[direction][0]
    newx = thing.x + directions[direction][1]
    if not self.is_blocked(newx, newy):
      logging.info("Not blocked")
      thing.x = newx
      thing.y = newy

Отредактировано для форматирования кода очистки.

python,python-3.x,curses,

-1

Ответов: 1


0 принят

Я нашел проблему, и это было не в коде, который я опубликовал. Это было внутри моей функции render_all (). Мне нужно было добавить вызов функции refresh () окна после внесения изменений, которые я делал. Должен сказать, мне действительно не нравятся проклятия!

питон, питон-3.x, проклинает,
Похожие вопросы