player
这里通过遍历
board
,统计 X 与 O 的数量来确定当前的回合的 player
是谁copilot 在审查我的代码的时候给出了比较巧妙的统计方法,我其实对 python 的一些类的方法不是很熟悉,因此自己写的会比较笨
actions
这里依旧是遍历,然后把空的位置作为
action
给添加按照要求,这里的
actions
应该是 set
类型result
这里是通过当前的
board
和 action
,来返回 action
后的结果按照文档的要求,需要对异常情况进行处理,但我一开始忽视了
同时,这里需要用到深度拷贝,防止更改原本的
board
(需要导入 copy
)winner
这里需要检查是否获胜,也就是某个方向能三个连起来
在检查的时候需要注意,在赋值给
symbol
,比较之前,需要查看是否为 empty
,不然的话三个 empty
连着也会 return
terminal
这里是检查是否结束
有赢家的话,就结束
没赢家,且没空位,结束
没有加,有空位,没结束
utility
给分环节
minimax
这里是最重要的部分,也是最难的部分,需要实现
minimax
这里我根据课上给的伪代码,实现了
min value
和 max value
的函数,用于作为辅助函数帮着递归接下来的情况对于
minimax
函数,需要根据 player 来分情况讨论X 是追求 max,O 最求 min
这里由于要求是返回
action
,而不是 value
,因此我们在 minimax
中不能直接套用 min/max value
而是需要遍历
actions
,在 value
改变时,同时改变 action
的值,实现记录,以便最终返回