鱼C论坛

 找回密码
 立即注册
查看: 1315|回复: 2

[已解决]井字棋

[复制链接]
发表于 2023-11-9 12:24:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下井字棋时,请问如何让电脑实现一些智能,现在的代码,电脑实现了随机下棋。
代码如下
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <time.h>

  6. void printArray(char arr[3][3])
  7. {
  8.     int i,j;
  9.     for (i=0; i<3; i++)
  10.     {
  11.         for (j=0; j<3; j++)
  12.         {
  13.             printf("%c ", arr[i][j]);
  14.         }
  15.         printf("\n");
  16.     }
  17. }

  18. bool humanwin(char arr[3][3])
  19. {
  20.     for (int i = 0; i < 3; i++)
  21.     {
  22.         if (arr[ i][0] == 'X' && arr[ i][1] == 'X' && arr[ i][2] == 'X')
  23.         {
  24.             return true;
  25.         }
  26.     }
  27.     for (int j = 0; j < 3; j++)
  28.     {
  29.         if (arr[0][j] == 'X' && arr[1][j] == 'X' && arr[2][j] == 'X')
  30.         {
  31.             return true;
  32.         }
  33.         
  34.     }
  35.     if (arr[0][0] == 'X' && arr[1][1] == 'X' && arr[2][2] == 'X')
  36.     {
  37.         return true;
  38.     }
  39.     if (arr[0][2] == 'X' && arr[1][1] == 'X' && arr[2][0] == 'X')
  40.     {
  41.         return true;
  42.     }
  43.     return false;
  44. }

  45. bool computerwin(char arr[3][3])
  46. {
  47.     for (int i = 0; i < 3; i++)
  48.     {
  49.         if (arr[ i][0] == 'O' && arr[ i][1] == 'O' && arr[ i][2] == 'O')
  50.         {
  51.             return true;
  52.         }
  53.     }
  54.     for (int j = 0; j < 3; j++)
  55.     {
  56.         if (arr[0][j] == 'O' && arr[1][j] == 'O' && arr[2][j] == 'O')
  57.         {
  58.             return true;
  59.         }
  60.         
  61.     }
  62.     if (arr[0][0] == 'O' && arr[1][1] == 'O' && arr[2][2] == 'O')
  63.     {
  64.         return true;
  65.     }
  66.     if (arr[0][2] == 'O' && arr[1][1] == 'O' && arr[2][0] == 'O')
  67.     {
  68.         return true;
  69.     }
  70.     return false;
  71. }
  72.    

  73. void calculateRowAndCol(int x, int* row, int* col)
  74. {
  75.     *row = 2 - ((x-1) / 3);
  76.     *col = (x-1) % 3;
  77. }


  78. int main()
  79. {
  80.     char board_now[3][3] = {{'.','.','.'},{'.','.','.'},{'.','.','.'}};
  81.     int i,x,y,row,col;
  82.     for (i=0;i<9;i++)
  83.     {
  84.         for (i=0;i<5;i++)
  85.         {
  86.             printArray(board_now);
  87.             printf("human input:");
  88.             scanf("%i",&x);
  89.             calculateRowAndCol(x, &row, &col);
  90.             if (board_now[row][col] == '.')
  91.             {
  92.                 board_now[row][col] = 'X';
  93.                 printf("\033[2J\033[H");
  94.                 break;
  95.             }
  96.             else
  97.             {
  98.                 printf("\033[2J\033[H");
  99.                 printf("you have done this.please input again.\n");
  100.                 i = i-1;
  101.             }   
  102.         }
  103.         if (humanwin(board_now))
  104.         {
  105.             printArray(board_now);
  106.             printf("human win.\n");
  107.             break;
  108.         }
  109.         for (i=0;i<4;i++)
  110.         {
  111.             srand(time(NULL));
  112.             y = rand()%(9+1);
  113.             calculateRowAndCol(y, &row, &col);
  114.             if (board_now[row][col] == '.')
  115.             {
  116.                 board_now[row][col] = 'O';
  117.                 printf("\033[2J\033[H");
  118.                 break;
  119.             }
  120.             else
  121.             {
  122.                 i = i-1;
  123.             }
  124.         }
  125.         if (computerwin(board_now))
  126.         {
  127.             printArray(board_now);
  128.             printf("computer win.\n");
  129.             break;
  130.         }  
  131.     }
  132.     return 0;     
  133. }
复制代码
最佳答案
2023-11-9 12:27:02
要让电脑实现一些智能,可以采用以下策略:

1. 阻止玩家获胜:在电脑下棋之前,判断玩家是否有两个棋子连成一线的可能性,如果有,则电脑应该下在这个位置,以阻止玩家获胜。

