How to resolve the algorithm Tic-tac-toe step by step in the BASIC programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Tic-tac-toe step by step in the BASIC programming language

Table of Contents

Problem Statement

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:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Tic-tac-toe step by step in the BASIC programming language

Source code in the basic programming language

# basado en código de Antonio Rodrigo dos Santos Silva (gracias):
# http://statusgear.freeforums.net/thread/17/basic-256-tic-tac-toe

global playerturn$
global endGame$
global space$
global player1Score$
global player2Score$
global invalidMove$
global tecla$
global keyQ$
global keyW$
global keyE$
global keyA$
global keyS$
global keyD$
global keyZ$
global keyX$
global keyC$
global keySpace$
global keyEsc$

keyQ$ = 81
keyW$ = 87
keyE$ = 69
keyA$ = 65
keyS$ = 83
keyD$ = 68
keyZ$ = 90
keyX$ = 88
keyC$ = 67
keySpace$ = 32
keyEsc$ = 16777216

dim space$(9)


subroutine clearGameVars()
  playerturn$ = 1
  invalidMove$ = 0
  endGame$ = 0
  tecla$ = 0

  for t = 0 to space$[?]-1
    space$[t] = 0
  next t
end subroutine

subroutine endGame()
  cls
  print "¡Hasta pronto!..."
  end
end subroutine

subroutine printBoard()
  print "          " + space$[0]+" | "+space$[1]+" | "+space$[2]
  print "          " + "— ++ —"
  print "          " + space$[3]+" | "+space$[4]+" | "+space$[5]
  print "          " + "— ++ —"
  print "          " + space$[6]+" | "+space$[7]+" | "+space$[8]
  print ""
end subroutine

subroutine changePlayer()
  if playerturn$ = 1 then
    playerturn$ = 2
  else
    playerturn$ = 1
  end if
end subroutine

subroutine endMatchWithWinner()
  cls
  call printPlayerScore()
  call printBoard()
  endGame$ = 1

  if playerturn$ = 1 then
    player1Score$ += 1
  else
    player2Score$ += 1
  end if

  print "¡Jugador " + playerturn$ + " gana!" + chr(10)
  print "Pulsa [SPACE] para jugar otra partida"
  print "Pulsa [ESC] para dejar de jugar"
  do
    tecla$ = key
    pause .01
    if tecla$ = keySpace$ then call gamePlay()
    if tecla$ = keyEsc$ then call endGame()
  until false
end subroutine

subroutine endMatchWithoutWinner()
  cls
  call printPlayerScore()
  call printBoard()
  endGame$ = 1

  print "                 Nadie ganó :(                  " + chr(10)
  print " Pulsa [SPACE] para comenzar o [ESC] para salir. "
  do
    tecla$ = key
    pause .01
    if tecla$ = keySpace$ then call gamePlay()
    if tecla$ = keyEsc$ then call endGame()
  until false
end subroutine

subroutine printPlayerScore()
  print "--------------------------------------------"
  print " Jugador #1: " + player1Score$ + " pts"
  print " Jugador #2: " + player2Score$ + " pts"
  print "--------------------------------------------" + chr(10)
end subroutine


subroutine printPlayerMessage()
  print "Jugador: " + playerturn$ + ", elige una casilla, por favor."
end subroutine

subroutine gamePlay()
  call clearGameVars()
  cls
  call printPlayerScore()
  call printBoard()
  call printPlayerMessage()
  while 0 = 0
    invalidMove$ = 0

    if endGame$ = 0 then
      do
        tecla$ = key
        pause .01
        validKeypressed$ = 0
        if tecla$ = keyQ$ or tecla$ = keyW$  or tecla$ = keyE$ or tecla$ = keyA$ or tecla$ = keyS$ or tecla$ = keyD$ or tecla$ = keyZ$ or tecla$ = keyX$ or tecla$ = keyC$ then validKeypressed$ = 1
      until validKeypressed$ = 1
    endif

    if tecla$ = keyQ$ then
      if space$[0] = 0 then
        space$[0] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyW$ then
      if space$[1] = 0 then
        space$[1] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyE$ then
      if space$[2] = 0 then
        space$[2] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyA$ then
      if space$[3] = 0 then
        space$[3] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyS$ then
      if space$[4] = 0 then
        space$[4] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyD$ then
      if space$[5] = 0 then
        space$[5] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyZ$ then
      if space$[6] = 0 then
        space$[6] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyX$ then
      if space$[7] = 0 then
        space$[7] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if tecla$ = keyC$ then
      if space$[8] = 0 then
        space$[8] = playerturn$
      else
        invalidMove$ = 1
      endif
    endif

    if invalidMove$ = 0 then
      tecla$ = 0

      if space$[0] = 1 and space$[1] = 1 and space$[2] = 1 then call endMatchWithWinner()
      if space$[3] = 1 and space$[4] = 1 and space$[5] = 1 then call endMatchWithWinner()
      if space$[6] = 1 and space$[7] = 1 and space$[8] = 1 then call endMatchWithWinner()
      if space$[0] = 1 and space$[3] = 1 and space$[6] = 1 then call endMatchWithWinner()
      if space$[1] = 1 and space$[4] = 1 and space$[7] = 1 then call endMatchWithWinner()
      if space$[2] = 1 and space$[5] = 1 and space$[8] = 1 then call endMatchWithWinner()
      if space$[0] = 1 and space$[4] = 1 and space$[8] = 1 then call endMatchWithWinner()
      if space$[2] = 1 and space$[4] = 1 and space$[6] = 1 then call endMatchWithWinner()
      if space$[0] = 2 and space$[1] = 2 and space$[2] = 2 then call endMatchWithWinner()
      if space$[3] = 2 and space$[4] = 2 and space$[5] = 2 then call endMatchWithWinner()
      if space$[6] = 2 and space$[7] = 2 and space$[8] = 2 then call endMatchWithWinner()
      if space$[0] = 2 and space$[3] = 2 and space$[6] = 2 then call endMatchWithWinner()
      if space$[1] = 2 and space$[4] = 2 and space$[7] = 2 then call endMatchWithWinner()
      if space$[2] = 2 and space$[5] = 2 and space$[8] = 2 then call endMatchWithWinner()
      if space$[0] = 2 and space$[4] = 2 and space$[8] = 2 then call endMatchWithWinner()
      if space$[2] = 2 and space$[4] = 2 and space$[6] = 2 then call endMatchWithWinner()

      if space$[0] <> 0 and space$[1] <> 0 and space$[2] <> 0 and space$[3] <> 0 and space$[4] <> 0 and space$[5] <> 0 and space$[6] <> 0 and space$[7] <> 0 and space$[8] <> 0 then call endMatchWithoutWinner()

      call changePlayer()
      cls
      call printPlayerScore()
      call printBoard()
      call printPlayerMessage()
    end if

  end while
end subroutine

subroutine gameMenu()
  cls
  call clearGameVars()

  player1Score$ = 0
  player2Score$ = 0

  print "================================================="
  print "|                  TIC-TAC-TOE                  |"
  print "=================================================" + chr(10)
  print "  Teclas para jugar:"
  print "---------------------"
  print "    | q | w | e |"
  print "    | a | s | d |"
  print "    | z | x | c |" + chr(10)
  print " Pulsa [SPACE] para comenzar o [ESC] para salir. "
  
  do
    tecla$ = key
    pause .01
    if tecla$ = keySpace$ then call gamePlay()
    if tecla$ = keyEsc$ then call endGame()
  until false
end subroutine

call gameMenu()
end

'About 400 lines of code, but it is a graphical (GUI ish) i.e. mouse driven.
'I have made provision for the player to beat the computer now and then.

Type box
    As long x,y           
    As long wide,high,index
    Dim As ulong colour
    As String caption
    Declare Sub show       
    Declare Sub NewCaption(s As String)
    Declare Constructor
    Declare Constructor(x As long,y As long,wide As long,_
    high As long,index As long,colour As ulong,caption As String)
End Type
Constructor box
End Constructor
Constructor box(x As long,y As long,wide As long,_
high As long,index As long,colour As ulong,caption As String)
this.x=x
this.y=y
this.wide=wide
this.high=high
this.index=index
this.colour=colour
this.caption=caption
End Constructor
'ALL PROCEDURES:
Declare Function inside(B As box,px As long,py As long) As long
Declare Sub make_frame_image(im As ulong Pointer)
Declare Sub setup_grid(boxes() As box,cellsacross As long,cellsdown As long,xp As long,yp As long,w As long,h As long)
Declare Function all_clicked(b() As box) As long
Declare Sub OnCLICK(a() As box,b As box)
Declare Sub refresh_screen(b() As box,f1 As long=0,f2 As long=0)
Declare Function Get_Mouse_Events(boxes() As box) As long
Declare Sub thickline(x1 As long,y1 As long,x2 As long,y2 As long,thickness As Single,colour As ulong,im As Any Pointer=0)
Declare Sub lineto(x1 As long,y1 As long,x2 As long,y2 As long,l As long,th As Single,col As ulong,im As Any Pointer=0)
Declare Sub thickcircle(x As long,y As long,rad As long,th As Single,col As ulong,im As Any Pointer=0)
Declare Sub startup(b() As box)
Declare Sub get_computer_events(b() As box)

