Clojure:行检查器中的相同向量值

时间:2017-10-31 08:15:07

标签: clojure

我正在创建一个Clojure Tic Tac Toe游戏,我有一个9个数字(def moves [0 0 0 0 0 0 0 0 0])的棋盘变量。这个变量用1的en 2(没有“x”或“o”)填充。在游戏结束时,变量看起来像[2 1 2 1 1 1 2 1 2],其中1拥有第二行。现在我需要一个函数来检查连续三个是否存在。我想横向开始。这意味着我需要一个函数来检查相同数字的每3个数字3之后是否存在。我有什么想法可以创建这样的函数? 所以这是迄今为止的功能:

(def moves [0 0 0 0 0 0 0 0 0])
(defn wongame? [playedmoved]
  (
    (def counter 0)
    ;action here....  
    )
 )
(won moves) ;gives true/false

3 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

(defn end-of-game? [moves]
  (->> moves
       (partition 3)
       (remove #(= [0 0 0] %))
       (map (partial apply =))
       (some identity)))

您的示例输入[2 1 2 1 1 1 2 1 2] (partition 3)给出:

((2 1 2) (1 1 1) (2 1 2))

我们需要对每个列表使用=apply是必需的,因为=适用于单个参数而不是列表。 partial是必需的,因为apply =的参数处于待处理状态。可以等同地使用#(apply = %)

(false true false)

some就是'(至少)一个或没有'。如果传递的列表之一是真实的,那么将返回该列表。

如果你真的需要回答true / false的答案,那么调用boolean作为线程最后一个宏(->>)的最后一个函数。我已经离开了,因为你很少需要在Clojure中实际返回true或false - 你可以依赖 nil punning

同样的功能也适用于垂直方向。首先使用适用于矩阵的常规transpose函数(例如[[0 0 0][0 0 0][0 0 0]]):

(defn transpose [matrix]
  (apply mapv vector matrix))

然后在之前设置您的输入,并在之后输出:

(defn transpose-flat [xs]
  (->> xs
       (partition 3)
       transpose
       (mapcat identity)))

答案 1 :(得分:2)

(def moves [0 0 1 1 0 1 2 2 2]) #_"the game's state in the middle"

首先,如果我们遇到这样的模式,我们需要停止游戏, 否则我们可能会错误判断这个游戏的赢家 如果移动到达[2 2 1 1 1 1 2 2 2]状态。谁是赢家?我们需要在游戏的每个回合都调用此函数。

其次,名字“赢了?”是不合适的,因为这个功能不会告诉胜利者,而是告诉游戏结束。 “韩元?”功能应该重命名为[“游戏结束?” “游戏结束了吗?” “结束?”]。

第三,我尝试实现“胜利者”,以此回报游戏的赢家:

(defn winner [moves]
  (let [pattern-of-end {[1 1 1]:1 [2 2 2]:2}]
    (->> moves          #_"I use threading macro to explain"
         (partition 3)  #_"group by each three symbols. 
                           1 line of 9 elements -> 3 lines of 3 elements"
         (keep pattern-of-end) #_"If there is some lines that matches 
                                  the pattern-of-end ,that will return [1] or [2]"
         first          #_"Because the previous expression returns lazy-seq 
                        we can get the scalar by calling first"
)))

这告诉我们游戏的胜利者。

答案 2 :(得分:2)

如果你有适合x和o的数字会更容易:

(defn the-winner-is [moves]
    (let [x 5
          o 7]
        (->> moves
             (partition 3)
             (map (partial apply +))
             (some #{15 21}))))

这样它甚至可以说谁是赢家(15或21)。

(the-winner-is [5 5 7 7 7 0 7 7 7]) ; 21
(the-winner-is [5 5 5 7 7 5 5 7 7]) ; 15
(the-winner-is [5 7 5 7 7 5 5 7 5]) ; nil