鱼C论坛

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

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

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

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

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

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


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

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

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

# 判断是否获胜
def check_win(player):
    # 水平方向判断
    for i in range(0, 9, 3):
        if board[i] == board[i+1] == board[i+2] == player:
            return True
        
    # 垂直方向判断
    for i in range(3):
        if board[i] == board[i+3] == board[i+6] == player:
            return True
    
    # 对角线判断
    if board[0] == board[4] == board[8] == player or \
       board[2] == board[4] == board[6] == player:
        return True
    
    return False

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

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

# 电脑玩家走棋
def computer_move():
    # 尝试赢棋
    for move in range(9):
        if board[move] == ' ':
            board[move] = 'O'
            if check_win('O'):
                return
    
    # 阻止人类玩家赢棋
    for move in range(9):
        if board[move] == ' ':
            board[move] = 'O'
            if check_win('X'):
                board[move] = ' '
                return
    
    # 随机选择可用的位置
    available_moves = [move for move in range(9) if board[move] == ' ']
    move = random.choice(available_moves)
    board[move] = 'O'

# 游戏主循环
def main():
    print("欢迎来到井字棋游戏!")
    print_board()
    
    while True:
        player_move()
        print_board()
        if check_win('X'):
            print("你赢了!恭喜!")
            break
        
        if check_tie():
            print("平局!")
            break
        
        computer_move()
        print_board()
        if check_win('O'):
            print("电脑赢了,再接再厉!")
            break
        
        if check_tie():
            print("平局!")
            break

# 运行游戏
main()

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

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

使用道具 举报

发表于 2024-1-2 16:35:58 | 显示全部楼层
当然可以!下面是一个简单的五子棋游戏的实现示例:
# 初始化棋盘
board = [[' ']*15 for _ in range(15)]

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

# 判断是否连成五子
def check_win(board, row, col, player):
    # 判断水平方向
    count = 0
    i = col - 4 if col >= 4 else 0
    while i <= col:
        if board[row][i] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1
    i = col + 1
    while i < len(board[0]) and i <= col + 4:
        if board[row][i] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1

    # 判断垂直方向
    count = 0
    i = row - 4 if row >= 4 else 0
    while i <= row:
        if board[i][col] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1
    i = row + 1
    while i < len(board) and i <= row + 4:
        if board[i][col] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1

    # 判断左上到右下方向
    count = 0
    i, j = row - 4 if row >= 4 else 0, col - 4 if col >= 4 else 0
    while i <= row and j <= col:
        if board[i][j] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1
        j += 1
    i, j = row + 1, col + 1
    while i < len(board) and i <= row + 4 and j < len(board[0]) and j <= col + 4:
        if board[i][j] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i += 1
        j += 1

    # 判断右上到左下方向
    count = 0
    i, j = row + 4 if row + 4 < len(board) else len(board) - 1, col - 4 if col >= 4 else 0
    while i >= row and j <= col:
        if board[i][j] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i -= 1
        j += 1
    i, j = row - 1, col + 1
    while i >= 0 and i >= row - 4 and j < len(board[0]) and j <= col + 4:
        if board[i][j] == player:
            count += 1
            if count == 5:
                return True
        else:
            count = 0
        i -= 1
        j += 1

    return False

# 游戏主循环
player = 'X'
print_board(board)
while True:
    move = input("请玩家 %s 输入落子位置,格式为 行,列:" % player).split(',')
    row, col = int(move[0]), int(move[1])
    
    if board[row][col] == ' ':
        board[row][col] = player
        if check_win(board, row, col, player):
            print("玩家 %s 获胜!" % player)
            break
        player = 'O' if player == 'X' else 'X'
    else:
        print("该位置已有棋子,请重新输入!")
    
    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
非常抱歉,我需要的是井字棋游戏的代码,帮我实现人机 ...


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

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

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

# 判断是否获胜
def check_win(board, player):
    # 水平方向判断
    for i in range(0, 9, 3):
        if board[i] == board[i+1] == board[i+2] == player:
            return True
    
    # 垂直方向判断
    for i in range(3):
        if board[i] == board[i+3] == board[i+6] == player:
            return True
    
    # 对角线判断
    if board[0] == board[4] == board[8] == player or \
       board[2] == board[4] == board[6] == 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[move] == ' ':
            board[move] = 'X'
            break
        else:
            print("无效的输入,请重新输入!")

# 电脑玩家走棋
def computer_move(board):
    # 随机选择可用的位置
    available_moves = [i for i, x in enumerate(board) if x == ' ']
    move = random.choice(available_moves)
    board[move] = '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()

在这个游戏中,玩家使用数字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
代码帮我格式化一下谢谢


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

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

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

# 判断是否获胜
def check_win(player):
    # 水平方向判断
    for i in range(0, 9, 3):
        if board[i] == board[i+1] == board[i+2] == player:
            return True
        
    # 垂直方向判断
    for i in range(3):
        if board[i] == board[i+3] == board[i+6] == player:
            return True
    
    # 对角线判断
    if board[0] == board[4] == board[8] == player or \
       board[2] == board[4] == board[6] == player:
        return True
    
    return False

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

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

# 电脑玩家走棋
def computer_move():
    # 尝试赢棋
    for move in range(9):
        if board[move] == ' ':
            board[move] = 'O'
            if check_win('O'):
                return
    
    # 阻止人类玩家赢棋
    for move in range(9):
        if board[move] == ' ':
            board[move] = 'O'
            if check_win('X'):
                board[move] = ' '
                return
    
    # 随机选择可用的位置
    available_moves = [move for move in range(9) if board[move] == ' ']
    move = random.choice(available_moves)
    board[move] = 'O'

# 游戏主循环
def main():
    print("欢迎来到井字棋游戏!")
    print_board()
    
    while True:
        player_move()
        print_board()
        if check_win('X'):
            print("你赢了!恭喜!")
            break
        
        if check_tie():
            print("平局!")
            break
        
        computer_move()
        print_board()
        if check_win('O'):
            print("电脑赢了,再接再厉!")
            break
        
        if check_tie():
            print("平局!")
            break

# 运行游戏
main()

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 22:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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