2. 寻找获胜的机会:在电脑下棋之前,判断电脑自己是否有两个棋子连成一线的可能性,如果有,则电脑应该下在这个位置,以获得胜利。

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <time.h>

  6. void printArray(char arr[3][3])
  7. {
  8.     int i,j;
  9.     for (i=0; i<3; i++)
  10.     {
  11.         for (j=0; j<3; j++)
  12.         {
  13.             printf("%c ", arr[ i][j]);
  14.         }
  15.         printf("\n");
  16.     }
  17. }

  18. bool humanwin(char arr[3][3])
  19. {
  20.     for (int i = 0; i < 3; i++)
  21.     {
  22.         if (arr[ i][0] == 'X' && arr[ i][1] == 'X' && arr[ i][2] == 'X')
  23.         {
  24.             return true;
  25.         }
  26.     }
  27.     for (int j = 0; j < 3; j++)
  28.     {
  29.         if (arr[0][j] == 'X' && arr[1][j] == 'X' && arr[2][j] == 'X')
  30.         {
  31.             return true;
  32.         }
  33.     }
  34.     if (arr[0][0] == 'X' && arr[1][1] == 'X' && arr[2][2] == 'X')
  35.     {
  36.         return true;
  37.     }
  38.     if (arr[0][2] == 'X' && arr[1][1] == 'X' && arr[2][0] == 'X')
  39.     {
  40.         return true;
  41.     }
  42.     return false;
  43. }

  44. bool computerwin(char arr[3][3])
  45. {
  46.     for (int i = 0; i < 3; i++)
  47.     {
  48.         if (arr[ i][0] == 'O' && arr[ i][1] == 'O' && arr[ i][2] == 'O')
  49.         {
  50.             return true;
  51.         }
  52.     }
  53.     for (int j = 0; j < 3; j++)
  54.     {
  55.         if (arr[0][j] == 'O' && arr[1][j] == 'O' && arr[2][j] == 'O')
  56.         {
  57.             return true;
  58.         }
  59.     }
  60.     if (arr[0][0] == 'O' && arr[1][1] == 'O' && arr[2][2] == 'O')
  61.     {
  62.         return true;
  63.     }
  64.     if (arr[0][2] == 'O' && arr[1][1] == 'O' && arr[2][0] == 'O')
  65.     {
  66.         return true;
  67.     }
  68.     return false;
  69. }

  70. void calculateRowAndCol(int x, int* row, int* col)
  71. {
  72.     *row = 2 - ((x-1) / 3);
  73.     *col = (x-1) % 3;
  74. }

  75. int main()
  76. {
  77.     char board_now[3][3] = {{'.','.','.'},{'.','.','.'},{'.','.','.'}};
  78.     int i,x,y,row,col;
  79.     for (i=0;i<9;i++)
  80.     {
  81.         for (i=0;i<5;i++)
  82.         {
  83.             printArray(board_now);
  84.             printf("human input:");
  85.             scanf("%i",&x);
  86.             calculateRowAndCol(x, &row, &col);
  87.             if (board_now[row][col] == '.')
  88.             {
  89.                 board_now[row][col] = 'X';
  90.                 printf("\033[2J\033[H");
  91.                 break;
  92.             }
  93.             else
  94.             {
  95.                 printf("\033[2J\033[H");
  96.                 printf("you have done this.please input again.\n");
  97.                 i = i-1;
  98.             }   
  99.         }
  100.         if (humanwin(board_now))
  101.         {
  102.             printArray(board_now);
  103.             printf("human win.\n");
  104.             break;
  105.         }
  106.         for (i=0;i<4;i++)
  107.         {
  108.             srand(time(NULL));
  109.             y = rand()%(9+1);
  110.             calculateRowAndCol(y, &row, &col);
  111.             if (board_now[row][col] == '.')
  112.             {
  113.                 board_now[row][col] = 'O';
  114.                 printf("\033[2J\033[H");
  115.                 break;
  116.             }
  117.             else
  118.             {
  119.                 i = i-1;
  120.             }
  121.         }
  122.         if (computerwin(board_now))
  123.         {
  124.             printArray(board_now);
  125.             printf("computer win.\n");
  126.             break;
  127.         }   
  128.     }
  129.     return 0;   
  130. }
复制代码


这个代码只实现了一个简单的电脑智能,即阻止玩家获胜。如果玩家有两个棋子连成一线的可能性,电脑会下在这个位置。如果没有这个可能性,电脑会随机下棋。你可以根据需要进一步优化电脑的智能。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-9 12:27:02 | 显示全部楼层    本楼为最佳答案   
要让电脑实现一些智能,可以采用以下策略:

1. 阻止玩家获胜:在电脑下棋之前,判断玩家是否有两个棋子连成一线的可能性,如果有,则电脑应该下在这个位置,以阻止玩家获胜。

