Tic-tac-toe: Difference between revisions
m
→{{header|J}}: place sample output before exposition
(→J: Clearer code. My prior code was too terse.) Tags: Mobile edit Mobile web edit |
m (→{{header|J}}: place sample output before exposition) |
||
(One intermediate revision by the same user not shown) | |||
Line 6,687:
=={{header|J}}==
<syntaxhighlight lang="j">
'`turn board open full'=: {.`}.`(0=[{board@])`(0-.@e.board)▼
you_move=: $:@echo@'invalid'^:(-.@e.i.@9)@:<:@".@(1!:1@1)
▲ '`open full'=: (0=[{board@])`(0-.@e.board)
move=: position (][echo@'already taken!')`(-@turn@] , turn@]`[`(board@])})@.open ]
▲ '`cpu_move you_move'=: (?@#{])@([:I.0=board)`(<:@".@(1!:1@1))
show=: [ [: echo@''@echo (,' '&,)/"1@('.XO'{~3 3$board) [ echo@''
outcome=: (' wins'echo@,~'.XO'{~-@turn)`(echo@'tie')@.(1:i.~won,full)
ttt=: outcome@([F.(show@move
</syntaxhighlight>
The board is represented by a vector of -1's, 0’s and 1’s, which index into the character vector when it’s time to display the board. ▼
Output:
Encoding data with numbers this way allows the convenience of e.g. being able to simply check whether the absolute value of the sum across a given line is 3, indicating a win. ▼
<pre> ▼
▲<pre>
]M=: 0 1 _1{~?3 3$3▼
0 _1 _1▼
_1 1 1▼
_1 1 0▼
M{'.XO'▼
.OO▼
OXX▼
OX.▼
</pre>▼
▲<pre> ttt 0
enter a move (1–9) each turn; you're X's
1 2 3
Line 6,760 ⟶ 6,745:
9
already taken!
X O .
Line 6,772 ⟶ 6,757:
X O O
X wins
▲</pre>
▲This version is stateless, purely functional, and tacit. CPU selects a random open position. The <code>turn</code> and <code>board</code> verbs extract the turn/board from the state vector. The board is represented by a vector of -1's, 0’s and 1’s, which index into the character vector '.XO' when it’s time to display the board.
▲Encoding data with numbers this way allows the convenience of e.g. being able to simply check whether the absolute value of the sum across a given line is 3, indicating a win.
<pre>
▲ ]M=: 0 1 _1{~?3 3$3
▲ 0 _1 _1
▲_1 1 1
▲_1 1 0
▲ M{'.XO'
▲.OO
▲OXX
▲OX.
</pre>
The verb <code>open</code> tests whether the selected position is available on the board. Fold (<code>F.</code>) is used because <code>Until=:<tt>{{</tt>u^:(-.@:v)^:_<tt>}}</tt></code> would've quit upon receiving invalid input, as the argument would be unchanged between that iteration and the next.
=={{header|Java}}==
|