Declare Sub finish
'Macro used by more than one procedure
#macro incircle(cx,cy,radius,x,y)
(cx-x)*(cx-x) +(cy-y)*(cy-y)<= radius*radius
#endmacro
'===============  RUN  ============================
Screen 19,32',1,16
Color ,Rgb(233,236,216)              'background colour
windowtitle string(100," ")+"Noughts and crosses"
'Globals:
Dim Shared As ulong Pointer frame
Dim Shared As long computer,player
Dim Shared As String msg1,msg2,message
message="In Play"
msg1="Computer Start"
msg2="Player Start"
'Custom Frame
frame=Imagecreate(800,600)

Dim  As box boxes(0 To 9)

setup_grid(boxes(),3,3,175,85,150,150)
make_frame_image(frame)

Do
    If player=0 And computer=0 Then
        startup(boxes())
    End If
   
    If player  Then
        Get_Mouse_Events(boxes())
    End If
   
    If computer Then
        get_computer_events(boxes())
    End If
   
    If all_clicked(boxes()) Then get_computer_events(boxes())
Loop Until Inkey=Chr(27)
finish

Sub box.show
    Line(this.x,this.y)-(this.x+this.wide,this.y+this.high),this.colour,bf
    Line(this.x,this.y)-(this.x+this.wide,this.y+this.high),Rgb(200,200,200),b
    ''Draw String(this.x+.5*this.wide-4*Len(this.caption),this.y+(.5*this.high-4)),this.caption,Rgb(0,0,0)
    If this.index=0 Then
        Draw String(this.x+.5*this.wide-4*Len(this.caption),this.y+.5*this.high-6),this.caption,Rgb(0,0,0)
    End If
End Sub

Sub box.NewCaption(s As String)
    Var cx=(this.x+this.x+this.wide)/2
    Var cy=(this.y+this.y+this.high)/2
    If s="X" Then
        For k As long=20 To 0 Step -1
            lineto(cx,cy,this.x,this.y,50,k,Rgb(50+10*k,5*k,0),frame)
            lineto(cx,cy,this.x+this.wide,this.y+this.high,50,k,Rgb(50+10*k,5*k,0),frame)
            lineto(cx,cy,this.x,this.y+this.high,50,k,Rgb(50+10*k,5*k,0),frame)
            lineto(cx,cy,this.x+this.wide,this.y,50,k,Rgb(50+10*k,5*k,0),frame)
        Next k
    Else
        For k As long=20 To 0 Step -1
            thickcircle(cx,cy,40,k,Rgb(50+10*k,5*k,0),frame)
        Next k
    End If
End Sub

Sub get_computer_events(b() As box)
    #define other(n)  b(n).caption<>"0" And b(n).caption<>"C"
    #define another(n) b(n).caption="0"
    #define rr(f,l) (Rnd*((l)-(f))+(f))
    Dim As long flag,i,k,Cwin,Pwin,NoWin
    Static As long firstclick
    var chance="001100"
    dim as long ch
    'horiz player finish
    For x As long=1 To 3
        If b(1+k).caption="0" And b(2+k).caption="0" And another((3+k)) Then b(3+k).Caption="0":Pwin=1:Goto fin
        If b(2+k).caption="0" And b(3+k).caption="0" And another((1+k))Then b(1+k).Caption="0":Pwin=1=1:Goto fin
        If b(1+k).caption="0" And b(3+k).caption="0" And another((2+k))Then b(2+k).Caption="0":Pwin=1:Goto fin
        k=k+3
    Next x
    k=0
    'vert player finish
    For x As long=1 To 3
        If b(1+k).caption="0" And b(4+k).caption="0" And another((7+k)) Then b(7+k).Caption="0":Pwin=1:Goto fin
        If b(4+k).caption="0" And b(7+k).caption="0" And another((1+k))Then b(1+k).Caption="0":Pwin=1:Goto fin
        If b(1+k).caption="0" And b(7+k).caption="0" And another((4+k))Then b(4+k).Caption="0":Pwin=1:Goto fin
        k=k+1
    Next x
    k=0
    'player finish main diag
    If b(1+k).caption="0" And b(5+k).caption="0" And another((9+k)) Then b(9+k).Caption="0":Pwin=1:Goto fin
    If b(1+k).caption="0" And b(9+k).caption="0" And another((5+k))Then b(5+k).Caption="0":Pwin=1:Goto fin
    If b(5+k).caption="0" And b(9+k).caption="0" And another((1+k))Then b(1+k).Caption="0":Pwin=1:Goto fin
    'player finish other diag
    If b(7+k).caption="0" And b(5+k).caption="0" And another((3+k)) Then b(3+k).Caption="0":Pwin=1:Goto fin
    If b(5+k).caption="0" And b(3+k).caption="0" And another((7+k))Then b(7+k).Caption="0":Pwin=1:Goto fin
    If b(7+k).caption="0" And b(3+k).caption="0" And another((5+k))Then b(5+k).Caption="0":Pwin=1:Goto fin
   
    'horiz computer finish
    For x As long=1 To 3
        If b(1+k).caption="C" And b(2+k).caption="C" And other((3+k)) Then b(3+k).Caption="C":Cwin=1:Goto fin
        If b(2+k).caption="C" And b(3+k).caption="C" And other((1+k))Then b(1+k).Caption="C":Cwin=1:Goto fin
        If b(1+k).caption="C" And b(3+k).caption="C" And other((2+k))Then b(2+k).Caption="C":Cwin=1:Goto fin
        k=k+3
    Next x
    k=0
    'vert computer finish
    For x As long=1 To 3
        If b(1+k).caption="C" And b(4+k).caption="C" And other((7+k)) Then b(7+k).Caption="C":Cwin=1:Goto fin
        If b(4+k).caption="C" And b(7+k).caption="C" And other((1+k))Then b(1+k).Caption="C":Cwin=1:Goto fin
        If b(1+k).caption="C" And b(7+k).caption="C" And other((4+k))Then b(4+k).Caption="C":Cwin=1:Goto fin
        k=k+1
    Next x
    k=0
    'computer finish main diag
    If b(1+k).caption="C" And b(5+k).caption="C" And other((9+k)) Then b(9+k).Caption="C":Cwin=1:Goto fin
    If b(1+k).caption="C" And b(9+k).caption="C" And other((5+k))Then b(5+k).Caption="C":Cwin=1:Goto fin
    If b(5+k).caption="C" And b(9+k).caption="C" And other((1+k))Then b(1+k).Caption="C":Cwin=1:Goto fin
    'computer finish other diag
    If b(7+k).caption="C" And b(5+k).caption="C" And other((3+k)) Then b(3+k).Caption="C":Cwin=1:Goto fin
    If b(5+k).caption="C" And b(3+k).caption="C" And other((7+k))Then b(7+k).Caption="C":Cwin=1:Goto fin
    If b(7+k).caption="C" And b(3+k).caption="C" And other((5+k))Then b(5+k).Caption="C":Cwin=1:Goto fin
   
    'block horizontals
    For x As long=1 To 3
        If b(1+k).caption="0" And b(2+k).caption="0" And other((3+k)) Then b(3+k).Caption="C":flag=1:Goto fin
        If b(2+k).caption="0" And b(3+k).caption="0" And other((1+k))Then b(1+k).Caption="C":flag=1:Goto fin
        If b(1+k).caption="0" And b(3+k).caption="0" And other((2+k))Then b(2+k).Caption="C":flag=1:Goto fin
        k=k+3
    Next x
    k=0
    'block verticals
    For x As long=1 To 3
        If b(1+k).caption="0" And b(4+k).caption="0" And other((7+k)) Then b(7+k).Caption="C":flag=1:Goto fin
        If b(4+k).caption="0" And b(7+k).caption="0" And other((1+k))Then b(1+k).Caption="C":flag=1:Goto fin
        If b(1+k).caption="0" And b(7+k).caption="0" And other((4+k))Then b(4+k).Caption="C":flag=1:Goto fin
        k=k+1
    Next x
    k=0
    'block main diag
    If b(1+k).caption="0" And b(5+k).caption="0" And other((9+k)) Then b(9+k).Caption="C":flag=1:Goto fin
    If b(1+k).caption="0" And b(9+k).caption="0" And other((5+k))Then b(5+k).Caption="C":flag=1:Goto fin
    If b(5+k).caption="0" And b(9+k).caption="0" And other((1+k))Then b(1+k).Caption="C":flag=1:Goto fin
    'block other diag
    If b(7+k).caption="0" And b(5+k).caption="0" And other((3+k)) Then b(3+k).Caption="C":flag=1:Goto fin
    If b(5+k).caption="0" And b(3+k).caption="0" And other((7+k))Then b(7+k).Caption="C":flag=1:Goto fin
    If b(7+k).caption="0" And b(3+k).caption="0" And other((5+k))Then b(5+k).Caption="C":flag=1:Goto fin
   
    If firstclick=0 Then
        firstclick=1
       var st="1379"
       dim as long i=rr(0,3)
    If Valint(b(5).caption)=0  and b(5).caption <> "C" Then b(st[i]-48).caption="C":Goto fin
       
    End If
   
     ch=rr(0,5)
    if chance[ch]-48=1 then
    If Valint(b(5).caption)<>0 Then b(5).caption="C":Goto fin
    end if
    If all_clicked(b()) Then Nowin=1:Goto fin
    If flag=0 Then
        Randomize
        Do
            i=rr(1,9)
            If Valint(b(i).caption) <> 0  Then b(i).caption="C":Exit Do
        Loop 
    End If
    fin:
    If Cwin=1 Or Pwin=1 Or NoWin=1 Then
        Dim As long mx,my,mb
        dim as integer x,y
        screencontrol 0,x,y
        for z as single=0 to 8*atn(1) step .001
            dim as integer xx=x+100*cos(z)
            dim as integer yy=y+100*sin(z)
            screencontrol 100,xx,yy
        next z
        screencontrol 100,x,y
        If Cwin=1 Then Message="You Loose"
        If Pwin=1 Then Message="You WIN"
        If Nowin=1 Then Message="DRAW"
        
        cwin=0:k=0:pWin=0:Nowin=0:firstclick=0'i
        Do
            Getmouse mx,my,,mb
            If inside(b(0),mx,my) And mb=1 Then finish
          
            Var ic=incircle(500,55,20,mx,my)
            If incircle(500,55,20,mx,my) And mb=1 Then Exit Do
            refresh_screen(b(),ic)
        Loop Until Inkey=chr(27)
        For z As long=1 To Ubound(b)
            b(z).caption=Str(b(z).index)
        Next z
        Imagedestroy frame
        frame=Imagecreate(800,600)
        make_frame_image(frame)
        computer=0:player=0
        Exit Sub
    End If
    player=1:computer=0
