📜  井字游戏的实现

📅  最后修改于: 2021-05-04 19:01:31             🧑  作者: 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
    

    这个游戏的一个有趣的变体
    如上所述,如果两个经验丰富的玩家正在玩井字游戏,则游戏将始终平局。
    该游戏还有另一种病毒变种,即Ultimate Tic-Tac-Toe,目的是使普通的Tic-Tac-Toe更加有趣且难以预测。
    在这里看看游戏-Link1 Link2

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

    关于“赢/不输”战略的精彩讨论
    Quora
    维基百科