鱼C论坛

 找回密码
 立即注册
查看: 684|回复: 7

[已解决]用python实现一个五子棋

[复制链接]
发表于 2024-1-2 16:35:38 | 显示全部楼层 |阅读模式

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

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

x
嗨,AI助理,帮我用python实现一份井字棋游戏的代码
最佳答案
2024-1-2 16:47:08
Stubborn 发表于 2024-01-02 16:45
代码帮我格式化一下谢谢


当然,这里是格式化后的代码:

  1. import random

  2. # 初始化棋盘
  3. board = [' ' for _ in range(9)]

  4. # 定义棋盘打印函数
  5. def print_board():
  6.     for i in range(0, 9, 3):
  7.         print(board[i], '|', board[i+1], '|', board[i+2])
  8.         print('-' * 9)

  9. # 判断是否获胜
  10. def check_win(player):
  11.     # 水平方向判断
  12.     for i in range(0, 9, 3):
  13.         if board[i] == board[i+1] == board[i+2] == player:
  14.             return True
  15.         
  16.     # 垂直方向判断
  17.     for i in range(3):
  18.         if board[i] == board[i+3] == board[i+6] == player:
  19.             return True
  20.    
  21.     # 对角线判断
  22.     if board[0] == board[4] == board[8] == player or \
  23.        board[2] == board[4] == board[6] == player:
  24.         return True
  25.    
  26.     return False

  27. # 判断是否平局
  28. def check_tie():
  29.     return ' ' not in board

  30. # 人类玩家走棋
  31. def player_move():
  32.     while True:
  33.         move = input("请输入要下棋的位置(1-9):")
  34.         move = int(move) - 1
  35.         if move >= 0 and move < 9 and board[move] == ' ':
  36.             board[move] = 'X'
  37.             break
  38.         else:
  39.             print("无效的输入,请重新输入!")

  40. # 电脑玩家走棋
  41. def computer_move():
  42.     # 尝试赢棋
  43.     for move in range(9):
  44.         if board[move] == ' ':
  45.             board[move] = 'O'
  46.             if check_win('O'):
  47.                 return
  48.    
  49.     # 阻止人类玩家赢棋
  50.     for move in range(9):
  51.         if board[move] == ' ':
  52.             board[move] = 'O'
  53.             if check_win('X'):
  54.                 board[move] = ' '
  55.                 return
  56.    
  57.     # 随机选择可用的位置
  58.     available_moves = [move for move in range(9) if board[move] == ' ']
  59.     move = random.choice(available_moves)
  60.     board[move] = 'O'

  61. # 游戏主循环
  62. def main():
  63.     print("欢迎来到井字棋游戏!")
  64.     print_board()
  65.    
  66.     while True:
  67.         player_move()
  68.         print_board()
  69.         if check_win('X'):
  70.             print("你赢了!恭喜!")
  71.             break
  72.         
  73.         if check_tie():
  74.             print("平局!")
  75.             break
  76.         
  77.         computer_move()
  78.         print_board()
  79.         if check_win('O'):
  80.             print("电脑赢了,再接再厉!")
  81.             break
  82.         
  83.         if check_tie():
  84.             print("平局!")
  85.             break

  86. # 运行游戏
  87. main()
复制代码