End Sub

Sub startup(b() As box)
    message="In Play"
    Dim As long mx,my,mb
    Getmouse mx,my,,mb
   
    For n As long=0 To Ubound(b)
        If inside(b(n),mx,my) And mb=1 Then
            If b(n).index=0 Then
                finish
            End If
        End If
        b(0).colour=Rgb(200,0,0)
    Next n
    Dim As long f1,f2
    If incircle(80,230,10,mx,my) Then
        f1=1:f2=0
        If mb=1 Then computer=1:player=0
    End If
    If incircle(670,230,10,mx,my) Then
        f1=0:f2=1
        If mb=1 Then player=1:computer=0
    End If
    refresh_screen(b(),f1,f2)
End Sub

Sub thickcircle(x As long,y As long,rad As long,th As Single,col As ulong,im As Any Pointer=0)
    Circle(x,y),rad+th/2,col
    Circle(x,y),rad-th/2,col
    Paint(x,y+rad),col,col
End Sub

Sub thickline(x1 As long,_
    y1 As long,_
    x2 As long,_
    y2 As long,_
    thickness As Single,_
    colour As ulong,_
    im As Any Pointer=0)
    Dim p As ulong=Rgb(255, 255, 255)
    If thickness<2 Then
        Line(x1,y1)-(x2,y2),colour
    Else               
        Dim As Double s,h,c
        h=Sqr((x2-x1)^2+(y2-y1)^2) 
        If h=0 Then h=1e-6
        s=(y1-y2)/h               
        c=(x2-x1)/h                 
        For x As long=1 To 2
            Line im,(x1+s*thickness/2,y1+c*thickness/2)-(x2+s*thickness/2,y2+c*thickness/2),p
            Line im,(x1-s*thickness/2,y1-c*thickness/2)-(x2-s*thickness/2,y2-c*thickness/2),p
            Line im,(x1+s*thickness/2,y1+c*thickness/2)-(x1-s*thickness/2,y1-c*thickness/2),p
            Line im,(x2+s*thickness/2,y2+c*thickness/2)-(x2-s*thickness/2,y2-c*thickness/2),p
            Paint im,((x1+x2)/2, (y1+y2)/2), p, p
            p=colour
        Next x
    End If
End Sub

Sub lineto(x1 As long,y1 As long,x2 As long,y2 As long,l As long,th As Single,col As ulong,im As Any Pointer=0)
    Dim As long diffx=x2-x1,diffy=y2-y1,ln=Sqr(diffx*diffx+diffy*diffy)
    Dim As Single nx=diffx/ln,ny=diffy/ln
    thickline(x1,y1,(x1+l*nx),(y1+l*ny),th,col,im)
End Sub

Function inside(B As box,px As long,py As long) As long
    Return (px>B.x)*(px<(B.x+B.wide))*(py>B.y)*(py<(B.y+B.high))
End Function
Sub make_frame_image(im As ulong Pointer)
    #macro map(a,b,x,d,c)
    ((d)-(c))*((x)-(a))/((b)-(a))+(c)
    #endmacro
    #macro logo(sx,sy,rad)
For k As Single=-rad/10 To rad/10 Step .5:Circle im,(sx,sy),rad+k,Rgb(15,118,155):Next
For k As Single=-rad/10 To rad/10 Step .5:Circle im,(sx+1.3*rad,sy+rad),rad+k,Rgb(230,193,78),2.,1.7:Next
For k As Single=-rad/10 To rad/10 Step .5:Circle im,(sx+2*1.3*rad,sy),rad+k,Rgb(21,3,0),3.25,3.05:Next
For k As Single=-rad/10 To rad/10 Step .5:Circle im,(sx+3*1.3*rad,sy+rad),rad+k,Rgb(26,143,76),2,1.8:Next
For k As Single=-rad/10 To rad/10 Step .5:Circle im,(sx+4*1.3*rad,sy),rad+k,Rgb(200,63,87),3.25,3.05:Next
#endmacro
    For k As long=0 To 50
        Var r=map(0,50,k,233,193-20)
        Var g=map(0,50,k,236,153-20)
        Var b=map(0,50,k,216,19-19)
        Line im,(0+k,20+k)-(800-k,600-k),Rgb(r,g,b),b
    Next k
    For k As long=0 To 20
        Var r=map(0,20,k,250,0)
        Var g=map(0,20,k,250,0)
        Var b=map(0,20,k,250,255)
        Line im,(0,k)-(780,k),Rgb(r,g,b)',bf
    Next k
    logo(60,8,5)
    logo(380,8,5)
    logo(720,8,5)
End Sub
Sub setup_grid(boxes() As box,cellsacross As long,cellsdown As long,xp As long,yp As long,w As long,h As long)
    Dim As long index
    For y As long=yp To yp+h*(cellsdown-1) Step h
        For x As long=xp To xp+w*(cellsacross-1)   Step w
            index=index+1
            boxes(index)=Type<box>(x,y,w,h,index,Rgb(133,136,116),Str(index))
        Next x
    Next y
    boxes(0)=Type<box>(780,-2,20,24,0,Rgb(200,0,0),"X")
End Sub

Function all_clicked(b() As box) As long
    Dim As long sum
    For z As long=1 To Ubound(b)
        sum=sum+Valint(b(z).caption)
    Next z
    If sum<=0 Then Return -1
End Function

Sub OnCLICK(a() As box,b As box)
    If b.caption="0" Then Exit Sub
    If b.caption="C" Then Exit Sub
    If b.caption <> "C" Then b.caption="0"
    If b.index=0 Then finish
    player=0:computer=1
End Sub

Sub refresh_screen(b() As box,f1 As long=0,f2 As long=0)
    Screenlock:Cls
    For n As long=0 To Ubound(b)
        b(n).show 'draw boxes
        If b(n).caption="0" Then b(n).NewCaption("X")
        If b(n).caption="C" Then b(n).NewCaption("O")
    Next n
    Put(0,0),frame,trans
    Draw String (390,50),message,Rgb(0,0,0)
    If message <>"In Play" Then
        Circle(500,55),20,Rgb(255,20,255),,,,f
        If f1=-1 Then Circle(500,55),20,Rgb(202,200,200),,,,f
        Draw String(480,50),"Click",Rgb(0,0,0)
    End If
    If computer=0 And player=0 Then
        Draw String (60,200),msg1,Rgb(0,0,0)
        Circle(80,230),10,Rgb(0,0,0)
        Circle(80,230),5,Rgb(100,100,100),,,,f
        If f1=1 Then Circle(80,230),10,Rgb(200,0,0),,,,f
        Draw String (650,200),msg2,Rgb(0,0,0)
        Circle(670,230),10,Rgb(0,0,0)
        Circle(670,230),5,Rgb(100,100,100),,,,f
        If f2=1 Then Circle(670,230),10,Rgb(200,0,0),,,,f
    End If
    Screenunlock:Sleep 1,1
End Sub

Function Get_Mouse_Events(boxes() As box) As long
    Static released As long
    Static pressed As long
    Dim As long mousex,mousey,mousebutton ,x,y
    Getmouse mousex,mousey,,mousebutton
    Dim As box bar=Type<box>(0,0,780,50,0,0,"")
   
    refresh_screen(boxes())
    For n As long=0 To Ubound(boxes)
        If inside(boxes(n),mousex,mousey)  Then
            If released Then
                boxes(n).colour=Rgb(120,123,103) 
                If n=0 Then boxes(0).colour=Rgb(255,0,0)
            End If
            If mousebutton=1 Then
                If released Then OnCLICK(boxes(),boxes(n))
                Exit For
            End If
        Else
            boxes(n).colour=Rgb(133,136,116)
            If n=0 Then boxes(0).colour=Rgb(200,0,0)
        End If
    Next n
    If mousebutton=0 Then released=1 Else released=0 'clean clicks
    Return 0
End Function
Sub finish
    Screenunlock
    Imagedestroy frame
    End
End Sub

Screenres 320,240,32

'global variables globales
Dim Shared As Integer b(3,3) 'tablero
Dim Shared As Integer mx, my, btns, ox, oy

