在python中,哪个是代表游戏板和赢得井字游戏组合的最pythonic方式?
我从第一个解决方案开始,认为将游戏磁贴作为单独的对象以二维数组维护自己的状态将更加面向对象:
class GameTile:
def __init__(self, x, y):
self.x = x
self.y = y
self.value = None # value is either "x", "o", or None
class GameBoard:
_board_size = 3
_player = "o"
_computer = "x"
def __init__(self):
# generate the tile set
self.tiles = [[GameTile(x, y) for y in range(GameBoard._board_size)] for x in range(GameBoard._board_size)]
# generate winning combos
self.winning_combos = [col for col in self.tiles] + \ #vertical
[[col[i] for col in self.tiles] for i in range(GameBoard._board_size)] + \ # horizontal
[[self.tiles[i][i] for i in range(GameBoard._board_size)]] + \ #diagonal
[[self.tiles[i][GameBoard._board_size - i - 1] for i in range(GameBoard._board_size)]] #diagonal
然而,现在我越看越好,董事会似乎越能简单地表示为代表行动的单一价值列表,以及不需要的一系列胜利组合动态定义:
class GameBoard:
_board_size = 3
_player = "o"
_computer = "x"
_winning_combos = [[0, 1, 2], [3, 4, 5], [6, 7, 8], etc...]
def __init__(self):
self.board = [None] * 9
第二种方法更简单,但它是最蟒蛇的方式吗?或者我甚至问了正确的问题?
另外,在第二个例子中,获胜的组合会更好地作为元组列表,因为它是不可变的吗?或者,这会在计算胜利者时造成效率低下,因为它会与列表进行比较?
答案 0 :(得分:3)
我认为你过度设计了你的解决方案。
我不知道它是否是最pythonic方式,但最合理的方法是使用整数或字符串的2D矩阵,但肯定不是GameTile
个对象。为什么?当整数或字符串包含您需要的所有信息时,为什么还需要一个额外的类?位置隐含在矩阵中,并且使用整数(0空,1个第一个玩家,2秒玩家)或字符串存储图块的值。
matrix = [[0 for y in range(3)] for x in range(3)]
这并不容易。