Python 案例分析|井字棋(Tic Tac Toe)游戏

简介: 【案例目的】 本案例通过一个井字棋游戏的设计和实现,帮助大家了解 Python 函数的定义和使用。

01、井字棋游戏概述

井字棋又称三子棋、三连棋,英文名为 Tic Tac Toe,是一款休闲益智游戏。具体玩法为在一个 3*3 的棋盘上,一个玩家用 X 做棋子,另一个玩家用 O 做棋子,谁先在棋盘上的一行、一列或者对角线上画满三个棋子,即可获胜,如果棋盘下满无人胜出,即为平局。

image.png


# 02、井字棋游戏设计思路
棋盘采用包含 9 个元素的列表来表示,board[0]到 board[8]存储代表棋子的字符串,字符串中可以包含"X"、"O"、或者数字 0 到 8(表示未落子)。

程序的流程如下:

(1)初始化棋盘;

(2)询问玩家选择棋子:棋子 X 先走,棋子 O 后走;

(3)显示棋盘及落子布局(调用函数 display_board());

(4)循环轮流落子:

(4-1)如果玩家落子,则询问落子位置(调用函数 getPlayerMove(),然后判断玩家是否获胜(调用函数 isWinner()),如果获胜,显示棋盘(调用函数 display_board()),输出信息,break 跳出循环;

(4-2)如果计算机人工智能(AI)落子,则根据计算机人工智能(AI)落子算法计算落子位置,然后判断 AI 是否获胜(调用函数 isWinner()),如果 AI 获胜,则显示棋盘(调用函数 display_board()),输出信息,break 跳出循环;

(4-3)判断是否平局(调用函数 isTie()),如果平局,则显示棋盘(调用函数 display_board()),输出信息,break 跳出循环;否则继续轮流落子。

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

(1)如果某位置落子可以获胜,则选择该位置;

(2)否则,如果某个位置玩家下一步落子可以获胜,则选择该位置;

(3)否则,按中心(4)、角(0、2、6、8)、边(1、3、5、7)顺序选择空的位置。

判断输赢规则如下:如果三条横线((0,1,2), (3,4,5), (6,7,8))、三条竖线((0,3,6), (1,4,7), (2,5,8))、两条对角线((0,4,8), (2,4,6))共八种情况的三个位置的棋子相同,则该棋子方赢棋。如果全部位置落子,则平局。

# 03、井字棋游戏实现

【例 1】井字棋(Tic Tac Toe)游戏示例程序。y)。
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 getPlayerMove(board): """询问并确定玩家(player)选择落子位置,无效位置时重复询问""" move = 9 # 初始值9为错误的位置 while move not in legal_moves(board): move = int(input("请选择落子位置(0-8):")) return move def getComputerMove(board, computerLetter, playerLetter): """计算人工智能AI的落子位置,Tic Tac Toe AI核心算法""" boardcopy = board.copy() #拷贝棋盘,不影响原来 # 规则1:判断如果某位置落子可以获胜,则选择该位置 for move in legal_moves(boardcopy): boardcopy[move] = computerLetter if isWinner(boardcopy, computerLetter): #判断是否获胜 return move boardcopy[move] = str(move) # 规则2:某个位置玩家下一步落子可以获胜,则选择该位置 for move in legal_moves(boardcopy): boardcopy[move] = playerLetter if isWinner(boardcopy, playerLetter): #判断是否获胜 return move boardcopy[move] = str(move) # 规则2:按照中心(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 isWinner(board, letter): """判断所给的棋子是否获胜""" WAYS_TO_WIN = {(0,1,2),(3,4,5),(6,7,8),(0,3,6),(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 isTie(board): """判断是否平局""" for i in list("012345678"): if i in board: return False return True def tic_tac_toe(): """井字棋""" #初始化棋盘为['0', '1', '2', '3', '4', '5', '6', '7', '8'] board = list("012345678") #询问玩家选择棋子:棋子X先走,棋子O后走 playerLetter = input("请选择棋子X或O(X先走,O后走):") if playerLetter in ("X", "x"): turn = "player" #玩家先走 computerLetter = "O" else: turn = "computer" computerLetter = "X" playerLetter = "O" print("{}先走!".format(turn)) while True: #循环轮流落子 display_board(board) if turn == 'player': # 玩家落子 move = getPlayerMove(board) #询问落子位置 board[move] = playerLetter #落子 if isWinner(board, playerLetter): #判断是否获胜 display_board(board) print('恭喜玩家获胜!') break else: turn = "computer" else: #计算机人工智能AI落子 # 计算人工智能AI落子位置 move = getComputerMove(board, computerLetter, playerLetter) print("计算机人工智能AI落子位置:", move) board[move] = computerLetter #落子 if isWinner(board, computerLetter): #判断是否获胜 display_board(board) print('计算机人工智能AI获胜!') break else: turn = "player" #判断是否平局 if isTie(board): display_board(board) print('平局!') break if __name__ == '__main__': tic_tac_toe()
程序运行结果示例。

image.png


image.png

目录
相关文章
|
3天前
|
数据可视化 数据挖掘 Python
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(下)
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化
10 0
|
3天前
|
数据可视化 API 开发者
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(上)
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化
13 0
|
3天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】金融数据分析中的机器学习应用
【4月更文挑战第30天】本文探讨了机器学习在金融数据分析中的应用,如股价预测、信用评分、欺诈检测、算法交易和风险管理,并以Python为例展示了如何进行股价预测。通过使用机器学习模型,金融机构能更准确地评估风险、识别欺诈行为并优化交易策略。Python结合scikit-learn库简化了数据分析过程,助力金融从业者提高决策效率。随着技术发展,机器学习在金融领域的影响力将持续增强。
|
3天前
|
机器学习/深度学习 数据采集 TensorFlow
【Python机器学习专栏】使用Python进行图像分类的实战案例
【4月更文挑战第30天】本文介绍了使用Python和深度学习库TensorFlow、Keras进行图像分类的实战案例。通过CIFAR-10数据集,展示如何构建和训练一个卷积神经网络(CNN)模型,实现对10个类别图像的识别。首先安装必要库,然后加载数据集并显示图像。接着,建立基本CNN模型,编译并训练模型,最后评估其在测试集上的准确性。此案例为初学者提供了图像分类的入门教程,为进一步学习和优化打下基础。
|
3天前
|
机器学习/深度学习 Python
【Python 机器学习专栏】混淆矩阵与 ROC 曲线分析
【4月更文挑战第30天】本文介绍了机器学习中评估模型性能的两种工具——混淆矩阵和ROC曲线。混淆矩阵显示了模型在不同类别上的预测情况,包括真正例、假正例、真反例和假反例,帮助评估模型错误类型和数量。ROC曲线则通过假正率和真正率展示了模型的二分类性能,曲线越接近左上角,性能越好。文章还提供了Python中计算混淆矩阵和ROC曲线的代码示例,强调它们在模型选择、参数调整和理解模型行为中的应用价值。
|
3天前
|
数据采集 数据挖掘 测试技术
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
13 1
|
3天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
3天前
|
Python
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
|
3天前
|
自然语言处理 数据可视化 数据挖掘
数据代码分享|Python对全球Covid-19疫情失业数据相关性、可视化分析
数据代码分享|Python对全球Covid-19疫情失业数据相关性、可视化分析
|
3天前
|
资源调度 数据可视化 Python
Python随机波动模型Stochastic volatility,SV随机变分推断SVI分析标普500指数时间数据波动性可视化
Python随机波动模型Stochastic volatility,SV随机变分推断SVI分析标普500指数时间数据波动性可视化