【问题标题】:Tic-Tac-Toe arrays or lists?井字游戏数组或列表?
【发布时间】:2012-02-12 21:11:48
【问题描述】:

我读过一本书,并正在尝试制作一款井字游戏作为我的第一个项目之一。我在制作一个检查所做出的动作是否是获胜动作的函数时遇到问题。我只需要朝着正确的方向前进。

对于我的井字游戏,我使用 3x3 阵列。可能有 8 种获胜组合。因此,我正在考虑制作一系列组合并让程序检查板上的任何动作是否与获胜动作中的动作相匹配。

我想要一些建议,数组是否可以工作,或者其他东西是否可以更好地工作,例如向量或列表。

【问题讨论】:

  • 数组应该用于固定大小的东西,例如井字游戏,列表用于可以改变大小的东西。
  • 你可能会喜欢this

标签: c++


【解决方案1】:

在这种情况下,数组会很好地工作,因为您要存储的东西数量是静态的、不变的。这对他们来说是一个完美的用例。

当您以动态方式存储的东西并且您不知道预先的大小时,列表和向量更合适。在您的情况下,您预先知道大小,因此您应该使用最简单的数据结构来完成工作(数组)。

【讨论】:

  • 绝对!虽然这可能会变得复杂,但您当然可以这样做。如果您真的想吓唬阅读您的代码的人,您可以拥有数组数组的数组。我不建议这样做。
  • 那么还有比制作数组数组更好的选择吗?
  • 您应该开始将您的结构包装在您自己定义的对象中。当然,你可以让你的板子成为一个数组数组。一组可能的板将是一组数组,这很难管理。如果您将数组数组包装在一个板对象中,那么您的另一个数组只是一个板数组。根据经验,通常最多三层仍然是可管理的,之后就很难了,您应该添加额外的抽象。
  • 好吧,如果我要编写这个程序,我根本不会存储所有获胜的动作。我会创建一个类似 checkForWin(char grid [][], char player) 的函数,它会根据当前的棋盘配置检查玩家是否赢了。该函数的内部将包含确定所有可能获胜方式的逻辑
  • 这就是水平代码的样子:pastebin.com/kkSsb6va 从这里,看看你是否可以编写其他两个函数。 checkVertical 应该非常相似。
【解决方案2】:

呃……真的很难说。您绝对可以同时使用两者。我自己可能会用静态数组来做这个,但是当你正在学习时,我建议你从静态数组开始,因为它更自然,然后尝试用 Vector 来做,所以你会看到不同之处。另外,也许您会想要创建一个可以比较自身实例的类 TicTacToeBoard(因为您需要检查策略是否获胜)。当你有一个包含所有方法的类时,你可以在数组和向量之间改变实现,你也会看到封装的想法:所以从外面看,类和从外面看是一样的在里面你可以使用不同的解决方案。

【讨论】:

    【解决方案3】:

    使用 3x3 数组来存储您当前的电路板是可以的。使用数组存储可能的获胜组合是不行的。尽管这是您的第一个程序,但开始学习良好习惯永远不会有坏处。对于这个问题,您可以枚举所有可能的组合,这可能是真的。但是,如果您想对检查器进行编码,您会怎么做?可能的获胜场景的数量是巨大的。象棋呢?目前所有可用的计算机都没有足够的内存来存储所有可能的国际象棋获胜棋步。

    更好的方法是编写一个函数来检查这些获胜条件。为了简单起见,我建议这样写。为了不简单,我把它写成伪代码:

    // returns true if specified side won
    // board - a pointer to your array
    // player - specifies if you want to check if X or O is the winner
    bool game_won(board, player)
    {
        For each row, check if each field is equal to player. 
            if yes return true.
        For each column, check if each field is equal to player. 
            if yes return true.
        Check if each field on diagonal is equal to player. 
            if yes return true.
    
        // winning conditions not met, let's keep playing
        return false
    }
    

    玩家每走一步之后,你应该调用 game_won() ,它会检查你的走棋是否让玩家获胜。

    附言 每个玩家有 8 个而不是 10 个可能的获胜动作:3 个水平、3 个垂直和 2 个对角线。

    【讨论】:

    • 谢谢这真的澄清了,哈哈我不敢相信我算错了,但是谢谢
    猜你喜欢
    • 2017-06-08
    • 2015-06-12
    • 2015-01-08
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多