home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 176-200 / apd184 / towers_of_hanoi.bak / towers_of_hanoi.amosSourceCode < prev   
AMOS Source Code  |  1978-01-20  |  7KB  |  273 lines

  1. Dim STACKS(3,10),STACKP(3,2),BX(3,9),BY(3,9)
  2. Global STACKS(),STACKP(),BX(),BY(),Z1,Z2,B_ID,INDEX1,COMPLETE,QUIT,FINISHED
  3. Global MOVES,M_ON
  4. '
  5. GENERAL_SETUP
  6. '
  7. Rem **** MAIN LOOP ****
  8. Repeat 
  9.    INITIALISE
  10.    DISPLAY_SETUP
  11.    Rem *** SET GAME START VARIABLES *** 
  12.    COMPLETE=False
  13.    FINISHED=False
  14.    MOVES=0
  15.    Rem *** LOOP FOR MOVES *** 
  16.    Repeat 
  17.       STRT_ZONE
  18.       Rem *** WAIT NEEDED AS AMOS IS TO FAST! ***
  19.       Wait 10
  20.       DEST_ZONE
  21.       Rem *** WAIT NEEDED AS AMOS IS TO FAST! ***
  22.       Wait 10
  23.       MOVES
  24.       CHECK_COMPLETE
  25.    Until COMPLETE or QUIT
  26.    _CLEAR_SCREEN
  27.    ANOTHER_GAME
  28. Until FINISHED
  29. Music Off 
  30. System 
  31. '
  32. Procedure GENERAL_SETUP
  33.    Rem *** SETS UP SYSTEM VARIABLES THAT ARE NEEDED ONLY ONCE *** 
  34.    Screen Open 0,320,256,32,Lowres
  35.    Wait Vbl 
  36.    Limit Mouse 
  37.    Curs Off 
  38.    Flash Off 
  39.    Unpack 6 To 0
  40.    Double Buffer 
  41.    Wait Vbl 
  42.    M_ON=True
  43.    Music 1
  44. End Proc
  45. Procedure INITIALISE
  46.    '*** CLEAR THE STACKS ***  
  47.    For J=1 To 3
  48.       For K=1 To 10
  49.          STACKS(J,K)=0
  50.       Next K
  51.    Next J
  52.    '*** SET STACK (1) START POSITIONS *** 
  53.    For J=1 To 9
  54.       STACKS(1,J)=J
  55.    Next J
  56.    '*** SET STACK POINTERS ***' 
  57.    STACKP(1,1)=1
  58.    STACKP(1,2)=1
  59.    STACKP(2,1)=0
  60.    STACKP(2,2)=10
  61.    STACKP(3,1)=0
  62.    STACKP(3,2)=10
  63.    '*** SETUP BOB X/Y STACK CO-ORDINATES ***
  64.    Restore X
  65.    For J=1 To 3
  66.       Read X
  67.       For K=9 To 1 Step -1
  68.          BX(J,K)=X
  69.       Next K
  70.    Next J
  71.    For J=1 To 3
  72.       Restore Y
  73.       For K=9 To 1 Step -1
  74.          Read Y
  75.          BY(J,K)=Y
  76.       Next K
  77.    Next J
  78.    X:
  79.    Data 59,159,259
  80.    Y:
  81.    Data 207,192,177,162,147,132,117,102,87
  82. End Proc
  83. Procedure DISPLAY_SETUP
  84.    '*** POSITION PIECES *** 
  85.    For J=1 To 9
  86.       Bob Off J
  87.    Next J
  88.    For J=9 To 1 Step -1
  89.       Bob J,BX(1,J),BY(1,J),J
  90.       If Not M_ON Then Shoot 
  91.       Wait 10
  92.    Next J
  93.    '*** CLEAR WINDOWS *** 
  94.    Ink 3,3,3
  95.    Bar 269,234 To 309,243
  96.    '*** SET SCREEN ZONES ***
  97.    Reserve Zone 5
  98.    Set Zone 1,18,81 To 102,214
  99.    Set Zone 2,118,81 To 202,214
  100.    Set Zone 3,218,81 To 302,214
  101.    Set Zone 4,6,19 To 40,29
  102.    Set Zone 5,277,19 To 311,29
  103. End Proc
  104. Procedure MOVES
  105.    Rem *** DISPLAYES MOVES TAKEN ***
  106.    Inc MOVES
  107.    Ink 6,3,3
  108.    Text 270,242,Mid$((Str$(MOVES)),2,(Len(Str$(MOVES))-1))
  109. End Proc
  110. Procedure STRT_ZONE
  111.    Rem *** CHECKS FOR VALID START SELECTION AND MUSIC ON/OFF AND QUIT *** 
  112.    GOOD_START=False
  113.    QUIT=False
  114.    Repeat 
  115.       Z1=Mouse Zone
  116.       If Z1>0 and Mouse Key
  117.          If Z1=5 or Z1=4
  118.             If Z1=5
  119.                If Not M_ON
  120.                   Bell 30
  121.                End If 
  122.                QUIT=True
  123.             Else 
  124.                If Not M_ON
  125.                   Music 1
  126.                Else 
  127.                   Music Off 
  128.                End If 
  129.                M_ON= Not M_ON
  130.             End If 
  131.             While Mouse Key
  132.             Wend 
  133.          Else 
  134.             B_ID=0
  135.             INDEX1=STACKP(Z1,2)
  136.             If INDEX1=0
  137.                '**** EMPTY STACK **** 
  138.                If Not M_ON
  139.                   Bell 30
  140.                   Wait 5
  141.                   Bell 40
  142.                End If 
  143.             Else 
  144.                If Not M_ON
  145.                   Bell 
  146.                End If 
  147.                B_ID=STACKP(Z1,1)
  148.                INDEX1=STACKP(Z1,2)
  149.                GOOD_START=True
  150.             End If 
  151.          End If 
  152.       End If 
  153.    Until GOOD_START or QUIT=True
  154. End Proc
  155. Procedure DEST_ZONE
  156.    Rem *** CHECKS FOR VALID DESTINATION MOVE AND MUSIC ON/OFF AND QUIT ***  
  157.    GOOD_DEST=False
  158.    Repeat 
  159.       If QUIT=False
  160.          Bob B_ID,X Screen(X Mouse),Y Screen(Y Mouse),B_ID
  161.          Z2=Mouse Zone
  162.          If Z2>0 and Mouse Key
  163.             If Z2=5 or Z2=4
  164.                If Z2=5
  165.                   QUIT=True
  166.                Else 
  167.                   If Not M_ON
  168.                      Music 1
  169.                   Else 
  170.                      Music Off 
  171.                   End If 
  172.                   M_ON= Not M_ON
  173.                End If 
  174.                While Mouse Key
  175.                Wend 
  176.             Else 
  177.                If Z2=Z1
  178.                   If Not M_ON
  179.                      Shoot 
  180.                   End If 
  181.                   Bob B_ID,BX(Z1,INDEX1),BY(Z1,INDEX1),B_ID
  182.                   GOOD_DEST=True
  183.                Else 
  184.                   If STACKP(Z2,1)<B_ID and STACKP(Z2,1)<>0
  185.                      '*** DEST BOB IS SMALLER *** 
  186.                      If Not M_ON
  187.                         Bell 30
  188.                         Wait 5
  189.                         Bell 40
  190.                      End If 
  191.                   Else 
  192.                      If Not M_ON
  193.                         Shoot 
  194.                      End If 
  195.                      '
  196.                      '*** UPDATE DEST STACK POINTERS **** 
  197.                      STACKP(Z2,1)=B_ID
  198.                      STACKP(Z2,2)=STACKP(Z2,2)-1
  199.                      '
  200.                      '*** UPDATE DEST STACK *** 
  201.                      STACKS(Z2,STACKP(Z2,2))=B_ID
  202.                      '
  203.                      '*** UPDATE SOURCE STACK *** 
  204.                      STACKS(Z1,INDEX1)=0
  205.                      '
  206.                      '*** UPDATE SOURCE POINTERS ***
  207.                      STACKP(Z1,1)=STACKS(Z1,INDEX1+1)
  208.                      STACKP(Z1,2)=STACKP(Z1,2)+1
  209.                      '
  210.                      '*** PLACE BOB IN NEW POSTION **** 
  211.                      Bob B_ID,BX(Z2,STACKP(Z2,2)),BY(Z2,STACKP(Z2,2)),B_ID
  212.                      '
  213.                      GOOD_DEST=True
  214.                   End If 
  215.                End If 
  216.             End If 
  217.          End If 
  218.       End If 
  219.    Until GOOD_DEST or QUIT
  220. End Proc
  221. Procedure CHECK_COMPLETE
  222.    Rem *** SCAN STACKS TO SEE IF TOWER COMPLETED ***
  223.    For J=2 To 3
  224.       SUM=0
  225.       For K=1 To 9
  226.          SUM=STACKS(J,K)
  227.       Next K
  228.       If SUM=45
  229.          STACK=J
  230.          COMPLETE=True
  231.       End If 
  232.    Next J
  233. End Proc
  234. Procedure _CLEAR_SCREEN
  235.    '*** Remove counters *** 
  236.    For Q=1 To 9
  237.       If Not M_ON
  238.          Shoot 
  239.       End If 
  240.       Bob Off Q
  241.       Wait 5
  242.    Next Q
  243.    Rem *** DISPLAY WELL DONE ***
  244.    If COMPLETE
  245.       Bob 11,74,52,20
  246.    Else 
  247.       Rem *** DISPLAY GAME OVER ***
  248.       If QUIT
  249.          Bob 11,71,57,21
  250.       End If 
  251.    End If 
  252. End Proc
  253. Procedure ANOTHER_GAME
  254.    Rem *** DISPLAY ANOTHER GAME PROMPT AND GET REPLY ***
  255.    For J=1 To 3
  256.       For K=1 To 10
  257.          Bob K,161,185,K+9
  258.          Wait 2
  259.          Bob Off K
  260.       Next K
  261.    Next J
  262.    Bob 1,161,185,10
  263.    A$=""
  264.    While A$=""
  265.       A$=Inkey$
  266.       A$=Upper$(A$)
  267.       FINISHED=True
  268.       If A$="Y"
  269.          FINISHED=False
  270.          Bob Off 11
  271.       End If 
  272.    Wend 
  273. End Proc