【问题标题】:Most pythonic game board representation for Tic-Tac-Toe?Tic-Tac-Toe 的大多数 Pythonic 游戏板表示?
【发布时间】: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


    【解决方案1】:

    我认为您过度设计了您的解决方案。

    我不知道这是否是最 Pythonic 的方式,但最合理的方式是使用整数或字符串的二维矩阵,但肯定不是 GameTile 对象。为什么?当整数或字符串包含您需要的所有信息时,为什么还需要一个额外的类?位置是隐含在矩阵中的,而 tile 的值使用整数(0 为空,1 个第一个玩家,2 个第二个玩家)或字符串来存储。

    matrix = [[0 for y in range(3)] for x in range(3)]
    

    没有比这更容易的了。

    【讨论】:

    • 谢谢。我一直在想这件事太多,第二次猜测自己。我需要别人来确认我的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多