home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / sourcecode / various / othello.amos / othello.amosSourceCode
AMOS Source Code  |  1993-01-08  |  7KB  |  296 lines

  1. '  OTHELLO by Gordon Hinds, Feb 1991 
  2. '  Written using AMOS Basic 1.2  
  3. Dim BOARD(100),WEIGHTS(100),XYMOD(8)
  4. Global BOARD(),WEIGHTS(),XYMOD()
  5. Global C1,C2,AGAIN,RESTART,XM,YM,GAMEOVER,MEPASS,PLYER
  6. Global BESTCOUNTER,COUNTER,NO_TURN,NUMTURN,YOUPASS,SCHU,SCCO
  7. AGAIN=True
  8. Repeat 
  9.    INITIALISE : Rem Do all initialisation here 
  10.    CLEARGRID : Rem make new grid area and clear useage table
  11.    PRESETARRAYS : Rem setup fixed tables 
  12.    Repeat 
  13.       M=Mouse Click
  14.       MZ=Mouse Zone
  15.    Until(M=1) and(MZ=3)
  16.    Flash Off 
  17.    Ink 5 : Paint 173,172,0
  18.    Ink 13,5 : Text 170,172," EXIT PROGRAM  "
  19.    ' If computer is black it goes first   
  20.    ' C1 = Your colour, C2 = Computer's colour 
  21.    If C2=1
  22.       COMPUTER
  23.       CHECKGAMEOVER
  24.    End If 
  25.    RESTART=False
  26.    Repeat 
  27.       Do 
  28.          If Mouse Click<>1 Then Exit 
  29.          XH=X Mouse : XM=X Screen(XH)
  30.          YH=Y Mouse : YM=Y Screen(YH)
  31.          MZ=Mouse Zone
  32.          If MZ<>0
  33.             On MZ Gosub MISS,MORE,QUIT,YOURGO
  34.          End If 
  35.       Loop 
  36.    Until RESTART=True
  37. Until AGAIN=False
  38. End 
  39. ' MISS - Execute you clicking on MISS option 
  40. MISS:
  41. PLYER=C1
  42. FINDBESTMOVE
  43. NUMTURN=0
  44. If BESTCOUNTER=0
  45.    YOUPASS=1
  46.    NUMTURN=1
  47.    CHECKGAMEOVER
  48.    COMPUTER
  49.    CHECKGAMEOVER
  50. Else 
  51.    Bell 10 : Wait 20
  52. End If 
  53. Return 
  54. ' MORE - Execute click on RESTART
  55. MORE:
  56. RESTART=True
  57. Return 
  58. ' QUIT - Execute click on EXIT PROGRAM 
  59. QUIT:
  60. RESTART=True
  61. AGAIN=False
  62. Return 
  63. ' YOURGO - You clicked on a square within the play area
  64. YOURGO:
  65. YOUPASS=0
  66. NUMTURN=0
  67. 'Calc square from XM and YM
  68. COUNTER=(YM/15)*10+(XM/15)
  69. NO_TURN=0
  70. PLYER=C1
  71. TURNCOUNTERS
  72. If NUMTURN=0 : Rem invalid try
  73.    Bell 10 : Wait 20
  74. Else 
  75.    NO_TURN=1
  76.    TURNCOUNTERS
  77.    CHECKGAMEOVER
  78.    COMPUTER : Rem computer's go
  79.    CHECKGAMEOVER
  80. End If 
  81. Return 
  82. Procedure INITIALISE
  83.    Screen Open 1,320,200,16,Lowres
  84.    Screen Hide 1
  85.    Curs Off 
  86.    Colour 15,$FFF : Colour 1,$0 : Colour 2,$449
  87.    Set Rainbow 0,11,200,"(8,1,8)","(8,1,8)","(24,1,8)"
  88.    Rainbow 0,1,40,256
  89.    Cls 11 : Ink 15,11
  90.    Text 10,160,"  O T H E L L O  "
  91.    Text 10,170," by Gordon Hinds "
  92.    Text 10,180,"    Feb 1991     "
  93.    Screen Show 1
  94.    ' Choose player and computer colours randomly
  95.    Randomize Timer
  96.    I=Rnd(1)+1
  97.    If I=1
  98.       ' You are black and computer is white
  99.       C1=1 : C2=15
  100.    Else 
  101.       'You are white and computer is black 
  102.       C1=15 : C2=1
  103.    End If 
  104.    ' Draw scores box
  105.    Ink 4 : Box 165,34 To 280,55
  106.    Draw 165,35 To 280,35 : Draw 223,35 To 223,55
  107.    Ink 11 : Paint 195,27,0
  108.    Ink C1 : Paint 170,47,0 : Paint 205,47,0
  109.    Ink C2 : Paint 263,47,0 : Paint 228,47,0
  110.    Ink 15,11 : Text 195,27," SCORES"
  111.    Ink 4,C1 : Text 170,47,"YOU"
  112.    Ink 4,C2 : Text 228,47,"ME"
  113.    Ink C2,C1 : Text 205,47," 0"
  114.    Ink C1,C2 : Text 263,47," 0"
  115.    ' Draw boxes around requesters 
  116.    Ink 15 : Box 165,135 To 290,160 : Draw 223,135 To 223,160
  117.    Ink 13 : Paint 177,145,0
  118.    Ink 15,13 : Text 177,145,"MISS" : Text 187,155,"GO"
  119.    Ink 4 : Paint 230,150,0
  120.    Ink 15,4 : Text 230,150,"RESTART" : Box 165,160 To 290,180
  121.    Ink 5 : Paint 173,172,0
  122.    Flash 3,"(00f,15)(fff,15)" : Ink 3,5 : Text 173,172,"CLICK TO BEGIN"
  123.    Ink 15 : Box 165,100 To 290,120
  124.    Ink 13 : Paint 170,110,0
  125.    ' Define mouse click zones 
  126.    Reserve Zone 4 : Reset Zone 
  127.    Set Zone 1,165,135 To 223,160 : Rem 'Miss Go' click area 
  128.    Set Zone 2,224,135 To 290,160 : Rem 'Restart' click area 
  129.    Set Zone 3,165,160 To 290,180 : Rem 'Begin' click area 
  130.    Set Zone 4,15,15 To 135,135 : Rem 'Grid' click area
  131.    GAMEOVER=0 : YOUPASS=0 : MEPASS=0
  132. End Proc
  133. Procedure CLEARGRID
  134.    Ink 5,2
  135.    Cls 2,15,15 To 135,135
  136.    For X=0 To 8
  137.       Draw 15+(X*15),15 To 15+(X*15),135
  138.       Draw 15,15+(X*15) To 135,15+(X*15)
  139.    Next X
  140.    For X=0 To 99
  141.       BOARD(X)=0
  142.    Next X
  143.    BOARD(44)=15 : BOARD(55)=15 : Rem white
  144.    BOARD(45)=1 : BOARD(54)=1 : Rem black
  145.    DISC[68,83,1] : DISC[83,68,1]
  146.    DISC[68,68,15] : DISC[83,83,15]
  147. End Proc
  148. Procedure PRESETARRAYS
  149.    Restore TESTDATA
  150.    For I=0 To 7 : Read A : XYMOD(I)=A : Next I
  151.    Restore WEIGHTDATA
  152.    For I=0 To 99 : Read A : WEIGHTS(I)=A : Next I
  153.    TESTDATA:
  154.    Data 11,10,9,1,-1,-9,-10,-11
  155.    WEIGHTDATA:
  156.    Data 0,0,0,0,0,0,0,0,0,0
  157.    Data 0,0,100,4,10,10,4,100,0,0
  158.    Data 0,100,126,50,69,69,50,126,100,0
  159.    Data 0,4,3,6,11,11,6,3,4,0
  160.    Data 0,10,69,11,0,0,11,69,10,0
  161.    Data 0,10,69,11,0,0,11,69,10,0
  162.    Data 0,4,3,6,11,11,6,3,4,0
  163.    Data 0,100,126,50,69,69,50,126,100,0
  164.    Data 0,0,100,4,10,10,4,100,0,0
  165.    Data 0,0,0,0,0,0,0,0,0,0
  166. End Proc
  167. Procedure DISC[X,Y,C]
  168.    Ink C
  169.    Paint X,Y,0
  170. End Proc
  171. Procedure COMPUTER
  172.    If GAMEOVER=0
  173.       MEPASS=0
  174.       PLYER=C2
  175.       FINDBESTMOVE
  176.       If BESTCOUNTER=0 : Rem Computer can't go
  177.          MEPASS=1
  178.          Ink 15,13 : Text 168,115,"PASS,YOUR TURN"
  179.          Wait 50
  180.          Ink 15,13 : Text 168,115,"              "
  181.       Else 
  182.          COUNTER=BESTCOUNTER
  183.          NO_TURN=1
  184.          TURNCOUNTERS
  185.       End If 
  186.    End If 
  187. End Proc
  188. Procedure FINDBESTMOVE
  189.    NUMTURN=0
  190.    BESTCOUNTER=0
  191.    BEST=255 : Rem lowest weight value  
  192.    NO_TURN=0
  193.    For COUNTER=11 To 89
  194.       For I=0 To 7
  195.          TURNCOUNTERS
  196.          If NUMTURN<>0
  197.             TEMP=WEIGHTS(COUNTER)
  198.             If TEMP<=BEST
  199.                If TEMP=BEST
  200.                   RAND_DECIDE
  201.                End If 
  202.                BEST=TEMP
  203.                BESTCOUNTER=COUNTER
  204.             End If 
  205.          End If 
  206.          Inc COUNTER
  207.       Next I
  208.       Inc COUNTER
  209.    Next COUNTER
  210. End Proc
  211. Procedure RAND_DECIDE
  212.    A=0 : Rem only dummy so far
  213. End Proc
  214. Procedure TURNCOUNTERS
  215.    NUMTURN=0
  216.    If BOARD(COUNTER)=0
  217.       POS=COUNTER
  218.       If NO_TURN<>0
  219.          TURNON[POS,PLYER]
  220.       End If 
  221.       For J=0 To 7
  222.          OVER=0
  223.          FACTOR=XYMOD(J)
  224.          Repeat 
  225.             Add POS,FACTOR
  226.             TEMP=BOARD(POS)
  227.             Exit If TEMP=0
  228.             If TEMP<>PLYER
  229.                Inc OVER
  230.             End If 
  231.          Until TEMP=PLYER
  232.          If TEMP<>0
  233.             Add NUMTURN,OVER
  234.             If NO_TURN<>0
  235.                POS=COUNTER
  236.                For I=0 To OVER
  237.                   Add POS,FACTOR
  238.                   TURNON[POS,PLYER]
  239.                Next I
  240.             End If 
  241.          End If 
  242.          POS=COUNTER
  243.       Next J
  244.    End If 
  245. End Proc
  246. Procedure TURNON[POS,PLYER]
  247.    BOARD(POS)=PLYER
  248.    X=7+(POS mod 10)*15
  249.    Y=7+(POS/10)*15
  250.    DISC[X,Y,PLYER]
  251. End Proc
  252. Procedure CHECKGAMEOVER
  253.    ADSCORES
  254.    SUM=SCHU+SCCO
  255.    If(SCHU=0) or(SCCO=0) or(SUM=64) or((YOUPASS<>0) and(MEPASS<>0))
  256.       GAMEOVER=1
  257.       If SCHU>SCCO
  258.          'Human has won 
  259.          Ink 15,13 : Text 173,112,"YOU WIN         "
  260.          For F=30 To 50
  261.             Bell F : Wait 3
  262.          Next F
  263.       Else 
  264.          If SCHU<SCCO
  265.             'Computer has won            
  266.             Ink 15,13 : Text 173,112,"I WIN        "
  267.             For F=20 To 4 Step -1
  268.                Bell F : Wait 5
  269.             Next F
  270.          Else 
  271.             Ink 15,13 : Text 173,112,"IT'S A DRAW  "
  272.             For F=20 To 40
  273.                Bell F : Wait 5
  274.             Next F
  275.             For F=39 To 20 Step -1
  276.                Bell F : Wait 5
  277.             Next F
  278.          End If 
  279.       End If 
  280.    End If 
  281. End Proc
  282. Procedure ADSCORES
  283.    SCHU=0 : SCCO=0
  284.    For J=11 To 89
  285.       TEMP=BOARD(J)
  286.       If TEMP<>0
  287.          If TEMP=C1
  288.             Inc SCHU
  289.          Else 
  290.             Inc SCCO
  291.          End If 
  292.       End If 
  293.    Next J
  294.    Ink C2,C1 : Text 205,47,Right$("00"+Str$(SCHU),2)
  295.    Ink C1,C2 : Text 263,47,Right$("00"+Str$(SCCO),2)
  296. End Proc