この質問と私の別の質問は、いくつかのことを理解した後、1 つに統合されたので、この質問を修正しました。
私が自分の機能で達成しようとしていることは、以下に概説されています。
- すべてのスポットを繰り返します。開いている場合は、現在のプレーヤーのシンボルがあるスポットを選択します。
- この動きによってゲームに勝利し、コンピューター プレイヤーの番になった場合、スポット (整数) とスポットのスコア (整数、この場合は 1) のキーと値のペアを
scored-spots
ハッシュ マップに追加します。 - この同じ関数を再帰して呼び出し、新しい
scored-spots
ハッシュマップ、移動したばかりのボード、同じプレーヤー、および同じシンボルを渡します。 - ただし、ゲームに勝てなかった場合は、次の条件ステートメントに進み、それを確認します。
- 次の条件文も同じように、スコアが異なるだけです (コンピューターのターンでの勝利は 1、人間のターンでの勝利は -1、引き分けは 0)。
- どの条件ステートメントも true と評価されない場合は、とにかく再帰します (
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
のハッシュ マップを含む戻り値が得られます。