这样应该更加清晰易读。祝你玩得开心!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-2 16:35:58 | 显示全部楼层
当然可以!下面是一个简单的五子棋游戏的实现示例:

  1. # 初始化棋盘
  2. board = [[' ']*15 for _ in range(15)]

  3. # 定义棋盘打印函数
  4. def print_board(board):
  5.     for i in range(len(board)):
  6.         print(' '.join(board[i]))

  7. # 判断是否连成五子
  8. def check_win(board, row, col, player):
  9.     # 判断水平方向
  10.     count = 0
  11.     i = col - 4 if col >= 4 else 0
  12.     while i <= col:
  13.         if board[row][i] == player:
  14.             count += 1
  15.             if count == 5:
  16.                 return True
  17.         else:
  18.             count = 0
  19.         i += 1
  20.     i = col + 1
  21.     while i < len(board[0]) and i <= col + 4:
  22.         if board[row][i] == player:
  23.             count += 1
  24.             if count == 5:
  25.                 return True
  26.         else:
  27.             count = 0
  28.         i += 1

  29.     # 判断垂直方向
  30.     count = 0
  31.     i = row - 4 if row >= 4 else 0
  32.     while i <= row:
  33.         if board[i][col] == player:
  34.             count += 1
  35.             if count == 5:
  36.                 return True
  37.         else:
  38.             count = 0
  39.         i += 1
  40.     i = row + 1
  41.     while i < len(board) and i <= row + 4:
  42.         if board[i][col] == player:
  43.             count += 1
  44.             if count == 5:
  45.                 return True
  46.         else:
  47.             count = 0
  48.         i += 1

  49.     # 判断左上到右下方向
  50.     count = 0
  51.     i, j = row - 4 if row >= 4 else 0, col - 4 if col >= 4 else 0
  52.     while i <= row and j <= col:
  53.         if board[i][j] == player:
  54.             count += 1
  55.             if count == 5:
  56.                 return True
  57.         else:
  58.             count = 0
  59.         i += 1
  60.         j += 1
  61.     i, j = row + 1, col + 1
  62.     while i < len(board) and i <= row + 4 and j < len(board[0]) and j <= col + 4:
  63.         if board[i][j] == player:
  64.             count += 1
  65.             if count == 5:
  66.                 return True
  67.         else:
  68.             count = 0
  69.         i += 1
  70.         j += 1

  71.     # 判断右上到左下方向
  72.     count = 0
  73.     i, j = row + 4 if row + 4 < len(board) else len(board) - 1, col - 4 if col >= 4 else 0
  74.     while i >= row and j <= col:
  75.         if board[i][j] == player:
  76.             count += 1
  77.             if count == 5:
  78.                 return True
  79.         else:
  80.             count = 0
  81.         i -= 1
  82.         j += 1
  83.     i, j = row - 1, col + 1
  84.     while i >= 0 and i >= row - 4 and j < len(board[0]) and j <= col + 4:
  85.         if board[i][j] == player:
  86.             count += 1
  87.             if count == 5:
  88.                 return True
  89.         else:
  90.             count = 0
  91.         i -= 1
  92.         j += 1

  93.     return False

  94. # 游戏主循环
  95. player = 'X'
  96. print_board(board)
  97. while True:
  98.     move = input("请玩家 %s 输入落子位置,格式为 行,列:" % player).split(',')
  99.     row, col = int(move[0]), int(move[1])
  100.    
  101.     if board[row][col] == ' ':
  102.         board[row][col] = player
  103.         if check_win(board, row, col, player):
  104.             print("玩家 %s 获胜!" % player)
  105.             break
  106.         player = 'O' if player == 'X' else 'X'
  107.     else:
  108.         print("该位置已有棋子,请重新输入!")
  109.    
  110.     print_board(board)
复制代码


这个游戏使用命令行进行交互,每次轮到一个玩家输入棋子的坐标。游戏会根据输入的坐标在棋盘上放置对应的棋子,并判断是否有玩家获胜。如果某个玩家连成了五子,游戏结束并宣布获胜者。

希望这可以帮助到你!祝玩得愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-2 16:39:43 | 显示全部楼层
FishC 发表于 2024-1-2 16:35
当然可以!下面是一个简单的五子棋游戏的实现示例:

非常抱歉,我需要的是井字棋游戏的代码,帮我实现人机可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 16:40:03 | 显示全部楼层
Stubborn 发表于 2024-01-02 16:39
非常抱歉,我需要的是井字棋游戏的代码,帮我实现人机 ...


