在我弄清楚了一些事情之后,这个问题和我的另一个问题合二为一,所以我修改了这个问题。
下面概述了我试图用我的功能完成的事情。
- 遍历所有的点。如果它是开放的,请选择带有当前玩家符号的位置。
- 如果这一举动导致游戏获胜并且轮到计算机玩家,则将点的键值对(整数)和点的分数(整数,在本例中为 1)添加到
scored-spots
哈希图中。 - 递归并调用这个相同的函数,传递给它新
scored-spots
的哈希映射、刚刚移除的棋盘、相同的玩家和相同的符号。 - 但是,如果游戏没有获胜,请继续下一个条件语句并检查它。
- 以相同的方式继续下一个条件语句,只是分数不同(轮到计算机获胜为 1,轮到人类获胜为 -1,平局为 0)。
- 如果没有条件语句评估为真,则无论如何都要递归(
scored-spots
在这种情况下哈希映射不会有任何不同)。
这是我尝试过的代码,但这并没有返回我期望的值。
注意:
board
是这样的散列图:({0 "0", 1 "1", 2 "2"}
点位置 - 点值)
sym
是一个符号,如“X”或“O”
current-player
是关键字,如:computer
或是:human
scored-spots
这样的散列图:{}
(defn score-spots [board sym current-player scored-spots]
(for [spot (keys board)]
(if (some #(= % (.toString spot)) (filter #(not= "O" %) (filter #(not= "X" %) (vals board))))
(let [board (assoc board spot sym)]
(cond
(and (game-won board) (= current-player :computer))
(score-spots board sym current-player (assoc scored-spots spot 1))
(and (game-won board) (= current-player :human))
(score-spots board sym current-player (assoc scored-spots spot -1))
(game-tied board)
(score-spots board (switch-symbol sym) (switch-player current-player) (assoc scored-spots spot 0))
:else
(score-spots board (switch-symbol sym) (switch-player current-player) scored-spots)))
scored-spots))))
我期望的返回值是一个散列图,每个开放点都得分。例如,{1 0, 4 1, 5 -1, 6 -1, 8 0}
。
相反,如果我通过这个 board:
{1 "X" 2 "X" 3 "O" 4 "4" 5 "5" 6 "6" 7 "7" 8 "X" 9 "O"}
,
我会得到一个带有大量list
哈希映射的返回值。