我正在尝试制作筷子游戏。这是游戏https://en.wikipedia.org/wiki/Chopsticks_(hand_game)的维基百科链接。到目前为止,我仅添加了两种方法,以便一只手可以使用“攻击”方法攻击另一只手。我觉得我编写的代码非常冗长,丑陋,甚至可能是错误的。我该如何写得更优雅?
class game:
def __init__(self):
self.x_left = 1
self.x_right = 1
self.o_left = 1
self.o_right = 1
def set_x_left(self, num):
self.x_left = num
def set_x_right(self, num):
self.x_right = num
def set_o_left(self, num):
self.o_left = num
def set_o_right(self, num):
self.o_right = num
def dict_func(self, hand):
self.func= {'x_left': self.set_x_left, 'x_right': self.set_x_right,
'o_left': self.set_o_left, 'o_right': self.set_o_right}
return self.func[hand]
def dict_hand(self, hand):
self.hands = {'x_left': self.x_left, 'x_right': self.x_right,
'o_left': self.o_left, 'o_right': self.o_right}
return self.hands[hand]
def attack(self, from_hand, to_hand):
self.dict_func(to_hand)(self.dict_hand(from_hand) + self.dict_hand(to_hand))
答案 0 :(得分:1)
您的代码似乎有一些不必要的方法。您可以摆脱使用数字设置变量的方法:
def set_x_left(self, num):
self.x_left = num
创建游戏实例时,可以使用点符号设置值:
chopsticks = game()
# ^^^ that's the instance
chopsticks.set_x_left(0)
# is the same as
chopsticks.x_left = 0
如您所见,键入起来更快,不需要任何方法。这只是属性分配。这样做会影响您的dict_func
方法,因此您可以改为创建一个匿名函数:
def dict_func(self, hand):
self.func = {'x_left': lambda self, x: self.x_left = x,
'x_right': lambda self, x: self.x_right = x,
'o_left': lambda self, x: self.o_left = x,
'o_right': lambda self, x: self.o_right = x}
return self.func[hand]
实际上,您可以在self.func
中声明self.hands
__init__
属性,以确保仅将它们分配给一次。然后,您可以在函数中编写return self.func[hand]
您的dict_hand
方法也有些复杂。您的目标是从实例字典获取属性,因此可以执行以下操作:
def dict_hand(self, hand):
return getatttr(self, hand)
(您可能想重命名此功能:))