没问题!下面是一个简单的人机对战的井字棋游戏代码:

  1. import random

  2. # 初始化棋盘
  3. board = [' ' for _ in range(9)]

  4. # 定义棋盘打印函数
  5. def print_board(board):
  6.     for i in range(3):
  7.         print(board[i*3], '|', board[i*3+1], '|', board[i*3+2])
  8.         print('-' * 9)

  9. # 判断是否获胜
  10. def check_win(board, player):
  11.     # 水平方向判断
  12.     for i in range(0, 9, 3):
  13.         if board[i] == board[i+1] == board[i+2] == player:
  14.             return True
  15.    
  16.     # 垂直方向判断
  17.     for i in range(3):
  18.         if board[i] == board[i+3] == board[i+6] == player:
  19.             return True
  20.    
  21.     # 对角线判断
  22.     if board[0] == board[4] == board[8] == player or \
  23.        board[2] == board[4] == board[6] == player:
  24.         return True
  25.    
  26.     return False

  27. # 判断是否平局
  28. def check_tie(board):
  29.     return ' ' not in board

  30. # 人类玩家走棋
  31. def player_move(board):
  32.     while True:
  33.         move = input("请输入要下棋的位置(1-9):")
  34.         move = int(move) - 1
  35.         if move >= 0 and move < 9 and board[move] == ' ':
  36.             board[move] = 'X'
  37.             break
  38.         else:
  39.             print("无效的输入,请重新输入!")

  40. # 电脑玩家走棋
  41. def computer_move(board):
  42.     # 随机选择可用的位置
  43.     available_moves = [i for i, x in enumerate(board) if x == ' ']
  44.     move = random.choice(available_moves)
  45.     board[move] = 'O'

  46. # 游戏主循环
  47. def main():
  48.     print("欢迎来到井字棋游戏!")
  49.     print_board(board)

  50.     while True:
  51.         player_move(board)
  52.         print_board(board)

  53.         if check_win(board, 'X'):
  54.             print("你赢了!恭喜!")
  55.             break

  56.         if check_tie(board):
  57.             print("平局!")
  58.             break

  59.         computer_move(board)
  60.         print_board(board)

  61.         if check_win(board, 'O'):
  62.             print("电脑赢了,再接再厉!")
  63.             break

  64.         if check_tie(board):
  65.             print("平局!")
  66.             break

  67. # 运行游戏
  68. main()
复制代码


在这个游戏中,玩家使用数字1-9来指定棋盘上的位置进行下棋,电脑会随机选择一个可用的位置进行落子。请注意,代码中的电脑策略非常简单,没有太强的智能。你可以根据自己的需求进一步优化策略。祝你玩得开心!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-2 16:41:37 | 显示全部楼层
FishC 发表于 2024-1-2 16:40
没问题!下面是一个简单的人机对战的井字棋游戏代码:

我想要井字棋人机厉害一些,可以帮我实现吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 16:43:33 | 显示全部楼层
Stubborn 发表于 2024-01-02 16:41
我想要井字棋人机厉害一些,可以帮我实现吗


当然可以!下面是一个稍微智能一些的井字棋人机代码:import random# 初始化棋盘board = # 定义棋盘打印函数def print_board(board):    for i in range(3):        print(board, '|', board, '|', board)        print('-' * 9)# 判断是否获胜def check_win(board, player):    # 水平方向判断    for i in range(0, 9, 3):        if board == board == board == player:            return True        # 垂直方向判断    for i in range(3):        if board == board == board == player:            return True        # 对角线判断    if board == board == board == player or \       board == board == board == player:        return True        return False# 判断是否平局def check_tie(board):    return ' ' not in board# 人类玩家走棋def player_move(board):    while True:        move = input("请输入要下棋的位置(1-9):")        move = int(move) - 1        if move >= 0 and move < 9 and board == ' ':            board = 'X'            break        else:            print("无效的输入,请重新输入!")# 电脑玩家走棋def computer_move(board):    # 尝试赢棋    for move in range(9):        if board == ' ':            board = 'O'            return    # 阻止人类玩家赢棋    for move in range(9):        if board == ' ':            board = 'O'            return    # 随机选择可用的位置    available_moves =     move = random.choice(available_moves)    board = 'O'# 游戏主循环def main():    print("欢迎来到井字棋游戏!")    print_board(board)    while True:        player_move(board)        print_board(board)        if check_win(board, 'X'):            print("你赢了!恭喜!")            break        if check_tie(board):            print("平局!")            break        computer_move(board)        print_board(board)        if check_win(board, 'O'):            print("电脑赢了,再接再厉!")            break        if check_tie(board):            print("平局!")            break# 运行游戏main()这个代码中,电脑会尝试优先赢棋,然后阻止人类玩家赢棋,最后才是随机选择可用位置。这样的策略会使得电脑玩家比较强大一些。祝你玩得愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-2 16:45:46 | 显示全部楼层
FishC 发表于 2024-1-2 16:43
当然可以!下面是一个稍微智能一些的井字棋人机代码:import random# 初始化棋盘board = # 定义棋盘打 ...

