home *** CD-ROM | disk | FTP | other *** search
/ AMIGA PD 1 / AMIGA-PD-1.iso / Programme_zum_Heft / Programmieren / Kurztests / ACE / Prgs / games / TTT.lha / TTT.b < prev    next >
Text File  |  1994-12-23  |  6KB  |  307 lines

  1. {*
  2. ** Tic-Tac-Toe
  3. **
  4. ** Version 1.0: keyboard-driven
  5. ** Version 2.0: gadget-driven
  6. **
  7. ** Author: David J Benn
  8. **   Date: 19th,20th,23rd December 1994
  9. **
  10. ** Possible enhancements: scoring; font-sensitivity.
  11. *}
  12.  
  13. DIM voice%(8)
  14.  
  15. FOR i=0 TO 8
  16.   READ voice%(i)
  17. NEXT
  18.  
  19. DATA 80,0,160,0,22900,64,10,1,0
  20.  
  21. '...constants
  22. CONST true=-1, false=0
  23. CONST user=1
  24. CONST comp=2
  25. CONST empty=0
  26. CONST offset=50
  27.  
  28. '..variables
  29. LONGINT win, moves, tn, UserWantsToPlay
  30. tn=comp
  31. UserWantsToPlay=true
  32.  
  33. DIM grid(9), grid_x1(9), grid_x2(9), grid_y1(9), grid_y2(9)
  34.  
  35. WINDOW 1,"TTT v2.0",(offset,offset)-(offset+138,offset+152),14
  36.  
  37. FOR n=1 TO 9
  38.   READ grid_x1(n),grid_y1(n), grid_x2(n),grid_y2(n)
  39.   GADGET n,ON," ",(grid_x1(n),grid_y1(n))-(grid_x2(n),grid_y2(n)),BUTTON,1
  40. NEXT
  41.  
  42. READ x1,y1, x2,y2
  43. GADGET 10,ON,"Again?",(x1,y1)-(x2,y2),BUTTON,1
  44.  
  45. '..First row
  46. DATA 10,10, 40,30
  47. DATA 50,10, 80,30
  48. DATA 90,10, 120,30
  49.  
  50. '..Second row
  51. DATA 10,40, 40,60
  52. DATA 50,40, 80,60
  53. DATA 90,40, 120,60
  54.  
  55. '..Third row
  56. DATA 10,70, 40,90
  57. DATA 50,70, 80,90
  58. DATA 90,70, 120,90
  59.  
  60. '..Again? button
  61. DATA 35,110, 95,130
  62.  
  63. '...main
  64. RANDOMIZE TIMER : dummy=RND
  65.  
  66. WHILE UserWantsToPlay
  67.   win=false
  68.   moves=0
  69.  
  70.   GOSUB clear.grid
  71.  
  72.   WHILE NOT win AND moves<9
  73.      '...user
  74.      IF tn=user AND NOT win THEN
  75.        GOSUB get.user.move
  76.        IF moves>2 THEN GOSUB win.check
  77.        tn=comp
  78.      END IF
  79.  
  80.      '...computer
  81.      IF tn=comp AND NOT win AND moves<9 THEN
  82.        GOSUB make.a.move
  83.        IF moves>2 THEN GOSUB win.check
  84.        tn=user
  85.      END IF
  86.   WEND
  87.  
  88.   IF NOT win THEN
  89.       SAY TRANSLATE$("Game tied."),voice%
  90.       MSGBOX "Game tied.","Continue"
  91.       GOSUB another.game
  92.    ELSE
  93.       '...swap turns after a tie
  94.       IF tn=user THEN tn=comp ELSE tn=user
  95.    END IF
  96. WEND
  97.  
  98. quit:
  99.   FOR n=1 TO 10 : GADGET CLOSE n : NEXT
  100.   WINDOW CLOSE 1
  101.   STOP
  102.  
  103. clear.grid:
  104.   '..Close and reopen grid buttons
  105.   FOR n=1 TO 9
  106.    grid(n)=empty
  107.    GADGET CLOSE n
  108.    GADGET n,ON," ",(grid_x1(n),grid_y1(n))-(grid_x2(n),grid_y2(n)),BUTTON,1
  109.   NEXT
  110.   '..Deactivate Again? button
  111.   GADGET 10,OFF
  112. RETURN
  113.  
  114. get.user.move:
  115.   GADGET WAIT 0
  116.   theGad = GADGET(1)
  117.   IF theGad = 256 THEN quit
  118.   po = theGad
  119.   grid(po)=user
  120.   GADGET CLOSE po
  121.   GADGET po,OFF,"X",(grid_x1(po),grid_y1(po))-(grid_x2(po),grid_y2(po)),BUTTON,1
  122.   ++moves
  123. RETURN
  124.  
  125. make.a.move:
  126.    po=-1
  127.    player=2
  128.  
  129.    WHILE player>=1
  130.  
  131.      IF player=2 THEN n=comp ELSE n=user
  132.  
  133.      '...search diagonals first
  134.      IF po=-1 THEN
  135.          IF (grid(1)=n) AND (grid(5)=n) AND (grid(9)=empty) THEN
  136.         po=9
  137.      ELSE
  138.                 IF (grid(1)=n) AND (grid(5)=empty) AND (grid(9)=n) THEN
  139.            po=5
  140.          ELSE
  141.                     IF (grid(1)=empty) AND (grid(5)=n) AND (grid(9)=n) THEN po=1
  142.          END IF
  143.      END IF
  144.     END IF
  145.  
  146.      IF po=-1 THEN
  147.           IF (grid(3)=n) AND (grid(5)=n) AND (grid(7)=empty) THEN
  148.          po=7
  149.           ELSE
  150.               IF (grid(3)=n) AND (grid(5)=empty) AND (grid(7)=n) THEN
  151.                  po=5
  152.               ELSE
  153.                   IF (grid(3)=empty) AND (grid(5)=n) AND (grid(7)=n) THEN po=3
  154.           END IF
  155.       END IF
  156.      END IF
  157.  
  158.      '...search rows
  159.      IF po=-1 THEN
  160.        i=1
  161.        WHILE i<=7
  162.            IF (grid(i)=n) AND (grid(i+1)=n) AND (grid(i+2)=empty) THEN
  163.             po=i+2
  164.            ELSE
  165.             IF (grid(i)=n) AND (grid(i+1)=empty) AND (grid(i+2)=n) THEN
  166.              po=i+1
  167.             ELSE
  168.              IF (grid(i)=empty) AND (grid(i+1)=n) AND (grid(i+2)=n) THEN po=i
  169.             END IF
  170.            END IF
  171.            i=i+3
  172.        WEND
  173.      END IF
  174.  
  175.      '...search columns
  176.      IF po=-1 THEN
  177.        FOR i=1 TO 3
  178.            IF (grid(i)=n) AND (grid(i+3)=n) AND (grid(i+6)=empty) THEN
  179.          po=i+6
  180.            ELSE
  181.              IF (grid(i)=n) AND (grid(i+3)=empty) AND (grid(i+6)=n) THEN
  182.                po=i+3
  183.              ELSE
  184.                IF (grid(i)=empty) AND (grid(i+3)=n) AND (grid(i+6)=n) THEN po=i
  185.              END IF
  186.            END IF
  187.        NEXT
  188.      END IF
  189.  
  190.      --player
  191.    WEND
  192.  
  193.    '...make a random selection
  194.    IF po=-1 THEN
  195.       free.pos=false
  196.       WHILE NOT free.pos
  197.         r=INT(RND*9)+1
  198.         IF grid(r)=empty THEN
  199.            po=r
  200.            free.pos=true
  201.         END IF
  202.       WEND
  203.    END IF
  204.  
  205.    '...claim grid position
  206.    IF po <> -1 THEN
  207.      grid(po)=comp
  208.      GADGET CLOSE po
  209.      GADGET po,OFF,"O",(grid_x1(po),grid_y1(po))-(grid_x2(po),grid_y2(po)),BUTTON,1
  210.    END IF
  211.  
  212.    ++moves
  213. RETURN
  214.  
  215. who.won:
  216.      IF tn=user THEN
  217.     SAY TRANSLATE$("You won!"),voice%
  218.     MSGBOX "You won!","Continue"
  219.      ELSE
  220.     SAY TRANSLATE$("I won!"),voice%
  221.     MSGBOX "I won!","Continue"
  222.      END IF
  223.      GOSUB another.game
  224. RETURN
  225.  
  226. another.game:
  227.   UserWantsToPlay=false
  228.   GADGET 10,ON
  229.   REPEAT
  230.    GADGET WAIT 0
  231.    theGad = GADGET(1)
  232.    IF theGad = 256 THEN quit
  233.    IF theGad = 10 THEN UserWantsToPlay=true
  234.   UNTIL theGad = 256 OR theGad = 10
  235. RETURN
  236.  
  237. win.check:
  238.    win=0
  239.    player=1
  240.  
  241.    WHILE player<=2 AND NOT win
  242.  
  243.      IF player=1 THEN token=user ELSE token=comp
  244.  
  245.      '...rows
  246.      i=1
  247.      WHILE i<=7 AND NOT win
  248.           IF (grid(i)=token) AND (grid(i+1)=token) AND (grid(i+2)=token) THEN
  249.              win=true
  250.           END IF
  251.           IF (grid(i)=token) AND (grid(i+1)=token) AND (grid(i+2)=token) THEN
  252.              win=true
  253.           END IF
  254.           IF (grid(i)=token) AND (grid(i+1)=token) AND (grid(i+2)=token) THEN
  255.              win=true
  256.       END IF
  257.           i=i+3
  258.      WEND
  259.  
  260.      '...columns
  261.      IF NOT win THEN
  262.       FOR i=1 TO 3
  263.           IF (grid(i)=token) AND (grid(i+3)=token) AND (grid(i+6)=token) THEN
  264.              win=true
  265.       END IF
  266.           IF (grid(i)=token) AND (grid(i+3)=token) AND (grid(i+6)=token) THEN
  267.          win=true
  268.       END IF
  269.           IF (grid(i)=token) AND (grid(i+3)=token) AND (grid(i+6)=token) THEN
  270.              win=true
  271.       END IF
  272.      NEXT
  273.     END IF
  274.  
  275.      '...diagonals
  276.      IF NOT win THEN
  277.           IF (grid(1)=token) AND (grid(5)=token) AND (grid(9)=token) THEN
  278.          win=true
  279.       END IF
  280.           IF (grid(1)=token) AND (grid(5)=token) AND (grid(9)=token) THEN
  281.              win=true
  282.       END IF
  283.           IF (grid(1)=token) AND (grid(5)=token) AND (grid(9)=token) THEN
  284.              win=true
  285.       END IF
  286.      END IF
  287.  
  288.      IF NOT win THEN
  289.           IF (grid(3)=token) AND (grid(5)=token) AND (grid(7)=token) THEN
  290.              win=true
  291.       END IF
  292.           IF (grid(3)=token) AND (grid(5)=token) AND (grid(7)=token) THEN
  293.              win=true
  294.           END IF
  295.           IF (grid(3)=token) AND (grid(5)=token) AND (grid(7)=token) THEN
  296.          win=true
  297.       END IF
  298.      END IF
  299.  
  300.      ++player
  301.  
  302.    WEND
  303.  
  304.    IF win THEN GOSUB who.won
  305.  
  306. RETURN
  307.