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 つを受け取りました)。