'prueba para ganar posición
'3 victorias horizontales
Function TestWin(t As Integer) As Integer
    Dim As Integer win = 0
    
    If b(0,0)= t And b(1,0)= t And b(2,0)= t Then win = t
    If b(0,1)= t And b(1,1)= t And b(2,1)= t Then win = t   
    If b(0,2)= t And b(1,2)= t And b(2,2)= t Then win = t
    
    '3 en vertical gana
    If b(0,0)= t And b(0,1)= t And b(0,2)= t Then win = t
    If b(1,0)= t And b(1,1)= t And b(1,2)= t Then win = t
    If b(2,0)= t And b(2,1)= t And b(2,2)= t Then win = t
    
    'cruzada gana
    If b(0,0)= t And b(1,1)= t And b(2,2)= t Then win = t
    If b(2,0)= t And b(1,1)= t And b(0,2)= t Then win = t
    
    Return win
End Function

Sub InicializarTablero()
    For j As Integer = 0 To 2
        For i As Integer = 0 To 2
            b(i,j)=0
        Next i
    Next j
End Sub

Sub DibujaTablero()
    Locate 1,1 : Print "+---+---+---+"
    For j As Integer = 0 To 2
        Print "|";
        For i As Integer = 0 To 2
            If b(i,j) = 0 Then Print "   |";
            If b(i,j) = 1 Then Print " x |";
            If b(i,j) = 2 Then Print " o |";
        Next i
        Print !"\n+---+---+---+"
    Next j
End Sub

Function MovimientoHumano() As Integer
    DibujaTablero()
    
    Print !"\n HAZ CLICK CON EL MOUSE"
    Print "EN LA CASILLA QUE ELIJAS"
    Dim As Integer opcion = -1
    
    While opcion = -1
        Getmouse mx,my,,btns
        While btns <> 1 'esperar a pulsar botón
            Getmouse mx,my,,btns
        Wend
        
        mx = (mx-4)\32
        my = (my-4)\16
        If mx >= 0 And mx < 3 And my >= 0 And my < 3 Then
            If b(mx,my) = 0 Then opcion = mx+my*3 'Casilla vacía?
        End If
        While btns=1
            Getmouse mx,my,,btns
        Wend
    Wend
    
    Return opcion
End Function

Function MovimientoAleatorio() As Integer   
    Dim As Integer opcion, i, j
    opcion = Int(Rnd(1)*9)
    j = Int(opcion/3)
    i = opcion - Int(opcion/3)*3
    
    While b(i,j) <> 0 Or (opcion > 8 Or opcion < 0)
        opcion = Int(Rnd(1)*9)
        j = Int(opcion/3)
        i = opcion - Int(opcion/3)*3       
    Wend
    
    Return j*3+i
End Function

Function MovimientoInteligente(t As Integer) As Integer
    Dim As Integer i, j, opcion, t2
    opcion = -1 'opcion aún no seleccionada
    
    'obtener la ficha t2 de los oponentes
    If t = 1 Then t2 = 2 Else t2 = 1   
    
    'prueba para la casilla central
    If b(1,1) = 0 Then opcion = 4   
    
    'prueba para ganar 
    If opcion = -1 Then
        If b(0,0)= 0 And b(1,0)= t And b(2,0)= t Then opcion = 0
        If b(0,0)= t And b(1,0)= 0 And b(2,0)= t Then opcion = 1
        If b(0,0)= t And b(1,0)= t And b(2,0)= 0 Then opcion = 2
        If b(0,1)= 0 And b(1,1)= t And b(2,1)= t Then opcion = 3
        If b(0,1)= t And b(1,1)= 0 And b(2,1)= t Then opcion = 4       
        If b(0,1)= t And b(1,1)= t And b(2,1)= 0 Then opcion = 5
        If b(0,2)= 0 And b(1,2)= t And b(2,2)= t Then opcion = 6
        If b(0,2)= t And b(1,2)= 0 And b(2,2)= t Then opcion = 7
        If b(0,2)= t And b(1,2)= t And b(2,2)= 0 Then opcion = 8      
        
        '3 bloques verticales
        If b(0,0)= 0 And b(0,1)= t And b(0,2)= t Then opcion = 0
        If b(0,0)= t And b(0,1)= 0 And b(0,2)= t Then opcion = 3
        If b(0,0)= t And b(0,1)= t And b(0,2)= 0 Then opcion = 6
        If b(1,0)= 0 And b(1,1)= t And b(1,2)= t Then opcion = 1
        If b(1,0)= t And b(1,1)= 0 And b(1,2)= t Then opcion = 4
        If b(1,0)= t And b(1,1)= t And b(1,2)= 0 Then opcion = 7
        If b(2,0)= 0 And b(2,1)= t And b(2,2)= t Then opcion = 2
        If b(2,0)= t And b(2,1)= 0 And b(2,2)= t Then opcion = 5
        If b(2,0)= t And b(2,1)= t And b(2,2)= 0 Then opcion = 8
        
        'bloques cruzados 
        If b(0,0)= 0 And b(1,1)= t And b(2,2)= t Then opcion = 0
        If b(0,0)= t And b(1,1)= 0 And b(2,2)= t Then opcion = 4
        If b(0,0)= t And b(1,1)= t And b(2,2)= 0 Then opcion = 8
        If b(2,0)= 0 And b(1,1)= t And b(0,2)= t Then opcion = 2
        If b(2,0)= t And b(1,1)= 0 And b(0,2)= t Then opcion = 4
        If b(2,0)= t And b(1,1)= t And b(0,2)= 0 Then opcion = 6
    End If
    
    'prueba para bloques
    If opcion = -1 Then
        If b(0,0)= 0 And b(1,0)= t2 And b(2,0)= t2 Then opcion = 0
        If b(0,0)= t2 And b(1,0)= 0 And b(2,0)= t2 Then opcion = 1
        If b(0,0)= t2 And b(1,0)= t2 And b(2,0)= 0 Then opcion = 2
        If b(0,1)= 0 And b(1,1)= t2 And b(2,1)= t2 Then opcion = 3
        If b(0,1)= t2 And b(1,1)= 0 And b(2,1)= t2 Then opcion = 4
        If b(0,1)= t2 And b(1,1)= t2 And b(2,1)= 0 Then opcion = 5
        If b(0,2)= 0 And b(1,2)= t2 And b(2,2)= t2 Then opcion = 6
        If b(0,2)= t2 And b(1,2)= 0 And b(2,2)= t2 Then opcion = 7
        If b(0,2)= t2 And b(1,2)= t2 And b(2,2)= 0 Then opcion = 8
        
        '3 bloques verticales
        If b(0,0)= 0 And b(0,1)= t2 And b(0,2)= t2 Then opcion = 0
        If b(0,0)= t2 And b(0,1)= 0 And b(0,2)= t2 Then opcion = 3
        If b(0,0)= t2 And b(0,1)= t2 And b(0,2)= 0 Then opcion = 6
        If b(1,0)= 0 And b(1,1)= t2 And b(1,2)= t2 Then opcion = 1
        If b(1,0)= t2 And b(1,1)= 0 And b(1,2)= t2 Then opcion = 4
        If b(1,0)= t2 And b(1,1)= t2 And b(1,2)= 0 Then opcion = 7
        If b(2,0)= 0 And b(2,1)= t2 And b(2,2)= t2 Then opcion = 2
        If b(2,0)= t2 And b(2,1)= 0 And b(2,2)= t2 Then opcion = 5
        If b(2,0)= t2 And b(2,1)= t2 And b(2,2)= 0 Then opcion = 8
        
        'bloques cruzados
        If b(0,0)= 0 And b(1,1)= t2 And b(2,2)= t2 Then opcion = 0
        If b(0,0)= t2 And b(1,1)= 0 And b(2,2)= t2 Then opcion = 4
        If b(0,0)= t2 And b(1,1)= t2 And b(2,2)= 0 Then opcion = 8
        If b(2,0)= 0 And b(1,1)= t2 And b(0,2)= t2 Then opcion = 2
        If b(2,0)= t2 And b(1,1)= 0 And b(0,2)= t2 Then opcion = 4
        If b(2,0)= t2 And b(1,1)= t2 And b(0,2)= 0 Then opcion = 6
    End If
    
    If opcion = -1 Then        
        If b(0,0) = 0 Then opcion = 0
        If b(2,0) = 0 Then opcion = 2
        If b(0,2) = 0 Then opcion = 6
        If b(2,2) = 0 Then opcion = 8
    End If
    
    'no hay opción de hacer una elección al azar 
    If opcion = -1 Then
        opcion = Int(Rnd(1)*9)
        j = Int(opcion/3)
        i = opcion - Int(opcion/3)*3
        
        'encontrar una casilla vacía
        While b(i,j) <> 0
            opcion = Int(Rnd(1)*9)
            j = Int(opcion/3)
            i = opcion - Int(opcion/3)*3
        Wend
    End If
    
    Return opcion   
End Function


InicializarTablero()
DibujaTablero()
Dim As Integer resultado
Dim As Integer jugador = 1
Dim As Integer ContarMovimientos = 0
Dim As Integer ContarPartidas = 0
Dim As Integer movimiento = 0
Dim As Integer i, j

