REM Project: tictactoe
REM Created: 11/5/2006 11:51:49 AM
REM
REM ***** Main Source File *****
REM
 
sync on
sync rate 60
disable escapekey
 
randomize timer()
 
set text font "arial"
 
set text size 20
 
global dim squares(10,10)
squares(0,0)=5
global first
global mids
global sw
global sh
global comp
global back
global center
 
comp=5
 
mids=screen width()/2
 
sw=screen width()
 
sh=screen height()
 
 
do
   cls
   repeat
 
      ink rgb(91,246,181),rgb(91,246,181)
 
      box 100,100,screen width()-100,screen height()-100
 
      ink rgb(25,163,255),rgb(25,163,255)
 
      box 100,100,screen width()-100,110
 
      box 100,100,110,screen height()-100
 
      box screen width()-110,110,screen width()-100,screen height()-100
 
      box 100,screen height()-110,screen width()-100,screen height()-100
 
      center text mids,150,"Welcome to Tic Tac Toe or naughts and crosses"
 
      if 1=button("Play",200,0,0,3)
         play=1
      endif
 
      if 1=button("Options",250,0,0,3)
         gosub options
      endif
 
      if 1=button("EXIT",300,0,0,3)
         end
      endif
 
      sync
 
   until play=1
 
   play=0
 
   Cls
 
   repeat
      again=0
      move=0
      first=0
      sync
 
      ink rgb(255,255,255),rgb(255,255,255)
 
      box 0,0,screen width(),screen height()
 
      ink 0,rgb(255,255,255)
 
      Line screen width()/3,100,screen width()/3,screen height()-100
      Line (screen width()/3)*2,100,(screen width()/3)*2,screen height()-100
      Line 100,screen height()/3,screen width()-100,screen height()/3
      Line 100,(screen height()/3)*2,screen width()-100,(screen height()/3)*2
 
      sync
 
 
 
     repeat
        place(1)
 
        if back=1 then exit
 
        move=move+1
 
        if 1=win(1)
           sync
           wait 1000
           cls rgb(255,255,255)
           sync
           text 0,0,"Player 1 wins"
           sync
           suspend for key
           exit
        endif
 
        if move=9
           cls rgb(255,255,255)
           sync
           text 0,0,"Tie"
           sync
           suspend for key
           exit
        endif
 
        sync
 
        if comp=5 then compplaceexpt()
        if comp=4 then compplacehard()
        if comp=3 then compplacemed()
        if comp=2 then compplaceeasy()
        if comp=1 then place(2)
 
        if back=1 then exit
 
        move=move+1
 
        if 1=win(2)
           sync
           wait 1000
           cls rgb(255,255,255)
           sync
           text 0,0,"Player 2 wins"
           sync
           suspend for key
           exit
        endif
 
 
 
        sync
 
     until again=1 or back=1
 
     undim squares(10,10)
     global dim squares(10,10)
     squares(0,0)=5
 
 
   until back=1
 
   back=0
loop
 
`The options menu
 
options:
 
ink rgb(91,246,181),rgb(91,246,181)
 
box 100,100,screen width()-100,screen height()-100
 
ink rgb(25,163,255),rgb(25,163,255)
 
box 100,100,screen width()-100,110
 
box 100,100,110,screen height()-100
 
box screen width()-110,110,screen width()-100,screen height()-100
 
box 100,screen height()-110,screen width()-100,screen height()-100
 
center text mids,150,"Options"
 
repeat
 
   if 1=button("Easy",200,0,0,3)
      comp=2
   endif
 
   if 1=button("Medium",250,0,0,3)
      comp=3
   endif
 
   if 1=button("Hard",300,0,0,3)
      comp=4
   endif
 
   if 1=button("Expert",350,0,0,3)
      comp=5
   endif
 
   if 1=button("Player",400,0,0,3)
      comp=1
   endif
 
   if 1=button("BACK",450,0,0,3)
      back1=1
   endif
 
   sync
 
until back1=1
 
back1=0
 
wait 200
cls
sync
 
return
 
 
`Makes buttons and checks if they are being pressed
 
function button(but$,y,in,bac,size)
 
   if size=2
      set text size 30
   endif
 
   if size=3
      set text size 40
   endif
 
   if in=0
      in=rgb(25,163,255)
   endif
 
   if bac=0
      bac=rgb(91,246,181)
   endif
 
   length=text width(but$)/2
 
   if mids-length<mousex() and mids+length>mousex() and y<mousey() and y+text height(but$)>mousey()
      bac=rgb(91,196,181)
      if mouseclick()=1
         selected=1
      endif
   endif
 
   ink in,bac
   center text mids,y,but$
 
   set text size 20
 
