Tic-Tac-Toe数组或列表?

Tic-Tac-Toe数组或列表?

问题描述:

我已经读过一本书,并试图制作一个井字游戏作为我的第一个项目之一。我在制作一个功能时遇到了问题,该功能会检查所做的动作是否是胜利动作。我只需要一个正确的方向。Tic-Tac-Toe数组或列表?

对于我的井字棋板即时通讯使用3x3阵列。有8种可能的组合。所以即时考虑制作一系列组合并让程序检查棋盘上的任何棋步是否与胜出棋步中的动作相匹配。

我想得到一些建议,不管数组是可以工作的,还是其他的东西能像矢量或列表一样工作的更好。

+0

数组应该用于固定大小的东西,如井字棋板,可以更改大小的东西的列表。 – Joel 2012-02-12 21:15:04

+2

您可能会喜欢[this](http://xkcd.com/832/)。 – 2012-02-12 21:21:15

+0

不错的马特我爱xkcd – 2012-02-12 21:25:18

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

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

+0

好酷,所以你可以创建数组阵列 – 2012-02-12 21:16:06

+0

绝对!虽然这可能会变得复杂,但你当然可以做到这一点。如果你真的想吓唬人们阅读你的代码,你可以拥有数组数组的数组。我不会建议。 – Oleksi 2012-02-12 21:17:13

+0

所以会有比制作数组数组更好的选择吗? – 2012-02-12 21:19:41

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

使用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个对角线。

+0

感谢这真的澄清,哈哈我不能相信我犯了一个错误计数,但谢谢 – 2012-02-12 21:34:04