Do   
    'alternar jugadores
    If jugador = 1 Then jugador = 2 Else jugador = 1
    
    'selecciona tipo de movimiento para cada jugador
    If jugador = 1 Then
        movimiento = MovimientoHumano()
    Else
        movimiento = MovimientoInteligente(2)
    End If
    
    'print "movimiento ="; movimiento
    'print "jugador ="; jugador
    
    'convertir la elección a las coordenadas del tablero i,j
    j = Int(movimiento/3)
    i = movimiento - (j*3)
    b(i,j) = jugador 'ingrese la ficha de jugador 1 o 2
    
    resultado = TestWin(jugador) 'comprobar si el jugador ha ganado
    
    DibujaTablero()
    ContarMovimientos += 1
    
    '=======================================================
    'Comprobar final de partida y/o un resultado de victoria
    '=======================================================
    If ContarMovimientos = 9 Or resultado <> 0 Then
        DibujaTablero()
        If resultado = 0 Then Print !"\n        EMPATE         "
        If resultado = 1 Then Print !"\n        x GANA         "
        If resultado = 2 Then Print !"\n        o GANA         "
        Print Space(28)
        Print "PULSA BARRA ESPACIADORA PARA"
        Print "OTRA PARTIDA, ESC PARA SALIR"
        Sleep
        Cls
        
        InicializarTablero() 'reiniciar tablero
        ContarMovimientos = 0
        ContarPartidas += 1
    End If
Loop Until Multikey(&H01)
End

place1 = 1
place2 = 2
place3 = 3
place4 = 4
place5 = 5
place6 = 6
place7 = 7
place8 = 8
place9 = 9
symbol1 = "X"
symbol2 = "O"
reset:
TextWindow.Clear()
TextWindow.Write(place1 + " ")
TextWindow.Write(place2 + " ")
TextWindow.WriteLine(place3 + " ")
TextWindow.Write(place4 + " ")
TextWindow.Write(place5 + " ")
TextWindow.WriteLine(place6 + " ")
TextWindow.Write(place7 + " ")
TextWindow.Write(place8 + " ")
TextWindow.WriteLine(place9 + " ")
TextWindow.WriteLine("Where would you like to go to (choose a number from 1 to 9 and press enter)?")
n = TextWindow.Read()
If n = 1 then
  If place1 = symbol1 or place1 = symbol2 then
    Goto ai
  Else
    place1 = symbol1
  EndIf
ElseIf n = 2 then
  If place2 = symbol1 or place2 = symbol2 then
    Goto ai
  Else
    place2 = symbol1
  EndIf
ElseIf n = 3 then
  If place3 = symbol1 or place3 = symbol2 then
    Goto ai
  Else
    place3 = symbol1
  EndIf
ElseIf n = 4 then
  If place4 = symbol1 or place4 = symbol2 then
    Goto ai
  Else
    place4 = symbol1
  EndIf
ElseIf n = 5 then
  If place5 = symbol1 or place5 = symbol2 then
    Goto ai
  Else
    place5 = symbol1
  EndIf
ElseIf n = 6 then
  If place6 = symbol1 or place6 = symbol2 then
    Goto ai
  Else
    place6 = symbol1
  EndIf
ElseIf n = 7 then
  If place8 = symbol1 or place7 = symbol2 then
    Goto ai
  Else
    place7 = symbol1
  EndIf
ElseIf n = 8 then
  If place8 = symbol1 or place8 = symbol2 then
    Goto ai
  Else
    place8 = symbol1
  EndIf
ElseIf n = 9 then
  If place9 = symbol1 or place9 = symbol2 then
    Goto ai
  Else
    place9 = symbol1
  EndIf
EndIf
Goto ai
ai:
n = Math.GetRandomNumber(9)
If n = 1 then
  If place1 = symbol1 or place1 = symbol2 then
    Goto ai
  Else
    place1 = symbol2
  EndIf
ElseIf n = 2 then
  If place2 = symbol1 or place2 = symbol2 then
    Goto ai
  Else
    place2 = symbol2
  EndIf
ElseIf n = 3 then
  If place3 = symbol1 or place3 = symbol2 then
    Goto ai
  Else
    place3 = symbol2
  EndIf
ElseIf n = 4 then
  If place4 = symbol1 or place4 = symbol2 then
    Goto ai
  Else
    place4 = symbol2
  EndIf
ElseIf n = 5 then
  If place5 = symbol1 or place5 = symbol2 then
    Goto ai
  Else
    place5 = symbol2
  EndIf
ElseIf n = 6 then
  If place6 = symbol1 or place6 = symbol2 then
    Goto ai
  Else
    place6 = symbol2
  EndIf
ElseIf n = 7 then
  If place7 = symbol1 or place7 = symbol2 then
    Goto ai
  Else
    place7 = symbol2
  EndIf
ElseIf n = 8 then
  If place8 = symbol1 or place8 = symbol2 then
    Goto ai
  Else
    place8 = symbol2
  EndIf
ElseIf n = 9 then
  If place9 = symbol1 or place9 = symbol2 then
    Goto ai
  Else
    place9 = symbol2
  EndIf
EndIf
If place1 = symbol1 and place2 = symbol1 and place3 = symbol1 or place4 = symbol1 and place5 = symbol1 and place6 = symbol1 or place7 = symbol1 and place8 = symbol1 and place9 = symbol1 or place1 = symbol1 and place4 = symbol1 and place7 = symbol1 or place2 = symbol1 and place5 = symbol1 and place8 = symbol1 or place3 = symbol1 and place6 = symbol1 and place9 = symbol1 or place1 = symbol1 and place5 = symbol1 and place9 = symbol1 or place3 = symbol1 and place5 = symbol1 and place7 = symbol1 then
  TextWindow.WriteLine("Player 1 (" + symbol1 + ") wins!")
ElseIf place1 = symbol2 and place2 = symbol2 and place3 = symbol2 or place4 = symbol2 and place5 = symbol2 and place6 = symbol2 or place7 = symbol2 and place8 = symbol2 and place9 = symbol2 or place1 = symbol2 and place4 = symbol2 and place7 = symbol2 or place2 = symbol2 and place5 = symbol2 and place8 = symbol2 or place3 = symbol2 and place6 = symbol2 and place9 = symbol2 or place1 = symbol2 and place5 = symbol2 and place8 = symbol2 or place3 = symbol2 and place5 = symbol2 and place7 = symbol2 then
  TextWindow.WriteLine("Player 2 (" + symbol2 + ") wins!")
Else
  Goto reset
EndIf

' Tic-tac-toe

DECLARE FUNCTION Win% (Piece AS STRING)
DECLARE FUNCTION SpacesFilled% ()
DECLARE SUB ClearBoard ()
DECLARE SUB DisplayNumberedBoard ()
DECLARE SUB DisplayPiecedBoard ()
DECLARE FUNCTION Evaluate% (Me AS STRING, Him AS STRING)

DIM SHARED Board(8) AS STRING * 1, BestMove AS INTEGER
DIM SHARED WinPos(7, 2) AS INTEGER
DIM SHARED MyPiece AS STRING, HisPiece AS STRING

FOR I = 0 TO 7
  FOR J = 0 TO 2
    READ WinPos(I, J)
  NEXT J
NEXT I
' Winning positions
DATA 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 3, 6, 1, 4, 7, 2, 5, 8, 0, 4, 8, 2, 4, 6
MyWinsCnt = 0: HisWinsCnt = 0: DrawsCnt = 0
CompFirst = -1 '  It be reversed, so human goes first
CLS
PRINT
PRINT "            TIC-TAC-TOE"
PRINT
PRINT "In this version, X always goes first."
PRINT "The board is numbered:"
DO
  CompFirst = NOT CompFirst ' reverse who goes first
  MovesCnt = 0
  PRINT
  DisplayNumberedBoard
  PRINT
  IF CompFirst THEN PRINT "I go first." ELSE PRINT "You go first. ";
  ClearBoard
  IF CompFirst THEN MyPiece = "X": HisPiece = "O" ELSE MyPiece = "O": HisPiece = "X"
  ' -1: human; 1: computer; 0: nobody
  IF CompFirst THEN Mover = 1 ELSE Mover = -1
  WHILE Mover <> 0
    SELECT CASE Mover
      CASE 1
        IF MovesCnt = 0 THEN
          BestMove = INT(RND * 9)
        ELSEIF MovesCnt = 1 THEN
          IF Board(4) <> " " THEN BestMove = INT(RND * 2) * 6 + INT(RND * 2) * 2 ELSE BestMove = 4
        ELSE
          T = Evaluate(MyPiece, HisPiece)
        END IF
        Board(BestMove) = MyPiece
        MovesCnt = MovesCnt + 1
        PRINT
        CALL DisplayPiecedBoard
        PRINT
        IF Win(MyPiece) THEN
          MyWinsCnt = MyWinsCnt + 1
          PRINT "I win!"
          Mover = 0
        ELSEIF SpacesFilled THEN
          DrawsCnt = DrawsCnt + 1
          PRINT "It's a draw. Thank you."
          Mover = 0
        ELSE
          Mover = -1
        END IF
      CASE -1
        DO
          INPUT "Where do you move? ", I
          IF I < 1 OR I > 9 THEN
            PRINT "Illegal! ";
          ELSEIF Board(I - 1) <> " " THEN
            PRINT "Place already occupied. ";
          ELSE
            EXIT DO
          END IF
        LOOP
        Board(I - 1) = HisPiece
        MovesCnt = MovesCnt + 1
        PRINT
        CALL DisplayPiecedBoard
        PRINT
        IF Win(HisPiece) THEN
          HisWinsCnt = HisWinsCnt + 1
          PRINT "You beat me! Good game."
          Mover = 0
        ELSEIF SpacesFilled THEN
          DrawsCnt = DrawsCnt + 1
          PRINT "It's a draw. Thank you."
          Mover = 0
        ELSE
          Mover = 1
        END IF
    END SELECT
  WEND
  PRINT
  INPUT "Another game (y/n)? ", Answ$