2. 寻找获胜的机会:在电脑下棋之前,判断电脑自己是否有两个棋子连成一线的可能性,如果有,则电脑应该下在这个位置,以获得胜利。

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <time.h>

  6. void printArray(char arr[3][3])
  7. {
  8.     int i,j;
  9.     for (i=0; i<3; i++)
  10.     {
  11.         for (j=0; j<3; j++)
  12.         {
  13.             printf("%c ", arr[ i][j]);
  14.         }
  15.         printf("\n");
  16.     }
  17. }

  18. bool humanwin(char arr[3][3])
  19. {
  20.     for (int i = 0; i < 3; i++)
  21.     {
  22.         if (arr[ i][0] == 'X' && arr[ i][1] == 'X' && arr[ i][2] == 'X')
  23.         {
  24.             return true;
  25.         }
  26.     }
  27.     for (int j = 0; j < 3; j++)
  28.     {
  29.         if (arr[0][j] == 'X' && arr[1][j] == 'X' && arr[2][j] == 'X')
  30.         {
  31.             return true;
  32.         }
  33.     }
  34.     if (arr[0][0] == 'X' && arr[1][1] == 'X' && arr[2][2] == 'X')
  35.     {
  36.         return true;
  37.     }
  38.     if (arr[0][2] == 'X' && arr[1][1] == 'X' && arr[2][0] == 'X')
  39.     {
  40.         return true;
  41.     }
  42.     return false;
  43. }

  44. bool computerwin(char arr[3][3])
  45. {
  46.     for (int i = 0; i < 3; i++)
  47.     {
  48.         if (arr[ i][0] == 'O' && arr[ i][1] == 'O' && arr[ i][2] == 'O')
  49.         {
  50.             return true;
  51.         }
  52.     }
  53.     for (int j = 0; j < 3; j++)
  54.     {
  55.         if (arr[0][j] == 'O' && arr[1][j] == 'O' && arr[2][j] == 'O')
  56.         {
  57.             return true;
  58.         }
  59.     }
  60.     if (arr[0][0] == 'O' && arr[1][1] == 'O' && arr[2][2] == 'O')
  61.     {
  62.         return true;
  63.     }
  64.     if (arr[0][2] == 'O' && arr[1][1] == 'O' && arr[2][0] == 'O')
  65.     {
  66.         return true;
  67.     }
  68.     return false;
  69. }

  70. void calculateRowAndCol(int x, int* row, int* col)
  71. {
  72.     *row = 2 - ((x-1) / 3);
  73.     *col = (x-1) % 3;
  74. }

  75. int main()
  76. {
  77.     char board_now[3][3] = {{'.','.','.'},{'.','.','.'},{'.','.','.'}};
  78.     int i,x,y,row,col;
  79.     for (i=0;i<9;i++)
  80.     {
  81.         for (i=0;i<5;i++)
  82.         {
  83.             printArray(board_now);
  84.             printf("human input:");
  85.             scanf("%i",&x);
  86.             calculateRowAndCol(x, &row, &col);
  87.             if (board_now[row][col] == '.')
  88.             {
  89.                 board_now[row][col] = 'X';
  90.                 printf("\033[2J\033[H");
  91.                 break;
  92.             }
  93.             else
  94.             {
  95.                 printf("\033[2J\033[H");
  96.                 printf("you have done this.please input again.\n");
  97.                 i = i-1;
  98.             }   
  99.         }
  100.         if (humanwin(board_now))
  101.         {
  102.             printArray(board_now);
  103.             printf("human win.\n");
  104.             break;
  105.         }
  106.         for (i=0;i<4;i++)
  107.         {
  108.             srand(time(NULL));
  109.             y = rand()%(9+1);
  110.             calculateRowAndCol(y, &row, &col);
  111.             if (board_now[row][col] == '.')
  112.             {
  113.                 board_now[row][col] = 'O';
  114.                 printf("\033[2J\033[H");
  115.                 break;
  116.             }
  117.             else
  118.             {
  119.                 i = i-1;
  120.             }
  121.         }
  122.         if (computerwin(board_now))
  123.         {
  124.             printArray(board_now);
  125.             printf("computer win.\n");
  126.             break;
  127.         }   
  128.     }
  129.     return 0;   
  130. }
复制代码


这个代码只实现了一个简单的电脑智能,即阻止玩家获胜。如果玩家有两个棋子连成一线的可能性,电脑会下在这个位置。如果没有这个可能性,电脑会随机下棋。你可以根据需要进一步优化电脑的智能。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-9 15:19:51 | 显示全部楼层
isdkz 发表于 2023-11-9 12:27
要让电脑实现一些智能,可以采用以下策略:

1. 阻止玩家获胜:在电脑下棋之前,判断玩家是否有两个棋子 ...

这个代码与我的原代码有什么区别吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表