37 lines
1.7 KiB
Plaintext
37 lines
1.7 KiB
Plaintext
DynamicModule[{board = ConstantArray[0, {3, 3}], text = "Playing...",
|
|
first, rows =
|
|
Join[#, Transpose@#, {Diagonal@#, Diagonal@Reverse@#}] &},
|
|
Column@{Graphics[{Thickness[.02],
|
|
Table[With[{i = i, j = j},
|
|
Button[{White, Rectangle[{i, j} - 1, {i, j}], Black,
|
|
Dynamic[Switch[board[[i, j]], 0, Black, 1,
|
|
Circle[{i, j} - .5, .3], -1,
|
|
Line[{{{i, j} - .2, {i, j} - .8}, {{i - .2,
|
|
j - .8}, {i - .8, j - .2}}}]]]},
|
|
Which[text != "Playing...", board = ConstantArray[0, {3, 3}];
|
|
text = "Playing...", board[[i, j]] == 0,
|
|
If[board == ConstantArray[0, {3, 3}],
|
|
first = {i,
|
|
j} /. {{2, 2} -> 1, {1 | 3, 1 | 3} -> 2, _ -> 3}];
|
|
board[[i, j]] = 1;
|
|
FinishDynamic[];
|
|
Which[MemberQ[rows[board], {1, 1, 1}], text = "You win.",
|
|
FreeQ[board, 0], text = "Draw.", True,
|
|
board[[Sequence @@
|
|
SortBy[Select[Tuples[{Range@3, Range@3}],
|
|
board[[Sequence @@ #]] ==
|
|
0 &], -Total[
|
|
Sort /@
|
|
rows[ReplacePart[
|
|
board, # -> -1]] /. {{-1, -1, -1} ->
|
|
512, {-1, 1, 1} -> 64, {-1, -1, 0} ->
|
|
8, {0, 1, 1} -> -1, {_, _, _} -> 0}] -
|
|
Switch[#, {2, 2}, 1, {1 | 3, 1 | 3},
|
|
If[first == 2, -1, 0], _,
|
|
If[first == 2, 0, -1]] &][[1]]]] = -1;
|
|
Which[MemberQ[rows[board], {-1, -1, -1}],
|
|
text = "You lost.", FreeQ[board, 0],
|
|
text = "Draw."]]]]], {i, 1, 3}, {j, 1, 3}], Thickness[.01],
|
|
Line[{{{1, 0}, {1, 3}}, {{2, 0}, {2, 3}}, {{0, 1}, {3, 1}}, {{0,
|
|
2}, {3, 2}}}]}], Dynamic@text}]
|