📜  井字游戏的实现

📅  最后修改于: 2021-09-24 03:21:27             🧑  作者: Mango

游戏规则

  • 游戏将在两个人之间进行(在这个程序中,人与计算机之间)。
  • 其中一位玩家选择“O”,另一位玩家选择“X”来标记各自的单元格。
  • 游戏从其中一名玩家开始,当其中一名玩家有一整行/列/对角线填充他/她各自的字符(“O”或“X”)时,游戏结束。
  • 如果没有人获胜,则称该游戏为平局。

    执行
    在我们的程序中,计算机和人类采取的动作是随机选择的。我们为此使用 rand()函数。

    程序中还能做什么?
    由于移动是随机选择的,因此双方都没有以最佳方式播放该程序。该程序可以轻松修改,以便两个玩家都能以最佳方式进行游戏(这将属于人工智能类别)。也可以修改程序,以便用户自己提供输入(使用 scanf() 或 cin)。
    上述更改留给读者作为练习。

    制胜策略——一个有趣的事实
    如果两个球员都发挥最佳,那么注定你永远不会输(“虽然比赛仍然可以平局”)。先玩还是后玩都无所谓。换种说法——“两个高手总会抽奖”。
    这不是很有趣吗?

    // A C++ Program to play tic-tac-toe
      
    #include
    using namespace std;
      
    #define COMPUTER 1
    #define HUMAN 2
      
    #define SIDE 3 // Length of the board
      
    // Computer will move with 'O'
    // and human with 'X'
    #define COMPUTERMOVE 'O'
    #define HUMANMOVE 'X'
      
    // A function to show the current board status
    void showBoard(char board[][SIDE])
    {
        printf("\n\n");
          
        printf("\t\t\t  %c | %c  | %c  \n", board[0][0],
                                 board[0][1], board[0][2]);
        printf("\t\t\t--------------\n");
        printf("\t\t\t  %c | %c  | %c  \n", board[1][0],
                                 board[1][1], board[1][2]);
        printf("\t\t\t--------------\n");
        printf("\t\t\t  %c | %c  | %c  \n\n", board[2][0],
                                 board[2][1], board[2][2]);
       
        return;
    }
      
    // A function to show the instructions
    void showInstructions()
    {
        printf("\t\t\t  Tic-Tac-Toe\n\n");
        printf("Choose a cell numbered from 1 to 9 as below"
                " and play\n\n");
          
        printf("\t\t\t  1 | 2  | 3  \n");
        printf("\t\t\t--------------\n");
        printf("\t\t\t  4 | 5  | 6  \n");
        printf("\t\t\t--------------\n");
        printf("\t\t\t  7 | 8  | 9  \n\n");
          
        printf("-\t-\t-\t-\t-\t-\t-\t-\t-\t-\n\n");
      
        return;
    }
      
      
    // A function to initialise the game 
    void initialise(char board[][SIDE], int moves[])
    {
        // Initiate the random number generator so that 
        // the same configuration doesn't arises
        srand(time(NULL)); 
          
        // Initially the board is empty
        for (int i=0; i

    输出:

    Tic-Tac-Toe
    
    Choose a cell numbered from 1 to 9 as below and play
    
                  1 | 2  | 3  
                --------------
                  4 | 5  | 6  
                --------------
                  7 | 8  | 9  
    
    -    -    -    -    -    -    -    -    -    -
    
    COMPUTER has put a O in cell 6
    
    
                    |    |    
                --------------
                    |    | O  
                --------------
                    |    |    
    
    HUMAN has put a X in cell 7
    
    
                    |    |    
                --------------
                    |    | O  
                --------------
                  X |    |    
    
    COMPUTER has put a O in cell 5
    
    
                    |    |    
                --------------
                    | O  | O  
                --------------
                  X |    |    
    
    HUMAN has put a X in cell 1
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X |    |    
    
    COMPUTER has put a O in cell 9
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X |    | O  
    
    HUMAN has put a X in cell 8
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X | X  | O  
    
    COMPUTER has put a O in cell 4
    
    
                  X |    |    
                --------------
                  O | O  | O  
                --------------
                  X | X  | O  
    
    COMPUTER has won
    

    这个游戏的一个有趣的变体
    如上所述,如果两个有经验的玩家在玩井字游戏,那么游戏总是会平局。
    该游戏还有另一种病毒式变体——终极井字游戏,旨在让普通的井字游戏更有趣且更难预测。
    看看这里的游戏 – Link1 Link2

    上面的文章实现了简单的 Tic-Tac-Toe,其中移动是随机进行的。请参阅以下文章以了解如何进行最佳移动。
    博弈论中的极小极大算法第 3 组(井字棋 AI – 寻找最佳动作)

    关于“赢/永不输”策略的精彩讨论
    知乎
    维基百科

    如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程