BASIC2\OXO.BAS ·
BAS ·
4.8 KB ·
1987-12-22 ·
from PCPlus_Issue-19_Apr-1988
REM oxo
REM initialise
SCREEN #1 GRAPHICS 480 FIXED,200 FIXED
USER #1, SPACE 480,200
WINDOW #1 FULL ON
WINDOW #1 PLACE 160,200
SCREEN #2 TEXT 20 FIXED,22 FIXED
WINDOW #2 PLACE 0,0
WINDOW #2 FULL ON
WINDOW #2 OPEN
youstart=0
DRIVE "B"
DIM old$(500)
DIM grid$(2,2),x(2,2),y(2,2)
DIM possible(8)
x$=FIND$("MOVES.OXO")
IF x$<>"MOVES .OXO" THEN num=0:GOTO begin
PRINT #2,"Loading old games"
OPEN #5 INPUT x$
INPUT #5,numgames
FOR game=1 TO numgames
INPUT #5,old$(game)
NEXT game
CLOSE #5
LABEL begin
youstart=1:my$="o":your$="x"
INPUT #2,"Game or Learn Mode (G/L) ";a$
IF UPPER$(a$)="L" THEN GOTO learn
REM game mode main loop
REPEAT
GOSUB drawframe
GOSUB gameplay
INPUT #2,"Another Game ";a$
a$=UPPER$(a$)
UNTIL a$<>"Y"
GOSUB closedown
END
LABEL learn
samenum=0
REM Warning! 500 games take a few hours to play!
FOR game=1 TO 500
GOSUB drawframe
win=0
move$=""
REPEAT
which$="x"
my$="x":your$="o":GOSUB me
GOSUB check
IF win<>0 THEN GOTO exit
my$="o":your$="x":GOSUB me
GOSUB check
LABEL exit
UNTIL win<>0
GOSUB checkfile
NEXT game
GOSUB closedown
END
LABEL gameplay
win=0
move$=""
REPEAT
which$="x"
IF youstart THEN GOSUB you ELSE GOSUB me
GOSUB check
IF win<>0 THEN GOTO exitgame
IF youstart THEN GOSUB me ELSE GOSUB you
GOSUB check
LABEL exitgame
UNTIL win<>0
GOSUB checkfile
SWAP my$,your$
IF youstart=1 THEN youstart=0 ELSE youstart=1
RETURN
LABEL checkfile
same=0
FOR game=1 TO numgames
IF old$(game)=move$ THEN same=1:game=numgames
NEXT game
IF same THEN samenum=samenum+1
numgames=numgames+1
old$(numgames)=move$
REM it can be worth recording identical games
PRINT #2,"Total Games Recorded ";numgames
PRINT #2,"Same Games ";samenum
RETURN
LABEL drawframe
RESTORE drawframe
FOR grow=0 TO 2
FOR col=0 TO 2
READ grid$(grow,col),x(grow,col),y(grow,col)
NEXT col
NEXT grow
REM identifying letters and symbol co-ordinates
DATA a,120,140,b,200,140,c,280,140
DATA d,120,100,e,200,100,f,280,100
DATA g,120,60,h,200,60,i,280,60
CLS #1
LINE 80;120,320;120 WIDTH 5
LINE 80;80,320;80 WIDTH 5
LINE 160;40,160;160 WIDTH 5
LINE 240;40,240;160 WIDTH 5
FOR grow=0 TO 2
FOR col=0 TO 2
MOVE x(grow,col);y(grow,col)
PRINT FONT(2) POINTS(18) grid$(grow,col)
NEXT col
NEXT grow
RETURN
LABEL me
mymove=0
GOSUB lookback
IF mymove=0 THEN GOSUB random_move
GOSUB mark
RETURN
LABEL lookback
FOR mygo=0 TO 8:possible(mygo)=0:NEXT mygo
FOR oldgo=1 TO numgames
this$=old$(oldgo)
same=1:count=0
WHILE count<LEN(move$) AND same=1
count=count+1
IF MID$(move$,count,1)<>MID$(this$,count,1) THEN same=0
WEND
IF same=0 THEN GOTO nextold
nextmove$=MID$(this$,count+1,1)
mygo=ASC(nextmove$)-97
IF RIGHT$(this$,1)=my$ THEN possible(mygo)=possible(mygo)+1 ELSE IF RIGHT$(this$,1)=your$ THEN possible(mygo)=possible(mygo)-1
LABEL nextold
NEXT oldgo
high=-99:best=0
FOR mygo=0 TO 8
grow=mygo\3:col=mygo MOD 3:ingrid$=grid$(grow,col)
IF ingrid$="x" OR ingrid$="o"THEN GOTO nextposs
IF possible(mygo)>high THEN high=possible(mygo):best=mygo
LABEL nextposs
NEXT mygo
grow=best\3:col=best MOD 3:mymove=1
RETURN
REM not used in this version
LABEL random_move
REPEAT
try=0
REPEAT
grow=RND(3)-1
col=RND(3)-1
mygo=grow*3+col
try=try+1
UNTIL possible(mygo)=0 OR try>5
UNTIL grid$(grow,col)>="a" AND grid$(grow,col)<="i"
RETURN
LABEL you
REPEAT
movenum=0
WHILE movenum=0
INPUT #2,"Your move ";a$
movenum=INSTR("abcdefghi",LOWER$(a$))
WEND
movenum=movenum-1
grow=movenum\3
col=movenum MOD 3
UNTIL grid$(grow,col)>="a" AND grid$(grow,col)<="i"
GOSUB mark
RETURN
LABEL mark
move$=move$+grid$(grow,col)
grid$(grow,col)=which$
x=x(grow,col):y=y(grow,col)
MOVE x;y:PRINT POINTS(16);" "
IF which$="x" THEN LINE x-20;y-10,x+20;y+10 WIDTH 5:LINE x-20;y+10,x+20;y-10 WIDTH 5
IF which$="o" THEN ELLIPSE x;y,30,0.5 WIDTH 5
IF which$="x" THEN which$="o" ELSE which$="x"
RETURN
LABEL check
FOR grow=0 TO 2
IF grid$(grow,0)=grid$(grow,1) AND grid$(grow,0)=grid$(grow,2) THEN win$=grid$(grow,0):GOSUB winner:grow=2
NEXT grow
FOR col=0 TO 2
IF grid$(0,col)=grid$(1,col) AND grid$(0,col)=grid$(2,col) THEN win$=grid$(0,col):GOSUB winner:col=2
NEXT col
IF grid$(0,0)=grid$(1,1) AND grid$(0,0)=grid$(2,2) THEN win$=grid$(0,0):GOSUB winner
IF grid$(0,2)=grid$(1,1) AND grid$(0,2)=grid$(2,0) THEN win$=grid$(0,2):GOSUB winner
IF win=0 AND LEN(move$)=9 THEN win$="d":GOSUB winner
RETURN
LABEL winner
IF win$=your$ THEN PRINT #2;"You win" ELSE IF win$=my$ THEN PRINT #2;"I win" ELSE PRINT #2,"Draw"
win=1
IF win$="d" THEN win$="o":REM draw counts as victory for second player
move$=move$+win$
RETURN
LABEL closedown
OPEN #5 OUTPUT "MOVES.OXO"
PRINT #5,numgames
FOR game=1 TO numgames
PRINT #5,old$(game)
NEXT game
CLOSE #5
RETURN