Tic-Tac-Toe阵列或列表

Tic-Tac-Toe arrays or lists?

本文关键字:列表 阵列 Tic-Tac-Toe      更新时间:2023-10-16

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

对于我的井字游戏板,我使用3x3阵列。可能有8种获胜组合。所以我想做一系列的组合,让程序检查棋盘上的任何一个动作是否和获胜的动作相匹配。

我想知道一个数组是否有效,或者其他东西是否更有效,比如向量或列表。

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

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

嗯…真的很难说。两者都可以使用。我自己可能会用静态数组来做这件事,但随着你的学习,我建议你从静态数组开始,因为它更自然,然后尝试用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个对角线。