LOOP UNTIL UCASE$(Answ$) <> "Y"
PRINT
PRINT "Final score:"
PRINT "You won", HisWinsCnt; "game";
IF HisWinsCnt <> 1 THEN PRINT "s";
PRINT "."
PRINT "I won", MyWinsCnt; "game";
IF MyWinsCnt <> 1 THEN PRINT "s";
PRINT "."
PRINT "We tied", DrawsCnt; "game";
IF DrawsCnt <> 1 THEN PRINT "s";
PRINT "."
PRINT "See you later!"
END

SUB ClearBoard
  FOR I = 0 TO 8: Board(I) = " ": NEXT I
END SUB

SUB DisplayNumberedBoard
  FOR I = 0 TO 8 STEP 3
    PRINT I + 1; "|"; I + 2; "|"; I + 3
    IF I <> 6 THEN PRINT "---+---+---"
  NEXT I
END SUB

SUB DisplayPiecedBoard
  FOR I = 0 TO 8 STEP 3
    PRINT " "; Board(I); " | "; Board(I + 1); " | "; Board(I + 2)
    IF I <> 6 THEN PRINT "---+---+---"
  NEXT I
END SUB

FUNCTION Evaluate% (Me AS STRING, Him AS STRING)
  ' Recursive algorithm
  IF Win(Me) THEN Evaluate = 1: EXIT FUNCTION
  IF Win(Him) THEN Evaluate = -1: EXIT FUNCTION
  IF SpacesFilled THEN Evaluate = 0: EXIT FUNCTION
  LoseFlag = 1
  FOR I = 0 TO 8
    IF Board(I) = " " THEN
      Board(I) = Me ' Try the move.
      V = Evaluate(Him, Me)
      Board(I) = " " ' Restore the empty space.
      IF V = -1 THEN BestMove = I: Evaluate = 1: EXIT FUNCTION
      IF V = 0 THEN LoseFlag = 0: SafeMove = I
    END IF
  NEXT
  BestMove = SafeMove
  Evaluate = -LoseFlag
END FUNCTION

FUNCTION SpacesFilled%
  FOR I = 0 TO 8
    IF Board(I) = " " THEN SpacesFilled = 0: EXIT FUNCTION
  NEXT I
  SpacesFilled = -1
END FUNCTION

FUNCTION Win% (Piece AS STRING)
  FOR I = 0 TO 7
    IF Board(WinPos(I, 0)) = Piece AND Board(WinPos(I, 1)) = Piece AND Board(WinPos(I, 2)) = Piece THEN Win = -1: EXIT FUNCTION
  NEXT I
  Win = 0
END FUNCTION


' Tic-tac-toe
' Console application

DECLARE FUNCTION Win (Piece AS STRING) AS INTEGER
DECLARE FUNCTION SpacesFilled () AS INTEGER
DECLARE SUB ClearBoard ()
DECLARE SUB DisplayNumberedBoard ()
DECLARE SUB DisplayPiecedBoard ()
DECLARE FUNCTION Evaluate (Me AS STRING, Him AS STRING) AS INTEGER

DIM Board(8) AS STRING * 1, BestMove AS INTEGER
DIM WinPos(7, 2) AS INTEGER
DIM MyPiece AS STRING, HisPiece AS STRING

FOR I = 0 TO 7
  FOR J = 0 TO 2
    READ WinPos(I, J)
  NEXT J
NEXT I
' Winning positions
DATA 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 3, 6, 1, 4, 7, 2, 5, 8, 0, 4, 8, 2, 4, 6
MyWinsCnt = 0: HisWinsCnt = 0: DrawsCnt = 0
CompFirst = -1 ' It be reversed, so human goes first
CLS
PRINT
PRINT "            TIC-TAC-TOE"
PRINT
PRINT "In this version, X always goes first."
PRINT "The board is numbered:"
DO
  CompFirst = NOT CompFirst ' reverse who goes first
  MovesCnt = 0
  PRINT
  DisplayNumberedBoard
  PRINT
  PRINT IIF(CompFirst, "I go first.", "You go first.")
  ClearBoard
  IF CompFirst THEN MyPiece = "X": HisPiece = "O" ELSE MyPiece = "O": HisPiece = "X"
  ' -1: human; 1: computer; 0: nobody
  Mover = IIF(CompFirst, 1, -1)
  WHILE Mover <> 0
    SELECT CASE Mover
      CASE 1
        IF MovesCnt = 0 THEN
          BestMove = INT(RND * 9)
        ELSEIF MovesCnt = 1 THEN
          BestMove = IIF(Board(4) <> " ", INT(RND * 2) * 6 + INT(RND * 2) * 2, 4)
        ELSE
          T = Evaluate(MyPiece, HisPiece)
        END IF
        Board(BestMove) = MyPiece
        INC(MovesCnt)
        PRINT
        CALL DisplayPiecedBoard
        PRINT
        IF Win(MyPiece) THEN
          INC(MyWinsCnt)
          PRINT "I win!"
          Mover = 0
        ELSEIF SpacesFilled THEN
          INC(DrawsCnt)
          PRINT "It's a draw. Thank you."
          Mover = 0
        ELSE
          Mover = -1
        END IF
      CASE -1
        DO
          INPUT "Where do you move? ",I
          IF I < 1 OR I > 9 THEN
            PRINT "Illegal! ";
          ELSEIF Board(I - 1) <> " " THEN
            PRINT "Place already occupied. ";
          ELSE
            EXIT DO
          END IF
        LOOP
        Board(I - 1) = HisPiece
        INC(MovesCnt)
        PRINT
        CALL DisplayPiecedBoard
        PRINT
        IF Win(HisPiece) THEN
          INC(HisWinsCnt)
          PRINT "You beat me! Good game."
          Mover = 0
        ELSEIF SpacesFilled THEN
          INC(DrawsCnt)
          PRINT "It's a draw. Thank you."
          Mover = 0
        ELSE
          Mover = 1
        END IF
    END SELECT
  WEND
  PRINT
  INPUT "Another game (y/n)? ", Answ$
LOOP UNTIL UCASE$(Answ$) <> "Y"
PRINT
PRINT "Final score:"
PRINT "You won "; HisWinsCnt; " game"; IIF(HisWinsCnt <> 1, "s.", ".")
PRINT "I won "; MyWinsCnt; " game"; IIF(MyWinsCnt <> 1, "s.", ".")
PRINT "We tied "; DrawsCnt; " game"; IIF(DrawsCnt <> 1, "s.", ".")
PRINT "See you later!"
END

SUB ClearBoard
  FOR I = 0 TO 8: Board(I) = " ": NEXT I
END SUB

SUB DisplayNumberedBoard
  FOR I = 0 TO 8 STEP 3
    PRINT " "; I + 1; " | "; I + 2; " | "; I + 3
    IF I <> 6 THEN PRINT "---+---+---"
  NEXT I
END SUB

SUB DisplayPiecedBoard
  FOR I = 0 TO 8 STEP 3
    PRINT " "; Board(I); " | "; Board(I + 1); " | "; Board(I + 2)
    IF I <> 6 THEN PRINT "---+---+---"
  NEXT I
END SUB

FUNCTION Evaluate (Me AS STRING, Him AS STRING)
  ' Recursive algorithm
  DIM I AS INTEGER, SafeMove AS INTEGER, V AS INTEGER, LoseFlag AS INTEGER
  IF Win(Me) THEN Evaluate = 1: EXIT FUNCTION
  IF Win(Him) THEN Evaluate = -1: EXIT FUNCTION
  IF SpacesFilled THEN Evaluate = 0: EXIT FUNCTION
  LoseFlag = 1
  I = 0
  WHILE I <= 8
    IF Board(I) = " " THEN
      Board(I) = Me ' Try the move.
      V = Evaluate(Him, Me)
      Board(I) = " " ' Restore the empty space.
      IF V = -1 THEN BestMove = I: Evaluate = 1: EXIT FUNCTION
      IF V = 0 THEN LoseFlag = 0: SafeMove = I
    END IF
    INC(I)
  WEND
  BestMove = SafeMove
  Evaluate = -LoseFlag
END FUNCTION

FUNCTION SpacesFilled
  FOR I = 0 TO 8
    IF Board(I) = " " THEN SpacesFilled = 0: EXIT FUNCTION
  NEXT I
  SpacesFilled = -1
END FUNCTION

FUNCTION Win (Piece AS STRING)
  FOR I = 0 TO 7
    IF Board(WinPos(I, 0)) = Piece AND Board(WinPos(I, 1)) = Piece AND Board(WinPos(I, 2)) = Piece THEN Win = -1: EXIT FUNCTION
  NEXT I
  Win = 0
END FUNCTION


