【发布时间】:2014-07-02 02:58:36
【问题描述】:
在 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
第二种方法要简单得多,但它是最 Pythonic 的方法吗?还是我在问正确的问题?
另外,在第二个示例中,获胜组合作为元组列表是否会更好,因为它是不可变的?或者在计算获胜者时会导致效率低下,因为它会与列表进行比较?
【问题讨论】:
标签: python tic-tac-toe