井字棋游戏使用python实现

井字棋的简介:
在这里插入图片描述
井字棋的设计思路:
在这里插入图片描述
井字棋的实现代码:

def display_board(b):
    """显示棋盘"""
    print("\t{0}|{1}|{2}".format(b[0], b[1], b[2]))
    print("\t_|_|_")
    print("\t{0}|{1}|{2}".format(b[3], b[4], b[5]))
    print("\t_|_|_")
    print("\t{0}|{1}|{2}".format(b[6], b[7], b[8]))


def legal_moves(board):
    """"返回可落子的位置列表"""
    moves = []
    for i in range(9):
        if board[i] in list("012345678"):
            moves.append(i)
    return moves


def get_player_move(board):
    """"询问并确定玩家(player)选择落子位置,无效位置时重复询问"""
    move = 9  # 初始值9为错误信息
    while move not in legal_moves(board):
        move = int(input("请选择落子位置(0-8)"))
    return move


def get_computer_move(board, computer_letter, player_letter):
    """计算人工智能AI的落子位置, Tic Tac Toe Ai核心算法"""
    board_copy = board.copy()  # 拷贝棋盘, 不影响原来的
    # 规则1: 判断如果某位置落子可以获胜,则选择该位置
    for move in legal_moves(board_copy):
        board_copy[move] = computer_letter
        if is_winner(board_copy, computer_letter):  # 判断是否获胜
            return move
        board_copy[move] = str(move)

    # 规则2: 某个位置玩家下一步落子可以获胜,则选择该位置
    for move in legal_moves(board_copy):
        board_copy[move] = player_letter
        if is_winner(board_copy, player_letter): # 判断是否获胜
            return move
        board_copy[move] = str(move)

    # 规则3: 按照中心(4)、角(0, 2, 6, 8) 以及边(1, 3, 5, 7)
    for move in (4, 0, 2, 6, 8, 1, 3, 5, 7):
        if move in legal_moves(board):
            return move


def is_winner(board, letter):
    """判断所给的棋子是否获胜"""
    ways_to_win = {(0, 1, 2), (3, 4, 5), (6, 7, 8), (1, 4, 7),
                   (2, 5, 8), (0, 4, 8), (2, 4, 6)}
    for r in ways_to_win:
        if board[r[0]] == board[r[1]] == board[r[2]]:
            return True
    return False


def is_tie(board):
    """"判断是否平局"""
    for i in list("012345678"):
        if i in board:
            return False
    return True


def tic_tac_toe():
    """进字棋"""
    # 初始化棋盘
    board = list("012345678")
    # 询问玩家选择棋子:棋子X先走, 棋子O后走
    player_letter = input("请选择棋子X或0(X先走,O后走):")
    if player_letter in ("X", "x"):
        turn = "player"  # 玩家先走
        computer_letter = "O"
    else:
        turn = "computer"
        computer_letter = "X"
        player_letter = "O"
    print("{}先走!".format(turn))

    while True:  # 循环轮流落子
        display_board(board)
        if turn == 'player':  # 玩家落子
            move = get_player_move(board)  # 询问落子位置
            board[move] = player_letter   # 落子
            if is_winner(board, player_letter):  # 判断是否获胜
                display_board(board)
                print("恭喜玩家获胜!")
                break
            else:
                turn = "computer"
        else:  # 计算机人工智能AI落子
            move = get_computer_move(board, computer_letter, player_letter)
            print("计算机人工智能AI落子的位置:", move)
            board[move] = computer_letter   # 落子
            if is_winner(board, computer_letter):  # 判断是否获胜
                display_board(board)
                print('计算机人工智能AI获胜!')
                break
            else:
                turn = "player"
        # 判断是否平局
        if is_tie(board):
            display_board(board)
            print("平局!")
            break


if __name__ == '__main__':
    tic_tac_toe()

展示效果:
在这里插入图片描述

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值