' ---------------------------
'  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

    REM Tic-tac-toe for Tiny BASIC
    REM
    REM Released as public domain by Damian Gareth Walker, 2019
    REM Created: 21-Sep-2019
    
    REM --- Variables
    REM     A   - first square in line examined
    REM     B   - second square in line examined
    REM     C   - third square in line examined
    REM     D   - player whose pieces to count
    REM     E   - number of DREM s pieces on a line
    REM     F   - first square of line to examine
    REM     G   - game winner
    REM     H   - which side the human takes
    REM     I   - increment for line to examine
    REM     L   - line to examine
    REM     M   - where to move (various uses)
    REM     N   - piece found in a square
    REM     P   - player currently playing
    REM     Q   - square to examine
    REM     R-Z - contents of the board

    REM --- Main Program
    GOSUB 40
    GOSUB 60
    GOSUB 80
    END

    REM --- Subroutine to initialise the game
    REM     Outputs: H - Human play order
    REM              P - Whose turn it is
 40 PRINT "Tic tac toe. Board positions are:"
    PRINT " 1  2  3"
    PRINT " 4  5  6"
    PRINT " 7  8  9"
    PRINT "Play first or second (1/2)?"
    INPUT H
    IF H<1 THEN GOTO 40
    IF H>2 THEN GOTO 40
    LET P=1
    RETURN

    REM --- Subroutine to take turns
    REM     Inputs:  H - who is the human
    REM              P - whose turn it is
    REM     Outputs: G - who won the game
 60 IF P=H THEN GOSUB 100
    IF P<>H THEN GOSUB 120
    GOSUB 200
    IF G>0 THEN RETURN
    LET P=3-P
    IF R=0 THEN GOTO 60
    IF S=0 THEN GOTO 60
    IF T=0 THEN GOTO 60
    IF U=0 THEN GOTO 60
    IF V=0 THEN GOTO 60
    IF W=0 THEN GOTO 60
    IF X=0 THEN GOTO 60
    IF Y=0 THEN GOTO 60
    IF Z=0 THEN GOTO 60
    RETURN

    REM --- Victory
    REM Inputs: H   - which side was the human
    REM         P   - player who won
 80 IF G=H THEN PRINT "You win!"
    IF G<>0 THEN IF G<>H THEN PRINT "Computer wins"
    IF G=0 THEN PRINT "A draw"
    RETURN

    REM --- Subroutine to allow the player to move
    REM     Inputs:  P   - player number
    REM     Outputs: M   - where the player wishes to move
100 PRINT "Move? "
    INPUT Q
    IF Q<1 THEN GOTO 100
    IF Q>9 THEN GOTO 100
    GOSUB 220
    IF N<>0 THEN GOTO 100
    LET M=Q
    GOSUB 240
    RETURN

    REM --- Subroutine to make the computerREM s move
    REM     Inputs:  P   - player number
    REM     Outputs: M   - the move chosen
120 LET M=0
    LET D=3-H
    GOSUB 145
    IF M>0 THEN GOTO 135
    LET D=H
    GOSUB 145
    IF M=0 THEN IF V=0 THEN LET M=5
    IF M=0 THEN IF R=0 THEN LET M=1    
    IF M=0 THEN IF T=0 THEN LET M=3    
    IF M=0 THEN IF X=0 THEN LET M=7    
    IF M=0 THEN IF Z=0 THEN LET M=9
    IF M=0 THEN IF S=0 THEN LET M=2    
    IF M=0 THEN IF U=0 THEN LET M=4    
    IF M=0 THEN IF Y=0 THEN LET M=8    
    IF M=0 THEN IF W=0 THEN LET M=6    
135 GOSUB 240
    PRINT "Computer move ",M
    RETURN

    REM --- Identify moves to win or avoid a loss
    REM     Inputs:  D   - player whose pieces weREM re counting
    REM     Changes: E   - number of pieces on line being scanned
    REM              F   - first square in winning line
    REM              I   - increment of winning line
    REM              L   - line being scanned (counter)
145 LET L=1
146 GOSUB 170
    IF E<2 THEN GOTO 152
    IF A=0 THEN LET M=F
    IF B=0 THEN LET M=F+I
    IF C=0 THEN LET M=F+I+I
    IF M>0 THEN RETURN
152 LET L=L+1
    IF L<9 THEN GOTO 146
    RETURN

    REM --- Count a playerREM s pieces on a line
    REM     Inputs:  D   - player whose pieces weREM re counting
    REM              L   - line number
    REM     Changes: F   - first square on the line
    REM              I   - increment of the line
    REM              Q   - individual squares to examine
    REM     Outputs: A   - contents of first square
    REM              B   - contents of second square
    REM              C   - contents of third square
    REM              E   - number of the playerREM s pieces
170 IF L>3 THEN GOTO 174
    LET F=3*L-2
    LET I=1
    GOTO 180
174 IF L>6 THEN GOTO 178
    LET F=L-3
    LET I=3
    GOTO 180
178 LET F=1+2*(L-7)
    LET I=4-2*(L-7)
180 LET E=0
    LET Q=F
    GOSUB 220
    LET A=N
    IF N=D THEN LET E=E+1
    LET Q=Q+I
    GOSUB 220
    LET B=N
    IF N=D THEN LET E=E+1
    LET Q=Q+I
    GOSUB 220
    LET C=N
    IF N=D THEN LET E=E+1
    RETURN

    REM --- Subroutine to check for a win
    REM     Inputs:  R-Z - board squares
    REM     Outputs: G   - the winning player (0 for neither)
200 LET G=0
    IF R>0 THEN IF R=S THEN IF S=T THEN LET G=R
    IF U>0 THEN IF U=V THEN IF V=W THEN LET G=U
    IF X>0 THEN IF X=Y THEN IF Y=Z THEN LET G=X
    IF R>0 THEN IF R=U THEN IF U=X THEN LET G=R
    IF S>0 THEN IF S=V THEN IF V=Y THEN LET G=S
    IF T>0 THEN IF T=W THEN IF W=Z THEN LET G=T
    IF R>0 THEN IF R=V THEN IF V=Z THEN LET G=R
    IF T>0 THEN IF T=V THEN IF V=X THEN LET G=T
    RETURN

    REM --- Subroutine to see what piece is in a square
    REM     Inputs:  Q   - the square to check
    REM              R-Z - the contents of the squares
    REM     Outputs: N   - the piece in that square
220 LET N=0
    IF Q=1 THEN LET N=R
    IF Q=2 THEN LET N=S
    IF Q=3 THEN LET N=T
    IF Q=4 THEN LET N=U
    IF Q=5 THEN LET N=V
    IF Q=6 THEN LET N=W
    IF Q=7 THEN LET N=X
    IF Q=8 THEN LET N=Y
    IF Q=9 THEN LET N=Z
    RETURN

    REM --- Subroutine to put a piece in a square
    REM     Inputs:  P   - the player whose piece should be placed
    REM              M   - the square to put the piece in
    REM     Changes: R-Z - the contents of the squares
240 IF M=1 THEN LET R=P
    IF M=2 THEN LET S=P
    IF M=3 THEN LET T=P
    IF M=4 THEN LET U=P
    IF M=5 THEN LET V=P
    IF M=6 THEN LET W=P
    IF M=7 THEN LET X=P
    IF M=8 THEN LET Y=P
    IF M=9 THEN LET Z=P
    RETURN


Option Explicit

Private Lines(1 To 3, 1 To 3) As String
Private Nb As Byte, player As Byte
Private GameWin As Boolean, GameOver As Boolean

Sub Main_TicTacToe()
Dim p As String

    InitLines
    printLines Nb
    Do
        p = WhoPlay
        Debug.Print p & " play"
        If p = "Human" Then
            Call HumanPlay
            GameWin = IsWinner("X")
        Else
            Call ComputerPlay
            GameWin = IsWinner("O")
        End If
        If Not GameWin Then GameOver = IsEnd
    Loop Until GameWin Or GameOver
    If Not GameOver Then
        Debug.Print p & " Win !"
    Else
        Debug.Print "Game Over!"
    End If
End Sub

Sub InitLines(Optional S As String)
Dim i As Byte, j As Byte
    Nb = 0: player = 0
    For i = LBound(Lines, 1) To UBound(Lines, 1)
        For j = LBound(Lines, 2) To UBound(Lines, 2)
            Lines(i, j) = "#"
        Next j
    Next i
End Sub

Sub printLines(Nb As Byte)
Dim i As Byte, j As Byte, strT As String
    Debug.Print "Loop " & Nb
    For i = LBound(Lines, 1) To UBound(Lines, 1)
        For j = LBound(Lines, 2) To UBound(Lines, 2)
            strT = strT & Lines(i, j)
        Next j
        Debug.Print strT
        strT = vbNullString
    Next i
End Sub

Function WhoPlay(Optional S As String) As String
    If player = 0 Then
        player = 1
        WhoPlay = "Human"
    Else
        player = 0
        WhoPlay = "Computer"
    End If
End Function

Sub HumanPlay(Optional S As String)
Dim L As Byte, C As Byte, GoodPlay As Boolean

    Do
        L = Application.InputBox("Choose the row", "Numeric only", Type:=1)
        If L > 0 And L < 4 Then
            C = Application.InputBox("Choose the column", "Numeric only", Type:=1)
            If C > 0 And C < 4 Then
                If Lines(L, C) = "#" And Not Lines(L, C) = "X" And Not Lines(L, C) = "O" Then
                    Lines(L, C) = "X"
                    Nb = Nb + 1
                    printLines Nb
                    GoodPlay = True
                End If
            End If
        End If
    Loop Until GoodPlay
End Sub

Sub ComputerPlay(Optional S As String)
Dim L As Byte, C As Byte, GoodPlay As Boolean

    Randomize Timer
    Do
        L = Int((Rnd * 3) + 1)
        C = Int((Rnd * 3) + 1)
        If Lines(L, C) = "#" And Not Lines(L, C) = "X" And Not Lines(L, C) = "O" Then
            Lines(L, C) = "O"
            Nb = Nb + 1
            printLines Nb
            GoodPlay = True
        End If
    Loop Until GoodPlay
End Sub