代码帮我格式化一下谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-2 16:47:08 | 显示全部楼层    本楼为最佳答案   
Stubborn 发表于 2024-01-02 16:45
代码帮我格式化一下谢谢


当然,这里是格式化后的代码:

  1. import random

  2. # 初始化棋盘
  3. board = [' ' for _ in range(9)]

  4. # 定义棋盘打印函数
  5. def print_board():
  6.     for i in range(0, 9, 3):
  7.         print(board[i], '|', board[i+1], '|', board[i+2])
  8.         print('-' * 9)

  9. # 判断是否获胜
  10. def check_win(player):
  11.     # 水平方向判断
  12.     for i in range(0, 9, 3):
  13.         if board[i] == board[i+1] == board[i+2] == player:
  14.             return True
  15.         
  16.     # 垂直方向判断
  17.     for i in range(3):
  18.         if board[i] == board[i+3] == board[i+6] == player:
  19.             return True
  20.    
  21.     # 对角线判断
  22.     if board[0] == board[4] == board[8] == player or \
  23.        board[2] == board[4] == board[6] == player:
  24.         return True
  25.    
  26.     return False

  27. # 判断是否平局
  28. def check_tie():
  29.     return ' ' not in board

  30. # 人类玩家走棋
  31. def player_move():
  32.     while True:
  33.         move = input("请输入要下棋的位置(1-9):")
  34.         move = int(move) - 1
  35.         if move >= 0 and move < 9 and board[move] == ' ':
  36.             board[move] = 'X'
  37.             break
  38.         else:
  39.             print("无效的输入,请重新输入!")

  40. # 电脑玩家走棋
  41. def computer_move():
  42.     # 尝试赢棋
  43.     for move in range(9):
  44.         if board[move] == ' ':
  45.             board[move] = 'O'
  46.             if check_win('O'):
  47.                 return
  48.    
  49.     # 阻止人类玩家赢棋
  50.     for move in range(9):
  51.         if board[move] == ' ':
  52.             board[move] = 'O'
  53.             if check_win('X'):
  54.                 board[move] = ' '
  55.                 return
  56.    
  57.     # 随机选择可用的位置
  58.     available_moves = [move for move in range(9) if board[move] == ' ']
  59.     move = random.choice(available_moves)
  60.     board[move] = 'O'

  61. # 游戏主循环
  62. def main():
  63.     print("欢迎来到井字棋游戏!")
  64.     print_board()
  65.    
  66.     while True:
  67.         player_move()
  68.         print_board()
  69.         if check_win('X'):
  70.             print("你赢了!恭喜!")
  71.             break
  72.         
  73.         if check_tie():
  74.             print("平局!")
  75.             break
  76.         
  77.         computer_move()
  78.         print_board()
  79.         if check_win('O'):
  80.             print("电脑赢了,再接再厉!")
  81.             break
  82.         
  83.         if check_tie():
  84.             print("平局!")
  85.             break

  86. # 运行游戏
  87. main()
复制代码


这样应该更加清晰易读。祝你玩得开心!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 21:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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