Vector Clojure:对向量向量进行迭代,以找到满足特定条件的第一个向量

Vector Clojure:对向量向量进行迭代,以找到满足特定条件的第一个向量,vector,clojure,iteration,tic-tac-toe,Vector,Clojure,Iteration,Tic Tac Toe,为了学习Clojure,我正在做一个小的井字游戏。在相对轻松地完成游戏的第一部分后,我一直在努力打造一款智能电脑播放器 对于我写的帮助指导这一点的测试,我想检查计算机是否选择了第9点,如果轮到计算机,这是电路板: X|O|3 4|X|O 7 | 8 | 9 游戏开始时,棋盘的定义如下:一张地图,上面有键值对,表示棋盘上的位置和该空间的内容: (def board {1 "1" 2 "2" 3 "3" 4 "4" 5 "5" 6 "6" 7 "7" 8 "8" 9 "9"}) 我对如何解决这个问

为了学习Clojure,我正在做一个小的井字游戏。在相对轻松地完成游戏的第一部分后,我一直在努力打造一款智能电脑播放器

对于我写的帮助指导这一点的测试,我想检查计算机是否选择了第9点,如果轮到计算机,这是电路板:

X|O|3
4|X|O
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))
但这似乎不对…我不知道我会从那里走到哪里。我试图解决的问题可以这样描述:

(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)]])
告诉计算机查看8个获胜的组,找到一个有两个符号和一个空位的组。

我对Clojure还比较陌生,所以我不确定我是否了解解决这个问题的最佳方法。我一直在研究(检查迭代函数,如
for
loop
case
),但未能实现这一点

迭代那些获胜的集合(目前为矢量形式)并找到具有两个特定符号和一个开口的集合的最佳方法是什么?或者最好将获胜集存储在不同的数据结构中


注意:我已经阅读了对的回复,但还无法将其应用到我的回复中。

首先,我建议您使用此结构作为董事会职位:

(def board [[1 1 0] 
            [0 0 0] 
            [1 0 1]])
其中X是
1
,O是
-1
,空单元格是
0
。在我的示例中,电路板只有X个符号(为了简化)。其次,

这是“赢”的坐标集。如果有必要的话,你可以计算这个,但是对于3x3来说,这个列表并没有那么大。在这方面,你的问题的答案是

(defn check 
  [target combo] 
  (= (map #(count (filter (partial = %) combo)) [target 0]) '(2 1)))

(defn extract 
  [coords] 
  (apply vector (map (fn [[f s]] ((board f) s)) coords))) 

(filter #(check 1 (extract %)) winning-sets)
如果在REPL中执行此代码,您将看到

user=> (filter #(check 1 (extract %)) winning-sets)
([[0 0] [0 1] [0 2]] 
 [[2 0] [2 1] [2 2]] 
 [[0 0] [1 0] [2 0]] 
 [[0 0] [1 1] [2 2]])

这看起来像是正确的答案(2条水平线,1条垂直线和1条对角线)。代码是粗糙的,几乎没有办法使它更美观和可重用。我应该解释一下发生了什么还是代码足够清晰

我想你需要一些功能。