endfunction selected
 
`Alows the player to pick their own space
 
function place(play)
 
repeat
   x=mousex()
   y=mousey()
 
   click=mouseclick()
 
   if click=1
      if x<sw/3
         xpos#=.166666
         if y<sh/3
            plac=1
            ypos#=.166666
         endif
         if y>sh/3 and y<2*(sh/3)
            plac=4
            ypos#=.5
         endif
         if y>2*(sh/3)
            plac=7
            ypos#=.83333
         endif
      endif
 
      if x>sw/3 and x<(sw/3)*2
         xpos#=.5
         if y<sh/3
            plac=2
            ypos#=.166666
         endif
         if y>sh/3 and y<2*(sh/3)
            plac=5
            ypos#=.5
         endif
         if y>2*(sh/3)
            plac=8
            ypos#=.83333
         endif
      endif
 
      if x>(sw/3)*2
         xpos#=.8333333
         if y<sh/3
            plac=3
            ypos#=.166666
         endif
         if y>sh/3 and y<2*(sh/3)
            plac=6
            ypos#=.5
         endif
         if y>2*(sh/3)
            plac=9
            ypos#=.83333
         endif
      endif
 
   endif
 
   row=(plac-0.5)/3+1
   column=((plac-1) mod 3)+1
 
   if squares(row,column)=0 and play=1
 
      squares(row,column)=1
      nex=1
      circle screen width()*xpos#,screen height()*ypos#,50
   ENDIF
 
   if squares(row,column)=0 and play=2
 
      squares(row,column)=2
      nex=1
      box screen width()*xpos#-20,screen height()*ypos#-20,screen width()*xpos#+20,screen height()*ypos#+20
   ENDIF
 
   if escapekey()=1
      back=1
   endif
 
until nex=1 or back=1
 
endfunction nex
 
`Easy Chosses only random places
 
function compplaceeasy()
 
repeat
 
   plac=rnd(8)+1
 
   row=(plac-0.5)/3+1
   column=((plac-1) mod 3)+1
 
until squares(row,column)=0
 
squares(row,column)=2
 
xpos#=column*2-1
xpos#=xpos#/6
 
ypos#=row*2-1
ypos#=ypos#/6
 
box screen width()*xpos#-20,screen height()*ypos#-20,screen width()*xpos#+20,screen height()*ypos#+20
 
 
endfunction nex
 
`Pretty easy to beat only checks for a win
 
function compplacemed()
 
skip=0
 
`checks for a win
 
plac=check(2)
 
if plac>0
 
   row=(plac-0.5)/3+1
   column=((plac-1) mod 3)+1
   skip=1
 
endif
 
`Chosses a random place
 
if skip=0
   repeat
 
      plac=rnd(8)+1
 
      row=(plac-0.5)/3+1
      column=((plac-1) mod 3)+1
 
   until squares(row,column)=0
endif
 
squares(row,column)=2
 
xpos#=column*2-1
xpos#=xpos#/6
 
ypos#=row*2-1
ypos#=ypos#/6
 
box screen width()*xpos#-20,screen height()*ypos#-20,screen width()*xpos#+20,screen height()*ypos#+20
 
 
endfunction nex
 
`Difficult however beatable
 
function compplacehard()
 
skip=0
 
 
`checks to see if it can make a win
 
plac=check(1)
 
if plac>0
 
   row=(plac-0.5)/3+1
   column=((plac-1) mod 3)+1
   skip=1
 
endif
 
`Checks to see if it can make a block
 
plac=check(2)
 
if plac>0
 
   row=(plac-0.5)/3+1
   column=((plac-1) mod 3)+1
   skip=1
 
endif
 
`Choses a random spot if there is not a good spot
 
if skip=0
   repeat
 
      plac=rnd(8)+1
 
      row=(plac-0.5)/3+1
      column=((plac-1) mod 3)+1
 
   until squares(row,column)=0
endif
 
squares(row,column)=2
 
xpos#=column*2-1
xpos#=xpos#/6
 
ypos#=row*2-1
ypos#=ypos#/6
 
box screen width()*xpos#-20,screen height()*ypos#-20,screen width()*xpos#+20,screen height()*ypos#+20
 
 
endfunction nex
 
`Unbeatable difficulty.... At least I think
 
function compplaceexpt()
 
