Tic-Tac-Toe阵列或列表?

时间:2012-02-12 21:11:49

标签: c++

我读了一本书,并且正在努力制作一个井字游戏作为我的第一个项目之一。我有一个问题是制作一个功能,检查所做的移动是否是一个成功的举动。我只需要朝着正确的方向努力。

对于我使用3x3阵列的tic-tac-toe board。可能有8种获胜组合。所以我想要制作一个组合数组并让程序检查棋盘上的任何动作是否与获胜动作中的动作相匹配。

我想建议一个阵列是否有效,或者其他东西是否像矢量或列表一样更好。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

呃......真的很难说。你绝对可以同时使用它们。我自己可能会使用静态数组,但是在你学习的时候我建议你从静态数组开始,因为它更自然,然后尝试用Vector做,所以你会看到差异。也许你想要创建一个类 TicTacToeBoard ,它可以比较自己的实例(因为你需要检查策略是否赢了)。当你有一个包含所有方法的类时,你可以改变数组和Vector之间的实现,你也会看到封装的想法:所以从外面看,类将是相同的并且来自在里面你可以使用不同的解决方案。

答案 2 :(得分:1)

使用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(),如果该移动使玩家成为赢家,它将检查您。

P.S。 每个玩家有8个,而不是10个可能的获胜动作:3个横向,3个垂直和2个对角线。