Python实现井字棋游戏

(人与AI对战)死都下不赢AI,只能打个平手...
摘要由CSDN通过智能技术生成

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜

不得不说,井字棋是我们上课时与同桌打发枯燥时光,必不可少的游戏。简单又有趣,但玩透了之后,基本是平局。

在这里插入图片描述

  • 中心(4)
  • 角(0、2、6、8)
  • 边(1、3、5、7)

获胜规律:
先手下角,后手必中
先手下中,后手必角
否则,必有一个死棋

井字棋的设计思路

棋盘采用包含9个元素的列表来实现

棋盘bord,

bord[0]到bord[8]存储代表棋子的字符串

在这里插入图片描述

字符串0到8代表未落子

字符串XO表示两种棋子

程序的流程:

  1. 初始化棋盘
board = list("012345678")
  1. 询问玩家选择棋子:棋子X先走,棋子O后走
  2. 显示棋盘及落子布局
def display_board(board):
    """显示棋盘"""
    print("\t{0} | {1} | {2}".format(board[0], board[1], board[2]))
    print("\t_ | _ | _")
    print("\t{0} | {1} | {2}".format(board[3], board[4], board[5]))
    print("\t_ | _ | _")
    print("\t{0} | {1} | {2}".format(board[6], board[7], board[8]))
  1. 循环轮流落子

计算机人工智能(AI)落子算法如下:

  • 如果某位置落子可以获胜,则选择该位置
  • 否则,如果某个位置,玩家下一步落子可以获胜,则选择该位置
  • 否则,按中心(4)、角(0、2、6、8)、边(1、3、5、7)顺序选择空的位置

就按照这个规律,我下不赢AI,把把都是平手…

AI需要先得到棋盘可落子位置(棋盘该位置若为‘O’、‘X’则表明已被落子)

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

三个参数:棋盘(数据类型:列表)、AI棋子类型、玩家棋子类型
调用函数isWinner(),赢则返回True

def getComputerMove(board, computerLetter, playerLetter):
    """核心算法:计算人工智能AI的落子位置"""
    boardcopy = board.copy()

    # 规则一:判断如果某位置落子可以获胜,则选择该位置
    for move in legal_moves(boardcopy):
        boardcopy[move] = computerLetter
        if isWinner(boardcopy):
            return move
        boardcopy[move] = str(move)  #复原
    
    # 规则二:某个位置玩家下一步落子可以获胜,则选择该位置
    for move in legal_moves(boardcopy):
        boardcopy[move
  • 18
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值