
Task

Play a game of tic-tac-toe.

Ensure that legal moves are played and that a winning position is notified.


Tic-tac-toe   is also known as:

   naughts and crosses 
   tic tac toe 
   tick tack toe 
   three in a row 
   tres en rayo       and
   Xs  and  Os


See also
   MathWorld™, Tic-Tac-Toe game.
   Wikipedia tic-tac-toe.


' ---------------------------
'  TIC TAC TOE
' ---------------------------
winBox$ = "123 456 789 159 147 258 369 357"
boxPos$ = "123 231 456 564 789 897 159 591 357 753 132 465 798 174 285 396 159 471 582 693 147 258 369 195 375"
ai$     = "519628374"
ox$     = "OX" 
[newGame]
for i = 1 to 9
 box$(i) = ""
next i
goto [shoTic]
 
[loop]
for j = 1 to 2
 tic$ = mid$(ox$,j,1)
 for i = 1 to 25
  b$	= word$(boxPos$,i," ")
  b1	= val(mid$(b$,1,1))
  b2	= val(mid$(b$,2,1))
  b3	= val(mid$(b$,3,1))
  if box$(b1) = tic$ AND box$(b2) = tic$ AND box$(b3) = "" then
     box$(b3)  = "O"
     goto [shoTic]
 end if
 next i
next j
if box$(1) = "O" AND box$(5) = "X" and box$(9) = "X" then
 if box$(3) = "" then
   box$(3) = "O"
   goto [shoTic]
 end if
 if box$(7) = "" then
   box$(7) = "O"
   goto [shoTic]
 end if
end if
for i = 1 to 9
 b1 = val(mid$(ai$,i,1))
 if box$(b1) = "" then
   box$(b1)  = "O"
   exit for
 end if
next i
 
[shoTic]
cls
' ----------------------------------------
' show tic tac toe screen
' ----------------------------------------
html "<table border=1 width=300px height=225px><TR>"
for i = 1 to 9
  html "<td align=center width=33%><h1>"
    if box$(i) <> "" then 
     html box$(i)
    else
    button #box, " ";box$(i);" ", [doTic]
           #box  setkey(str$(i))
    end if
    if i mod 3 = 0 then html "</tr><tr>"
next i
html "</table>"
gosub [checkWin]
wait
 
[doTic]
box$(val(EventKey$)) = "X"
turn          = 1
gosub [checkWin]
goto [loop]
 
' --- check for a winner ----------
[checkWin]
for i = 1 to 8
 b$ = word$(winBox$,i," ")
 b1 = val(mid$(b$,1,1))
 b2 = val(mid$(b$,2,1))
 b3 = val(mid$(b$,3,1))
 if box$(b1) = "O" and box$(b2) = "O" and box$(b3) = "O" then
   print "You Lose!"
   goto [playAgain]
 end if
 if box$(b1) = "X" and box$(b2) = "X" and box$(b3) = "X" then
   print "You Win!"
   goto [playAgain]
 end if
next i
 
moveCount = 0
for i = 1 to 9
 if box$(i) <> "" then moveCount = moveCount + 1 
next i
if moveCount = 9 then
  print "Draw!"
  goto [playAgain]
end if
RETURN
 
[playAgain]
input "Play again (y/n)";p$
if upper$(p$) = "Y" then goto [newGame]
end