我正在创建一个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
答案 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