0

if/elif ステートメントの見栄えが悪いのは好きではありません。また、switch/case ステートメントはあまり優れていません。辞書の方が読みやすいと思います。これで、各キー バインディングが別の関数に割り当てられた場合の処理​​方法がわかりました。それは簡単です。しかし、それには 8 つの異なる移動関数 (moveNE、moveN、moveNW など) が必要になります。したがって、方向を引数として取る単純な move_object 関数が必要です。しかし、このコードを機能させるのに問題があり、何が間違っているのかわかりません。これが問題のコードです。

まず、辞書:

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":"East"}},
                    ord('k'): {"function":self.move_object,
                               "args":{"thing":self.things[0], "direction":"West"}},
                    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":{"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 = keywords[thing].x
cury = keywords[thing].y
newy = keywords[thing].y + directions[keywords[direction]][0]
newx = thing.x + directions[keywords[direction]][1]
if not self.is_blocked(newx, newy):
  logging.info("Not blocked")
  keywords[thing].x = newx
  keywords[thing].y = newy

最後に、move_object 関数を呼び出すコード:

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

キーバインドはゲーム クラスのinit関数で定義され、コードの最後のブロックは Game.main_loop() 内で発生します。

チュートリアルを何度か読みましたが、何が間違っているのかわかりません。ここにあるものは、args 辞書を ** キーワードとして move_object() 関数に渡すと思っていましたが、引数エラーが発生しました (2 つの引数が必要で、1 つを受け取りました)。

4

0 に答える 0