三子棋、井字棋 -python版本代码-C语言版本代码

打印 上一主题 下一主题

主题 517|帖子 517|积分 1551

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为两边对战,两边依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时间会出现和棋的局面。
  

废话不多说,直接上代码,好用请给个三连关注谢谢,我的B站是技术宅学长的个人空间-技术宅学长个人主页-哔哩哔哩视频 (bilibili.com)

  1. #作者:技术宅学长(CSDN、B站、抖音均为该ID)
  2. #电赛交流1群:586475593
  3. #电赛交流2群:878095340
  4. #电赛交流3群:873779462
  5. #电赛交流4群:208635284
  6. #电赛交流5群:903429622
  7. import random
  8. # 定义棋盘大小和玩家符号
  9. ROWS, COLS = 3, 3
  10. PLAYER_X = 'X'#玩家
  11. PLAYER_O = 'O'#电脑AI
  12. EMPTY = ' '
  13. # 函数:打印棋盘
  14. def print_board(board):
  15.     for row in board:
  16.         print(" | ".join(row))
  17.         print("-" * 9)
  18. # 函数:检查当前状态是否是结束状态(胜负或平局)
  19. def check_game_over(board):
  20.     # 检查行和列
  21.     for i in range(ROWS):
  22.         if board[i][0] == board[i][1] == board[i][2] != EMPTY:  # 检查行
  23.             return board[i][0]
  24.         if board[0][i] == board[1][i] == board[2][i] != EMPTY:  # 检查列
  25.             return board[0][i]
  26.     # 检查对角线
  27.     if board[0][0] == board[1][1] == board[2][2] != EMPTY:  # 主对角线
  28.         return board[0][0]
  29.     if board[0][2] == board[1][1] == board[2][0] != EMPTY:  # 副对角线
  30.         return board[0][2]
  31.     # 检查是否平局
  32.     if all(board[i][j] != EMPTY for i in range(ROWS) for j in range(COLS)):
  33.         return "Draw"
  34.     # 游戏未结束
  35.     return None
  36. # 函数:实现Minimax算法来找到最优的下棋位置
  37. def minimax(board, depth, is_maximizing):
  38.     result = check_game_over(board)
  39.     if result == PLAYER_X:
  40.         return -1  # X赢了
  41.     elif result == PLAYER_O:
  42.         return 1  # O赢了
  43.     elif result == "Draw":
  44.         return 0  # 平局
  45.     if is_maximizing:
  46.         best_score = -float('inf')
  47.         for i in range(ROWS):
  48.             for j in range(COLS):
  49.                 if board[i][j] == EMPTY:
  50.                     board[i][j] = PLAYER_O
  51.                     score = minimax(board, depth + 1, False)
  52.                     board[i][j] = EMPTY
  53.                     best_score = max(score, best_score)
  54.         return best_score
  55.     else:
  56.         best_score = float('inf')
  57.         for i in range(ROWS):
  58.             for j in range(COLS):
  59.                 if board[i][j] == EMPTY:
  60.                     board[i][j] = PLAYER_X
  61.                     score = minimax(board, depth + 1, True)
  62.                     board[i][j] = EMPTY
  63.                     best_score = min(score, best_score)
  64.         return best_score
  65. # 函数:让电脑选择最优的下棋位置
  66. def computer_move(board):
  67.     best_move = None
  68.     best_score = -float('inf')
  69.     for i in range(ROWS):
  70.         for j in range(COLS):
  71.             if board[i][j] == EMPTY:
  72.                 board[i][j] = PLAYER_O
  73.                 score = minimax(board, 0, False)
  74.                 board[i][j] = EMPTY
  75.                 if score > best_score:
  76.                     best_score = score
  77.                     best_move = (i, j)
  78.     board[best_move[0]][best_move[1]] = PLAYER_O
  79. # 主函数:控制游戏流程
  80. def main():
  81.     board = [[EMPTY for _ in range(COLS)] for _ in range(ROWS)]
  82.     current_player = PLAYER_O#设置先行玩家PLAYER_X为人,PLAYER_O为AI
  83.     print("欢迎使用三子棋程序!")
  84.     print_board(board)
  85.     while True:
  86.         if current_player == PLAYER_X:
  87.             row = int(input("请输入你要下的行 (0, 1, 2) :"))
  88.             col = int(input("请输入你要下的列 (0, 1, 2) :"))
  89.             if board[row][col] == EMPTY:
  90.                 board[row][col] = PLAYER_X
  91.                 current_player = PLAYER_O
  92.             else:
  93.                 print("移动错误,当前位置有棋,请重下")
  94.                 continue
  95.         else:
  96.             print("AI走棋")
  97.             computer_move(board)
  98.             current_player = PLAYER_X
  99.         print_board(board)
  100.         game_result = check_game_over(board)
  101.         if game_result:
  102.             if game_result == "Draw":
  103.                 print("平局!")
  104.             else:
  105.                 if game_result == 'O':
  106.                     print(f" AI获胜!")
  107.                 else:
  108.                     print(f" 恭喜你获胜!")
  109.             break
  110. if __name__ == "__main__":
  111.     main()
