为了学习 Clojure,我正在开发一个小井字游戏。在相对轻松地完成游戏的第一部分后,我一直在努力尝试构建一个智能电脑播放器。
对于我正在编写以帮助指导这一点的测试,如果轮到计算机,我想检查计算机是否选择了点 9,这是板:
X | ○ | 3
4 | X | 7
| 8 | 9
开始游戏时,将棋盘定义为这样的地图,其键值对表示棋盘上的位置和该空间的内容:
(def board {1 "1" 2 "2" 3 "3" 4 "4" 5 "5" 6 "6" 7 "7" 8 "8" 9 "9"})
我对如何解决这个问题有一些想法。一种是这样定义获胜集:
(def winning-sets
[[(board 1) (board 2) (board 3)],
[(board 4) (board 5) (board 6)],
[(board 7) (board 8) (board 9)],
[(board 1) (board 4) (board 7)],
[(board 2) (board 5) (board 8)],
[(board 3) (board 6) (board 9)],
[(board 1) (board 5) (board 9)],
[(board 3) (board 5) (board 7)]])
遍历每个集合:
(for [set winning-sets]
(filter #(= symbol %) set))
但这似乎不对……我不知道从那里去哪里。我试图解决的问题可以这样描述:
告诉计算机查看 8 个获胜组,并找到一组有两个符号和一个空位。
我对 Clojure 还很陌生,所以我不确定我是否理解解决这个问题的最佳方法。我一直在查看ClojureDocs(检查迭代函数,如for
andloop
和case
),但无法完成这项工作。
迭代这些获胜集的最佳方法是什么,目前是矢量形式,并找到具有两个特定符号和一个开口的集合?还是最好将获胜集存储在不同的数据结构中?
注意:我已阅读对此问题的回复,但无法将它们应用于我的。