`If it is the first move it does this
 
if first=0
 
   plac=firstcompmove()
 
   if plac>0
 
      row=(plac-0.5)/3+1
      column=((plac-1) mod 3)+1
      skip=1
 
   endif
 
else
   skip=0
 
 
   `checks to see if it can make a block
 
   plac=check(1)
 
   if plac>0
 
      row=(plac-0.5)/3+1
      column=((plac-1) mod 3)+1
      skip=1
 
   endif
 
   `checks to see if it can make a win
 
   plac=check(2)
 
   if plac>0
 
      row=(plac-0.5)/3+1
      column=((plac-1) mod 3)+1
      skip=1
 
   endif
 
   `checks to see if it can make an educated move (if the space is avalible)
   `if it went center first then it goes edges
   `if it went corner first then it goes corners
 
   if skip=0
      plac=conner()
 
      if plac>0
 
         row=(plac-0.5)/3+1
         column=((plac-1) mod 3)+1
         skip=1
 
      endif
   endif
 
   `If there isnt a better move then it picks a random spot
 
   if skip=0
      repeat
 
         plac=rnd(8)+1
 
         row=(plac-0.5)/3+1
         column=((plac-1) mod 3)+1
 
      until squares(row,column)=0
   endif
endif
 
squares(row,column)=2
 
xpos#=column*2-1
xpos#=xpos#/6
 
ypos#=row*2-1
ypos#=ypos#/6
 
box screen width()*xpos#-20,screen height()*ypos#-20,screen width()*xpos#+20,screen height()*ypos#+20
 
 
endfunction nex
 
`Determines if anyone has won
 
function win(player)
 
   for x=1 to 3
      for y=1 to 3
         if squares(x,y)=player then row=row+1
      next y
      if row=3 then yes=1
      if row<3 then row=0
   next x
 
   for y=1 to 3
      for x=1 to 3
         if squares(x,y)=player then col=col+1
      next x
      if col=3 then yes=1
      if col<3 then col=0
   next y
 
   for x=1 to 3
      if squares(x,x)=player then dig=dig+1
   next x
 
   for x=1 to 3
      if squares(x,4-x)=player then dig2=dig2+1
   next x
 
   if dig=3 or dig2=3 then yes=1
 
endfunction yes
 
 
`Check- decides if there is a block (Wi=1) or a win (wi=2)
 
function check(wi)
 
   for i=1 to 3
      for j=1 to 3
 
         if squares(i,j)=wi
            col=col+1
         endif
         if squares(i,j)=0
            notcheck=j
         endif
 
      next j
 
      if col=2 and notcheck>0
         row=i
         column=notcheck
         skip=1
         col=0
         notcheck=0
      else
         col=0
         notcheck=0
      endif
 
   next i
 
   for j=1 to 3
      for i=1 to 3
 
         if squares(i,j)=wi
            ro=ro+1
         endif
         if squares(i,j)=0
            notcheck=i
         endif
 
      next i
 
      if ro=2 and notcheck>0
         column=j
         row=notcheck
         skip=1
         ro=0
         notcheck=0
      else
         ro=0
         notcheck=0
      endif
 
   next j
 
 
 
   for j=1 to 3
 
         if squares(j,j)=wi
            ro=ro+1
         endif
         if squares(j,j)=0
            notcheck=j
         endif
 
   next j
 
   if ro=2 and notcheck>0
      column=notcheck
      row=notcheck
      skip=1
      ro=0
      notcheck=0
   else
      ro=0
      notcheck=0
   endif
 
   for j=1 to 3
 
         if squares(j,4-j)=wi
            ro=ro+1
         endif
         if squares(j,4-j)=0
            notcheck=j
         endif
 
   next j
 
   if ro=2 and notcheck>0
      column=4-notcheck
      row=notcheck
      skip=1
      ro=0
      notcheck=0
   else
      ro=0
      notcheck=0
   endif
 
   plac=column+3*(row-1)
 
endfunction plac
 
`Makes the first move on expert, if your first move was the center it goes on a corner
`Otherwise it goes in the center
 
function firstcompmove()
 
   first=1
   if squares(2,2)=1
      center=0
      choice=rnd(3)
      if choice=1 then plac=1
      if choice=2 then plac=3
      if choice=3 then plac=7
      if choice=4 then plac=9
   else
      center=1
      plac=5
   endif
 
endfunction plac
 
`Makes an educated move on expert
 
function conner()
   if center=0
      if squares(1,1)=0 then plac=1
      if squares(1,3)=0 then plac=3
      if squares(3,1)=0 then plac=7
      if squares(3,3)=0 then plac=9
   else
      if squares(1,2)=0 then plac=2
      if squares(2,1)=0 then plac=4
      if squares(2,3)=0 then plac=6
      if squares(3,2)=0 then plac=8
   endif
 
 
endfunction plac