- 推荐自己的专栏:分享一些Python案例,将所学用出来
井字棋,英文名叫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代表未落子
字符串X
、O
表示两种棋子
程序的流程:
- 初始化棋盘
board = list("012345678")
- 询问玩家选择棋子:棋子
X
先走,棋子O
后走 - 显示棋盘及落子布局
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]))
- 循环轮流落子
计算机人工智能(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