Function IsWinner(S As String) As Boolean
Dim i As Byte, j As Byte, Ch As String, strTL As String, strTC As String

    Ch = String(UBound(Lines, 1), S)
    'check lines & columns
    For i = LBound(Lines, 1) To UBound(Lines, 1)
        For j = LBound(Lines, 2) To UBound(Lines, 2)
            strTL = strTL & Lines(i, j)
            strTC = strTC & Lines(j, i)
        Next j
        If strTL = Ch Or strTC = Ch Then IsWinner = True: Exit For
        strTL = vbNullString: strTC = vbNullString
    Next i
    'check diagonales
    strTL = Lines(1, 1) & Lines(2, 2) & Lines(3, 3)
    strTC = Lines(1, 3) & Lines(2, 2) & Lines(3, 1)
    If strTL = Ch Or strTC = Ch Then IsWinner = True
End Function

Function IsEnd() As Boolean
Dim i As Byte, j As Byte

    For i = LBound(Lines, 1) To UBound(Lines, 1)
        For j = LBound(Lines, 2) To UBound(Lines, 2)
            If Lines(i, j) = "#" Then Exit Function
        Next j
    Next i
    IsEnd = True
End Function

5 REM Adaptation to Yabasic of the program published in Tim Hartnell's book "Artificial Intelligence: Concepts and Programs", with some minor modifications. 6/2018.
10 REM TICTAC
15 INPUT "English (0), Spanish (other key): " IDIOMA : IF NOT IDIOMA THEN RESTORE 2020 ELSE RESTORE 2010 END IF
20 GOSUB 1180: REM INICIALIZACION
30 REM *** REQUISITOS PREVIOS AL JUEGO ***
40 FOR J = 1 TO 9
50 A(J) = 32
60 NEXT J
70 FOR J = 1 TO 5
80 D(J) = 0
90 NEXT J
100 CCONTADOR = 0
110 R$ = ""
120 GOSUB 1070: REM IMPRESION DEL TABLERO
130 REM ** CICLO PRINCIPAL **
140 GOSUB 540: REM MOVIMIENTO DEL ORDENADOR
150 GOSUB 1070: REM IMPRESION DEL TABLERO
160 GOSUB 870: REM COMPRUEBA LA VICTORIA
170 IF R$ <> ""  GOTO 240
180 GOSUB 980: REM SE ACEPTA EL MOVIMIENTO DE LA PERSONA
190 GOSUB 1070: REM IMPRESION DEL TABLERO
200 GOSUB 870: REM COMPRUEBA LA VICTORIA
210 IF R$ = ""  GOTO 140
220 REM ** FIN DEL CICLO PRINCIPAL **
230 REM *****************************
240 REM FIN DEL JUEGO
250 GOSUB 1070: REM IMPRESION DEL TABLERO
260 PRINT: PRINT
270 IF R$ = "G"  PRINT MENSAJE$(1): BANDERA = -1
280 IF R$ = "P"  PRINT MENSAJE$(2): BANDERA = 1
290 IF R$ = "D"  PRINT MENSAJE$(3): GOTO 430
300 REM ACTUALIZACION DE LA BASE DE DATOS
310 FOR B = 1 TO 5
320 FOR J = 2 TO 9
330 IF M(J) = D(B) GOSUB 370
340 NEXT J
350 NEXT B
360 GOTO 430
370 REM ** REORDENACION DE LOS ELEMENTOS DE LA MATRIZ M **
380 TEMP = M(J + BANDERA)
390 M(J + BANDERA) = M(J)
400 M(J) = TEMP
410 J = 9
420 RETURN
430 PRINT: PRINT
440 PRINT MENSAJE$(4)
450 PRINT: PRINT
460 FOR J = 1 TO 9
470 PRINT M(J), " ";
480 NEXT J
490 PRINT: PRINT
500 PRINT MENSAJE$(5)
510 INPUT A$
520 GOTO 30
530 REM ************************
540 REM MOVIMIENTO DEL ORDENADOR
550 P = ASC("O") 
560 X = 0
570 J = 1
580 IF A(W(J)) = A(W(J + 1)) AND A(W(J + 2)) = 32 AND A(W(J)) = P  X = W(J + 2): GOTO 750
590 IF A(W(J)) = A(W(J + 2)) AND A(W(J + 1)) = 32 AND A(W(J)) = P  X = W(J + 1): GOTO 750
600 IF A(W(J + 1)) = A(W(J + 2)) AND A(W(J)) = 32 AND A(W(J + 1)) = P  X = W(J): GOTO 750
610 IF J < 21  J = J + 3: GOTO 580
620 IF P = ASC("O")  P = ASC("X"): GOTO 570
630 REM ** SI NO SE GANA SE BUSCA UN MOVIMIENTO DE BLOQUEO **
640 REM * ENTONCES SE USA LA SIGUIENTE SECCION *
650 J = 1
660 IF A(M(J)) = 32  X = M(J): GOTO 750
670 IF J < 10  J = J + 1: GOTO 660
680 H = 0
690 H = H + 1
700 X = INT(RAN(1) * 9): IF A(X) = 32  GOTO 750
710 IF H < 100  GOTO 690
720 R$ = "D": REM ES SIMPLEMENTE UN DIBUJO
730 RETURN
740 REM *********************
750 REM REALIZA EL MOVIMIENTO
760 A(X) = ASC("O")
770 CCONTADOR = CCONTADOR + 1
780 D(CCONTADOR) = X
790 BANDERA = 0
800 FOR J = 1 TO 9
810 IF A(J) = 32  BANDERA = 1
820 NEXT J
830 IF BANDERA = 0 AND R$ = ""  R$ = "D"
840 REM SI TODAS LAS CASILLAS ESTAN LLENAS Y R$ ESTA VACIO, ENTONCES ES SIMPLEMENTE UN DIBUJO
850 RETURN
860 REM *********************
870 REM COMPRUEBA LA VICTORIA
880 J = 1
890 IF A(W(J)) = 32  J = J + 3
900 IF J > 23  RETURN
910 IF A(W(J)) = A(W(J + 1)) AND A(W(J)) = A(W(J + 2))  GOTO 940
920 IF J < 22  J = J + 3: GOTO 890
930 RETURN
940 IF A(W(J)) = ASC("O")  R$ = "G": REM EL ORDENADOR GANA
950 IF A(W(J)) = ASC("X")  R$ = "P": REM EL ORDENADOR PIERDE
960 RETURN
970 REM ************************
980 REM MOVIMIENTO DE LA PERSONA
990 PRINT: PRINT
1000 PRINT MENSAJE$(6)
1010 PRINT MENSAJE$(7); : INPUT MOVIMIENTO
1020 IF MOVIMIENTO < 1 OR MOVIMIENTO > 9  GOTO 1010
1030 IF A(MOVIMIENTO) <> 32  GOTO 1010
1040 A(MOVIMIENTO) = ASC("X")
1050 RETURN
1060 REM *********************
1070 REM IMPRESION DEL TABLERO
1080 CLEAR SCREEN
1090 PRINT: PRINT: PRINT
1100 PRINT " 1 : 2 : 3        ", CHR$(A(1)), " : ", CHR$(A(2)), " : ", CHR$(A(3))
1110 PRINT "-----------      ------------"
1120 PRINT " 4 : 5 : 6        ", CHR$(A(4)), " : ", CHR$(A(5)), " : ", CHR$(A(6))
1130 PRINT "-----------      ------------"
1140 PRINT " 7 : 8 : 9        ", CHR$(A(7)), " : ", CHR$(A(8)), " : ", CHR$(A(9))
1150 PRINT
1160 RETURN
1170 REM **************
1180 REM INICIALIZACION
1190 CLEAR SCREEN
1200 DIM A(9) : REM TABLERO
1210 DIM M(10) : REM ACCESO A LA BASE DE DATOS
1220 DIM W(24) : REM DATOS DE VICTORIA O BLOQUEO
1230 DIM D(5) : REM ACCESO AL MOVIMIENTO EN EL JUEGO ACTUAL
1235 DIM MENSAJE$(1) : READ M$ : N = TOKEN(M$,MENSAJE$(),",") : RESTORE
1240 REM DATOS DE VICTORIA O BLOQUEO
1250 FOR J = 1 TO 24
1260 READ W(J)
1270 NEXT J
1280 DATA 1, 2, 3, 4, 5, 6, 7, 8, 9
1290 DATA 1, 4, 7, 2, 5, 8, 3, 6, 9
1300 DATA 1, 5, 9, 3, 5, 7
1310 REM BASE INICIAL DE DATOS
1320 FOR J = 1 TO 10
1330 READ M(J)
1340 NEXT J
1350 DATA 2, 6, 8, 4, 7, 3, 1, 9, 5, 2
1360 RETURN
2000 REM MENSAJES EN ESPAÑOL
2010 DATA "YO GANO,TU GANAS,ES SIMPLEMENTE UN DIBUJO,ESTA ES MI PRIORIDAD ACTUALIZADA,PULSE LA TECLA <RETURN> PARA CONTINUAR,REALICE SU MOVIMIENTO,MOVIMIENTO: "
2020 DATA "I WIN,YOU WIN,IT'S JUST A DRAWING,THIS IS MY PRIORITY UPDATE,PRESS <RETURN> TO CONTINUE,TO MAKE YOUR MOVE,MOVEMENT: "

  

You may also check:How to resolve the algorithm Range expansion step by step in the LiveCode programming language
You may also check:How to resolve the algorithm Check that file exists step by step in the Delphi programming language
You may also check:How to resolve the algorithm Loops/For with a specified step step by step in the Quackery programming language
You may also check:How to resolve the algorithm Prime decomposition step by step in the Swift programming language
You may also check:How to resolve the algorithm Guess the number step by step in the Picat programming language