Possible games¶
In this chapter we will look at how to see if a move has won the game.
As usual, we will prepare the ground by copying in the work we did in the previous chapter and setting ⎕io to zero.
)copy notebook3
⎕io ← 0
Win, lose, draw¶
How can we find if a position is a winning position?
We need to see if there’s a row, a column or a diagonal where there are three ×s or three ○s.
We will start by finding a way to pick out the contents of all the positions that could lead to a win.
If we create a 3 by 3 matrix on the numbers from zero to nine we could list the indices that correspond to a winning line.
3 3⍴⍳9
The candidates seem to be the rows: 0 1 2 3 4 5 6 7 8 the columns: 0 3 6 1 4 7 2 5 8 the diagonals: 0 4 8 2 4 6
Actually, we can get APL to check our work. APL has two relevant functions, reverse ⌽ and transpose ⍉.
i ← 3 3⍴⍳9
⊢wpi ← {rows ← ⍵ ⋄ cols ← ⍉⍵ ⋄ diagonals ← 2 3⍴↑(0 0⍉⍵) (0 0⍉⌽⍵) ⋄ ⊃⍪/rows cols diagonals} 3 3⍴⍳9
Now we can use wpi to write a function wf which will tell us if a position is a win or not.
We’ll use ild to create the possible locations for three-in-a-row ×s and ○s,
and then use 1 2∘.= to see where each location contains a × or a ○.
Finally, we and (∧) each element in a row of three,
or (∨) the results, and or them again to find out if there’s a win.
wf ← {∨⌿∨/^/1 2∘.=wpi ild ⍵} ⍝ is this a win?
wf 1 1 1 0 2 2 0 0 0
wf 2 0 1 2 0 1 2 1 0
wf 1 2 1 0 1 0 2 2 0
Let’s see how many of the unique canonical possible positions are wins.
+/wf ucp
Let’s check them. We’ll create a function wp which filters out wins from a matrix of positions, apply it to ucp,
and show the first few.
wp ← {⍵⌿⍨wf ⍵}
list 19↑wp ucp
)save notebook4 -force