import{_ as i,D as l,c as t,j as e,a as o,I as a,a4 as d,o as n}from"./chunks/framework.DtvhUNIn.js";const O=JSON.parse('{"title":"项目:Tic-Tac-Toe 井字棋","description":"","frontmatter":{},"headers":[],"relativePath":"技术资源汇总(杭电支持版)/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md","filePath":"技术资源汇总(杭电支持版)/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md"}'),r={name:"技术资源汇总(杭电支持版)/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md"},s=e("h1",{id:"项目-tic-tac-toe-井字棋",tabindex:"-1"},[o("项目:Tic-Tac-Toe 井字棋 "),e("a",{class:"header-anchor",href:"#项目-tic-tac-toe-井字棋","aria-label":'Permalink to "项目:Tic-Tac-Toe 井字棋"'},"")],-1),p=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"😋 我们为你提供了一个简单有趣的项目,帮助你进行知识巩固,请认真阅读文档内容。"),e("p",null,"如果你卡住了,请记得回来阅读文档,或请求身边人的帮助。")],-1),u={class:"tip custom-block"},_=e("p",{class:"custom-block-title"},"📥",-1),h=d('
pip3 install -r requirements.txt
这个项目有两个主要文件:runner.py 和 tictactoe.py。tictactoe.py 包含了玩游戏和做出最佳动作的所有逻辑。runner.py 已经为你实现,它包含了运行游戏图形界面的所有代码。一旦你完成了 tictactoe.py 中所有必需的功能,你就可以运行 python runner.py 来对抗你的人工智能了!
让我们打开 tictactoe.py 来了解所提供的内容。首先,我们定义了三个变量:X、O 和 EMPTY,以表示游戏的可能移动。
函数 initial_state 返回游戏的启动状态。对于这个问题,我们选择将游戏状态表示为三个列表的列表(表示棋盘的三行),其中每个内部列表包含三个值,即 X、O 或 EMPTY。以下是我们留给你实现的功能!
实现 player, actions, result, winner, terminal, utility, 以及 minimax.
player 函数应该以棋盘状态作为输入,并返回轮到哪个玩家(X 或 O)。
actions 函数应该返回一组在给定的棋盘状态上可以采取的所有可能的操作。
(i,j),其中 i 对应于移动的行(0、1 或 2),j 对应于行中的哪个单元格对应于移动(也是 0、1、或 2)。result 函数以一个棋盘状态和一个动作作为输入,并且应该返回一个新的棋盘状态,而不修改原始棋盘。
action 函数接受了一个无效的动作,你的程序应该raise an exception.result 函数的正确实现。在做出任何更改之前,你可能需要先对棋盘状态进行deep copy。winner 函数应该接受一个棋盘作为输入,如果游戏结束,则返回游戏的获胜者。
None。terminal 函数应该接受一个棋盘作为输入,并返回一个布尔值,指示游戏是否结束。
True。False。utility 函数应接受结束棋盘状态作为输入,并输出该棋盘的分数。
terminal(board) 为 True 时,才会在棋盘上调用 utility。minimax 函数应该以一个棋盘作为输入,并返回玩家在该棋盘上移动的最佳移动。
(i,j),这是棋盘上允许的动作之一。如果多次移动都是同样最佳的,那么这些移动中的任何一次都是可以接受的。minimax 函数应返回 None。 对于所有接受棋盘作为输入的函数,你可以假设它是一个有效的棋盘(即,它是包含三行的列表,每行都有三个值 X、O 或 EMPTY)。你不应该修改所提供的函数声明(每个函数的参数的顺序或数量)。、 一旦所有功能都得到了正确的实现,你就应该能够运行 python runner.py 并与你的人工智能进行比赛。而且,由于井字棋是双方最佳比赛的平局,你永远不应该能够击败人工智能(尽管如果你打得不好,它可能会打败你!)from tictactoe import initial_state 的代码来导入它们。tictactoe.py 中添加其他辅助函数,前提是它们的名称不会与模块中已有的函数或变量名称冲突。