复制代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define ROWS 3
  5. #define COLS 3
  6. #define PLAYER_X 'X'
  7. #define PLAYER_O 'O'
  8. #define EMPTY ' '
  9. // 打印棋盘
  10. void print_board(char board[ROWS][COLS]) {
  11.     for (int i = 0; i < ROWS; ++i) {
  12.         printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
  13.         if (i != ROWS - 1) {
  14.             printf("---|---|---\n");
  15.         }
  16.     }
  17. }
  18. // 检查游戏是否结束(胜负或平局)
  19. char check_game_over(char board[ROWS][COLS]) {
  20.     // 检查行和列
  21.     for (int i = 0; i < ROWS; ++i) {
  22.         if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != EMPTY) {
  23.             return board[i][0];
  24.         }
  25.         if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != EMPTY) {
  26.             return board[0][i];
  27.         }
  28.     }
  29.     // 检查对角线
  30.     if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != EMPTY) {
  31.         return board[0][0];
  32.     }
  33.     if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != EMPTY) {
  34.         return board[0][2];
  35.     }
  36.     // 检查是否平局
  37.     bool is_draw = true;
  38.     for (int i = 0; i < ROWS; ++i) {
  39.         for (int j = 0; j < COLS; ++j) {
  40.             if (board[i][j] == EMPTY) {
  41.                 is_draw = false;
  42.                 break;
  43.             }
  44.         }
  45.         if (!is_draw) {
  46.             break;
  47.         }
  48.     }
  49.     if (is_draw) {
  50.         return 'D'; // 平局
  51.     }
  52.     return ' '; // 游戏未结束
  53. }
  54. // Minimax算法实现
  55. int minimax(char board[ROWS][COLS], int depth, bool is_maximizing) {
  56.     char result = check_game_over(board);
  57.     if (result == PLAYER_X) {
  58.         return -1; // X赢了
  59.     } else if (result == PLAYER_O) {
  60.         return 1; // O赢了
  61.     } else if (result == 'D') {
  62.         return 0; // 平局
  63.     }
  64.     if (is_maximizing) {
  65.         int best_score = -1000; // 初始最小值
  66.         for (int i = 0; i < ROWS; ++i) {
  67.             for (int j = 0; j < COLS; ++j) {
  68.                 if (board[i][j] == EMPTY) {
  69.                     board[i][j] = PLAYER_O;
  70.                     int score = minimax(board, depth + 1, false);
  71.                     board[i][j] = EMPTY;
  72.                     best_score = score > best_score ? score : best_score;
  73.                 }
  74.             }
  75.         }
  76.         return best_score;
  77.     } else {
  78.         int best_score = 1000; // 初始最大值
  79.         for (int i = 0; i < ROWS; ++i) {
  80.             for (int j = 0; j < COLS; ++j) {
  81.                 if (board[i][j] == EMPTY) {
  82.                     board[i][j] = PLAYER_X;
  83.                     int score = minimax(board, depth + 1, true);
  84.                     board[i][j] = EMPTY;
  85.                     best_score = score < best_score ? score : best_score;
  86.                 }
  87.             }
  88.         }
  89.         return best_score;
  90.     }
  91. }
  92. // 计算并返回电脑的最优下棋位置
  93. void computer_move(char board[ROWS][COLS]) {
  94.     int best_score = -1000;
  95.     int best_move_row = -1;
  96.     int best_move_col = -1;
  97.     for (int i = 0; i < ROWS; ++i) {
  98.         for (int j = 0; j < COLS; ++j) {
  99.             if (board[i][j] == EMPTY) {
  100.                 board[i][j] = PLAYER_O;
  101.                 int score = minimax(board, 0, false);
  102.                 board[i][j] = EMPTY;
  103.                 if (score > best_score) {
  104.                     best_score = score;
  105.                     best_move_row = i;
  106.                     best_move_col = j;
  107.                 }
  108.             }
  109.         }
  110.     }
  111.     board[best_move_row][best_move_col] = PLAYER_O;
  112. }
  113. // 主函数:控制游戏流程
  114. int main() {
  115.     char board[ROWS][COLS];
  116.     char current_player = PLAYER_X;//先落子玩家,PLAYER_X为玩家,PLAYER_O为电脑
  117.     // 初始化棋盘
  118.     for (int i = 0; i < ROWS; ++i) {
  119.         for (int j = 0; j < COLS; ++j) {
  120.             board[i][j] = EMPTY;
  121.         }
  122.     }
  123.     // 游戏循环
  124.     while (true) {
  125.         // 打印当前棋盘状态
  126.         printf("\nCurrent board:\n");
  127.         print_board(board);
  128.         // 检查游戏是否结束
  129.         char game_result = check_game_over(board);
  130.         if (game_result != ' ') {
  131.             if (game_result == 'D') {
  132.                 printf("It's a draw!\n");
  133.             } else {
  134.                 printf("%c wins!\n", game_result);
  135.             }
  136.             break;
  137.         }
  138.         // 根据当前玩家决定下棋
  139.         if (current_player == PLAYER_X) {
  140.             int row, col;
  141.             printf("\nEnter row number (0, 1, 2) for your move: ");
  142.             scanf("%d", &row);
  143.             printf("Enter column number (0, 1, 2) for your move: ");
  144.             scanf("%d", &col);
  145.             if (board[row][col] == EMPTY) {
  146.                 board[row][col] = PLAYER_X;
  147.                 current_player = PLAYER_O;
  148.             } else {
  149.                 printf("Invalid move! That position is already taken. Try again.\n");
  150.                 continue;
  151.             }
  152.         } else {
  153.             printf("\nComputer's turn:\n");
  154.             computer_move(board);
  155.             current_player = PLAYER_X;
  156.         }
  157.     }
  158.     return 0;
  159. }
复制代码
 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

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