home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AMOS PD CD
/
amospdcd.iso
/
sourcecode
/
various
/
othello.amos
/
othello.amosSourceCode
Wrap
AMOS Source Code
|
1993-01-08
|
7KB
|
296 lines
' OTHELLO by Gordon Hinds, Feb 1991
' Written using AMOS Basic 1.2
Dim BOARD(100),WEIGHTS(100),XYMOD(8)
Global BOARD(),WEIGHTS(),XYMOD()
Global C1,C2,AGAIN,RESTART,XM,YM,GAMEOVER,MEPASS,PLYER
Global BESTCOUNTER,COUNTER,NO_TURN,NUMTURN,YOUPASS,SCHU,SCCO
AGAIN=True
Repeat
INITIALISE : Rem Do all initialisation here
CLEARGRID : Rem make new grid area and clear useage table
PRESETARRAYS : Rem setup fixed tables
Repeat
M=Mouse Click
MZ=Mouse Zone
Until(M=1) and(MZ=3)
Flash Off
Ink 5 : Paint 173,172,0
Ink 13,5 : Text 170,172," EXIT PROGRAM "
' If computer is black it goes first
' C1 = Your colour, C2 = Computer's colour
If C2=1
COMPUTER
CHECKGAMEOVER
End If
RESTART=False
Repeat
Do
If Mouse Click<>1 Then Exit
XH=X Mouse : XM=X Screen(XH)
YH=Y Mouse : YM=Y Screen(YH)
MZ=Mouse Zone
If MZ<>0
On MZ Gosub MISS,MORE,QUIT,YOURGO
End If
Loop
Until RESTART=True
Until AGAIN=False
End
' MISS - Execute you clicking on MISS option
MISS:
PLYER=C1
FINDBESTMOVE
NUMTURN=0
If BESTCOUNTER=0
YOUPASS=1
NUMTURN=1
CHECKGAMEOVER
COMPUTER
CHECKGAMEOVER
Else
Bell 10 : Wait 20
End If
Return
' MORE - Execute click on RESTART
MORE:
RESTART=True
Return
' QUIT - Execute click on EXIT PROGRAM
QUIT:
RESTART=True
AGAIN=False
Return
' YOURGO - You clicked on a square within the play area
YOURGO:
YOUPASS=0
NUMTURN=0
'Calc square from XM and YM
COUNTER=(YM/15)*10+(XM/15)
NO_TURN=0
PLYER=C1
TURNCOUNTERS
If NUMTURN=0 : Rem invalid try
Bell 10 : Wait 20
Else
NO_TURN=1
TURNCOUNTERS
CHECKGAMEOVER
COMPUTER : Rem computer's go
CHECKGAMEOVER
End If
Return
Procedure INITIALISE
Screen Open 1,320,200,16,Lowres
Screen Hide 1
Curs Off
Colour 15,$FFF : Colour 1,$0 : Colour 2,$449
Set Rainbow 0,11,200,"(8,1,8)","(8,1,8)","(24,1,8)"
Rainbow 0,1,40,256
Cls 11 : Ink 15,11
Text 10,160," O T H E L L O "
Text 10,170," by Gordon Hinds "
Text 10,180," Feb 1991 "
Screen Show 1
' Choose player and computer colours randomly
Randomize Timer
I=Rnd(1)+1
If I=1
' You are black and computer is white
C1=1 : C2=15
Else
'You are white and computer is black
C1=15 : C2=1
End If
' Draw scores box
Ink 4 : Box 165,34 To 280,55
Draw 165,35 To 280,35 : Draw 223,35 To 223,55
Ink 11 : Paint 195,27,0
Ink C1 : Paint 170,47,0 : Paint 205,47,0
Ink C2 : Paint 263,47,0 : Paint 228,47,0
Ink 15,11 : Text 195,27," SCORES"
Ink 4,C1 : Text 170,47,"YOU"
Ink 4,C2 : Text 228,47,"ME"
Ink C2,C1 : Text 205,47," 0"
Ink C1,C2 : Text 263,47," 0"
' Draw boxes around requesters
Ink 15 : Box 165,135 To 290,160 : Draw 223,135 To 223,160
Ink 13 : Paint 177,145,0
Ink 15,13 : Text 177,145,"MISS" : Text 187,155,"GO"
Ink 4 : Paint 230,150,0
Ink 15,4 : Text 230,150,"RESTART" : Box 165,160 To 290,180
Ink 5 : Paint 173,172,0
Flash 3,"(00f,15)(fff,15)" : Ink 3,5 : Text 173,172,"CLICK TO BEGIN"
Ink 15 : Box 165,100 To 290,120
Ink 13 : Paint 170,110,0
' Define mouse click zones
Reserve Zone 4 : Reset Zone
Set Zone 1,165,135 To 223,160 : Rem 'Miss Go' click area
Set Zone 2,224,135 To 290,160 : Rem 'Restart' click area
Set Zone 3,165,160 To 290,180 : Rem 'Begin' click area
Set Zone 4,15,15 To 135,135 : Rem 'Grid' click area
GAMEOVER=0 : YOUPASS=0 : MEPASS=0
End Proc
Procedure CLEARGRID
Ink 5,2
Cls 2,15,15 To 135,135
For X=0 To 8
Draw 15+(X*15),15 To 15+(X*15),135
Draw 15,15+(X*15) To 135,15+(X*15)
Next X
For X=0 To 99
BOARD(X)=0
Next X
BOARD(44)=15 : BOARD(55)=15 : Rem white
BOARD(45)=1 : BOARD(54)=1 : Rem black
DISC[68,83,1] : DISC[83,68,1]
DISC[68,68,15] : DISC[83,83,15]
End Proc
Procedure PRESETARRAYS
Restore TESTDATA
For I=0 To 7 : Read A : XYMOD(I)=A : Next I
Restore WEIGHTDATA
For I=0 To 99 : Read A : WEIGHTS(I)=A : Next I
TESTDATA:
Data 11,10,9,1,-1,-9,-10,-11
WEIGHTDATA:
Data 0,0,0,0,0,0,0,0,0,0
Data 0,0,100,4,10,10,4,100,0,0
Data 0,100,126,50,69,69,50,126,100,0
Data 0,4,3,6,11,11,6,3,4,0
Data 0,10,69,11,0,0,11,69,10,0
Data 0,10,69,11,0,0,11,69,10,0
Data 0,4,3,6,11,11,6,3,4,0
Data 0,100,126,50,69,69,50,126,100,0
Data 0,0,100,4,10,10,4,100,0,0
Data 0,0,0,0,0,0,0,0,0,0
End Proc
Procedure DISC[X,Y,C]
Ink C
Paint X,Y,0
End Proc
Procedure COMPUTER
If GAMEOVER=0
MEPASS=0
PLYER=C2
FINDBESTMOVE
If BESTCOUNTER=0 : Rem Computer can't go
MEPASS=1
Ink 15,13 : Text 168,115,"PASS,YOUR TURN"
Wait 50
Ink 15,13 : Text 168,115," "
Else
COUNTER=BESTCOUNTER
NO_TURN=1
TURNCOUNTERS
End If
End If
End Proc
Procedure FINDBESTMOVE
NUMTURN=0
BESTCOUNTER=0
BEST=255 : Rem lowest weight value
NO_TURN=0
For COUNTER=11 To 89
For I=0 To 7
TURNCOUNTERS
If NUMTURN<>0
TEMP=WEIGHTS(COUNTER)
If TEMP<=BEST
If TEMP=BEST
RAND_DECIDE
End If
BEST=TEMP
BESTCOUNTER=COUNTER
End If
End If
Inc COUNTER
Next I
Inc COUNTER
Next COUNTER
End Proc
Procedure RAND_DECIDE
A=0 : Rem only dummy so far
End Proc
Procedure TURNCOUNTERS
NUMTURN=0
If BOARD(COUNTER)=0
POS=COUNTER
If NO_TURN<>0
TURNON[POS,PLYER]
End If
For J=0 To 7
OVER=0
FACTOR=XYMOD(J)
Repeat
Add POS,FACTOR
TEMP=BOARD(POS)
Exit If TEMP=0
If TEMP<>PLYER
Inc OVER
End If
Until TEMP=PLYER
If TEMP<>0
Add NUMTURN,OVER
If NO_TURN<>0
POS=COUNTER
For I=0 To OVER
Add POS,FACTOR
TURNON[POS,PLYER]
Next I
End If
End If
POS=COUNTER
Next J
End If
End Proc
Procedure TURNON[POS,PLYER]
BOARD(POS)=PLYER
X=7+(POS mod 10)*15
Y=7+(POS/10)*15
DISC[X,Y,PLYER]
End Proc
Procedure CHECKGAMEOVER
ADSCORES
SUM=SCHU+SCCO
If(SCHU=0) or(SCCO=0) or(SUM=64) or((YOUPASS<>0) and(MEPASS<>0))
GAMEOVER=1
If SCHU>SCCO
'Human has won
Ink 15,13 : Text 173,112,"YOU WIN "
For F=30 To 50
Bell F : Wait 3
Next F
Else
If SCHU<SCCO
'Computer has won
Ink 15,13 : Text 173,112,"I WIN "
For F=20 To 4 Step -1
Bell F : Wait 5
Next F
Else
Ink 15,13 : Text 173,112,"IT'S A DRAW "
For F=20 To 40
Bell F : Wait 5
Next F
For F=39 To 20 Step -1
Bell F : Wait 5
Next F
End If
End If
End If
End Proc
Procedure ADSCORES
SCHU=0 : SCCO=0
For J=11 To 89
TEMP=BOARD(J)
If TEMP<>0
If TEMP=C1
Inc SCHU
Else
Inc SCCO
End If
End If
Next J
Ink C2,C1 : Text 205,47,Right$("00"+Str$(SCHU),2)
Ink C1,C2 : Text 263,47,Right$("00"+Str$(SCCO),2)
End Proc