home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progbas / animals.arj / ANIMALS.BAS next >
BASIC Source File  |  1991-09-29  |  12KB  |  436 lines

  1. ' Program Name : ANIMALS
  2. ' Author       : Bill Buckels
  3. ' Date         : September 28, 1991
  4. ' Purpose      : A rewrite of the APPLESOFT ANIMALS PROGRAM
  5. '                in QuickBASIC 4.5
  6.  
  7. 'This is a classic program and really doesn't deserve to die.
  8. 'It wasn't a great game but is definitely reminiscent of a
  9. 'period of computing history that had its own ambience and charm.
  10. 'I hope that my rewrite hasn't mutated it beyond all recognition.
  11.  
  12. DIM MASK(8)                    ' a logical bitmask array
  13.  
  14. CONST FONTSEG = &HFFA6         ' romfont segment
  15. CONST ROMFONT = &HE            ' romfont offset
  16. CONST WHITESPACE = 32
  17. CONST MONOCHROME = &HB000      ' address for the monochrome adapter
  18. CONST CGA = &HB800             ' address for the cga
  19. CONST BLACK = 0                ' color constants
  20. CONST BLUE = 1
  21. CONST RED = 4
  22. CONST WHITE = 7
  23. CONST LCYAN = 11
  24. CONST BWHITE = 15
  25.  
  26.  
  27. COMMON SHARED MASK(), SCREENSEG
  28. DECLARE SUB FATFRAME (INSTRING$, FGR%, BGR%)
  29. DECLARE SUB BIGLETTERS (INSTRING$, ROW%, FGR%, BGR%)
  30. DECLARE SUB MIDPRINT (TXT$, RW%, CL%, FG%, BG%)
  31.  
  32. 'CHECK FOR MONOCHROME DISPLAY
  33.  
  34.  
  35. DEF SEG = MONOCHROME                  'clear the screen and
  36. CLS                                   'try to read a whitespace
  37. A = PEEK(0)                           'if it's not there assume
  38. IF NOT A = WHITESPACE THEN
  39.                 SCREENSEG = CGA       'we have a color adapter
  40. ELSE
  41.      PRINT "Sorry... CGA Required."
  42.      SYSTEM
  43. END IF
  44. DEF SEG
  45.  
  46. MASK(0) = &H80
  47. MASK(1) = &H40
  48. MASK(2) = &H20
  49. MASK(3) = &H10
  50. MASK(4) = &H8
  51. MASK(5) = &H4
  52. MASK(6) = &H2
  53. MASK(7) = &H1
  54. QT$ = CHR$(34)
  55.  
  56.  
  57. COLOR BWHITE, BLUE
  58. CLS
  59.  
  60. RESTORE TITLEDATA
  61.         READ TXT$
  62.         FATFRAME TXT$, WHITE, RED
  63.         READ TXT$
  64.         BIGLETTERS TXT$, 2, RED, WHITE
  65.         ROW% = 11
  66.         COL% = 39
  67.         READ TXT$
  68.         WHILE NOT TXT$ = "END OF TITLE"
  69.               MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
  70.               ROW% = ROW% + 1
  71.               READ TXT$
  72.         WEND
  73.  
  74. RESTORE SONGDATA
  75.         READ TXT$
  76.         WHILE NOT TXT$ = "END OF SONG"
  77.               PLAY TXT$
  78.               READ TXT$
  79.         WEND
  80.  
  81.   '=======================| INITIALIZATION SECTION |======================
  82.  
  83.   ON ERROR GOTO ERRORHANDLER
  84.   WIDTH 40
  85.   COLOR BWHITE, BLUE
  86.   CLS
  87.   MIDPRINT "DO YOU WANT INSTRUCTIONS ?(Y/N)", 12, 21, BWHITE, BLUE
  88.  
  89.   DONE = 0
  90.   WHILE DONE = 0
  91.     A$ = UCASE$(INPUT$(1))
  92.     IF A$ = "Y" OR A$ = "N" OR A$ = CHR$(27) THEN DONE = 1
  93.   WEND
  94.   CLS
  95.  
  96.   IF A$ = CHR$(27) THEN
  97.                   COLOR WHITE, BLACK
  98.                   WIDTH 80
  99.                   PRINT "Have a Nice Dos!"
  100.                   SYSTEM
  101.   END IF
  102.  
  103.  
  104.  
  105.   IF A$ = "N" THEN
  106.               ROW% = 12
  107.               COL% = 20
  108.   ELSE
  109.         RESTORE INSTRUCTIONS
  110.         ROW% = 6
  111.         COL% = 20
  112.         READ TXT$
  113.         WHILE NOT TXT$ = "END OF INSTRUCTIONS"
  114.               MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  115.               ROW% = ROW% + 1
  116.               READ TXT$
  117.         WEND
  118.   END IF
  119.  
  120.   
  121.   MIDPRINT "DO YOU WANT TO DELETE OLD GAMES?", ROW%, COL%, BWHITE, BLUE
  122.   ROW% = ROW% + 1
  123.   MIDPRINT "ERASE ALL PREVIOUS ANIMALS (Y/N)", ROW%, COL%, BWHITE, BLUE
  124.   DONE = 0
  125.   WHILE DONE = 0
  126.     A$ = UCASE$(INPUT$(1))
  127.     IF A$ = "Y" OR A$ = "N" THEN DONE = 1
  128.   WEND
  129.  
  130.   IF A$ = "Y" THEN
  131.      OPEN "ANIMALS.LST" FOR OUTPUT AS #1
  132.      PRINT #1, "DOES IT LIVE IN THE WATER"  'question
  133.      PRINT #1, "Y"                          'response
  134.      PRINT #1, "FROG"                       'match
  135.      CLOSE #1
  136.   END IF
  137.  
  138.  
  139. DO
  140. START:
  141.  
  142.   ON ERROR GOTO ERRORFILER
  143.   OPEN "ANIMALS.LST" FOR INPUT AS #1
  144.   ON ERROR GOTO ERRORHANDLER
  145.  
  146.   '======================| PLAY THE GAME |=====================
  147.  
  148.  
  149.   CNT = 1
  150.  
  151.   WHILE NOT EOF(1)
  152.     '================| step 1. get a question for a yes or no answer
  153.     '================|         and the answer and the guess
  154.     LINE INPUT #1, QUESTION$
  155.     LINE INPUT #1, YESNO$
  156.     LINE INPUT #1, ANI$
  157.     CNT = CNT + 1
  158.  
  159.     '================| step 2. ask the question. get the response.
  160.     CLS
  161.     ROW% = 12
  162.     TXT$ = QUESTION$ + " ?"
  163.     MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  164.     DONE = 0
  165.     WHILE DONE = 0
  166.       A$ = UCASE$(INPUT$(1))
  167.       IF A$ = "Y" OR A$ = "N" THEN DONE = 1
  168.     WEND
  169.  
  170.     IF A$ = YESNO$ THEN
  171.  
  172.         '====| step 3. if it matches the measured response make a guess
  173.         COLOR BWHITE, BLUE
  174.         PRINT A$
  175.         ROW% = ROW% + 1
  176.         TXT$ = "ARE YOU THINKING OF A " + ANI$ + " ?"
  177.         MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  178.  
  179.         DONE = 0
  180.         WHILE DONE = 0
  181.            A$ = UCASE$(INPUT$(1))
  182.            IF A$ = "Y" OR A$ = "N" THEN DONE = 1
  183.         WEND
  184.  
  185.         '===========| step 4. did we guess correctly |==================
  186.         '===========|         if yes we did...       |==================
  187.         IF A$ = "Y" THEN
  188.           CLOSE #1
  189.           CLS
  190.           ROW% = 12
  191.           MIDPRINT "I GOT IT RIGHT!!!", ROW%, COL%, BWHITE, BLUE
  192.           ROW% = ROW% + 1
  193.           MIDPRINT "WANT TO PLAY AGAIN ? (Y/N)", ROW%, COL%, BWHITE, BLUE
  194.           DONE = 0
  195.           WHILE DONE = 0
  196.              A$ = UCASE$(INPUT$(1))
  197.              IF A$ = "Y" OR A$ = "N" THEN DONE = 1
  198.           WEND
  199.           IF A$ = "N" THEN
  200.                          COLOR WHITE, BLACK
  201.                          WIDTH 80
  202.                          PRINT "Have a Nice Dos!"
  203.                          SYSTEM
  204.           ELSE GOTO START
  205.           END IF
  206.         END IF
  207.      END IF
  208.   WEND
  209.   CLOSE #1
  210.  
  211.   'If I Don't Know What The Animal is, I ask and update the data file
  212.  
  213.   '=================| step 1. get the new name |=====================
  214.   CLS
  215.   ROW% = 10
  216.   TXT$ = "ALL RIGHT, I GIVE UP."
  217.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  218.   ROW% = ROW% + 1
  219.   TXT$ = "WHAT ANIMAL ARE YOU THINKING OF ?"
  220.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  221.   COLOR BWHITE, BLUE
  222.   A$ = ""
  223.   WHILE LEN(A$) < 1
  224.         LOCATE ROW% + 2, 1
  225.         INPUT "", A$
  226.   WEND
  227.   NEW$ = UCASE$(LTRIM$(RTRIM$(A$)))
  228.  
  229.  
  230.   '===============| step 2. get the new question |================
  231.   CLS
  232.   ROW% = 10
  233.   TXT$ = "PLEASE TYPE A QUESTION THAT WOULD"
  234.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  235.   ROW% = ROW% + 1
  236.   TXT$ = "DISTINGUISH BETWEEN A " + ANI$
  237.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  238.   ROW% = ROW% + 1
  239.   TXT$ = "AND A " + NEW$ + "."
  240.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  241.   COLOR BWHITE, BLUE
  242.   A$ = ""
  243.   WHILE LEN(A$) < 1
  244.         LOCATE ROW% + 2, 1
  245.         INPUT "", A$
  246.   WEND
  247.   QUESTION$ = UCASE$(LTRIM$(RTRIM$(A$)))
  248.  
  249.   '===========| step 3. get the new answer |======================
  250.   CLS
  251.   ROW% = 12
  252.   TXT$ = "WHAT IS THE Y or N ANSWER ?"
  253.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  254.   ROW% = ROW% + 1
  255.   TXT$ = QT$ + QUESTION$ + " ?" + QT$
  256.   MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
  257.   DONE = 0
  258.   WHILE DONE = 0
  259.              YESNO$ = UCASE$(INPUT$(1))
  260.              IF YESNO$ = "Y" OR YESNO$ = "N" THEN DONE = 1
  261.   WEND
  262.  
  263.   '===========| step 4. print the new record to file |============
  264.   OPEN "ANIMALS.LST" FOR APPEND AS #1
  265.   PRINT #1, QUESTION$
  266.   PRINT #1, YESNO$
  267.   PRINT #1, NEW$
  268.   CLOSE #1
  269.  
  270.   '===========| step 5. find out if they want to play again |=====
  271.   CLS
  272.   ROW% = 10
  273.   TXT$ = "I NOW KNOW" + STR$(CNT) + " ANIMALS!"
  274.   MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
  275.   ROW% = ROW% + 2
  276.   TXT$ = "WANT TO PLAY AGAIN ? (Y/N)"
  277.   MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
  278.   DONE = 0
  279.   WHILE DONE = 0
  280.       A$ = UCASE$(INPUT$(1))
  281.       IF A$ = "Y" OR A$ = "N" THEN DONE = 1
  282.   WEND
  283.  
  284. LOOP UNTIL A$ = "N"
  285. COLOR WHITE, BLACK
  286. WIDTH 80
  287. PRINT "Have a Nice Dos!"
  288. SYSTEM
  289.  
  290.  
  291.  
  292. ERRORHANDLER:
  293.      RESUME NEXT
  294.  
  295. ERRORFILER:
  296.  
  297.   'IF THE FILE IS NOT FOUND
  298.   'CREATE A NEW DATA FILE
  299.  
  300.   OPEN "ANIMALS.LST" FOR OUTPUT AS #1
  301.   PRINT #1, "DOES IT LIVE IN THE WATER"
  302.   PRINT #1, "Y"
  303.   PRINT #1, "FROG"
  304.   CLOSE #1
  305.   OPEN "ANIMALS.LST" FOR INPUT AS #1
  306.   RESUME NEXT
  307.  
  308.  
  309.  
  310. TITLEDATA:
  311.  
  312. DATA "*"
  313. DATA "ANIMALS"
  314. DATA "A PROGRAM THAT LEARNS ABOUT VARIOUS ANIMALS FROM THE USER."
  315. DATA "FIRST DRAFT 1978 BY APPLE COMPUTER INC.* UPDATED: OCTOBER 1983 BY WHS"
  316. DATA "IBM-PC VERSION BY BILL BUCKELS 1991"
  317. DATA ""
  318. DATA "BASICALLY, THIS PROGRAM ILLUSTRATES THE USE OF A"
  319. DATA "BINARY TREE STRUCTURE. SINCE THE ANSWER TO A QUESTION MUST"
  320. DATA "EITHER BE A YES OR NO, WE  WILL TRAVERSE THE TREE EITHER"
  321. DATA "LEFT OR RIGHT. IF WE DO NOT GUESS THE ANIMAL CORRECTLY,"
  322. DATA "WE SIMPLY GET THE NEW ANIMAL  AND A QUESTION TO DISTINGUISH"
  323. DATA "IT FROM OTHER ANIMALS, AND UPDATE THE TREE STRUCTURE."
  324. DATA ""
  325. DATA "ORIGINAL PROGRAM IDEA: WHO KNOWS?"
  326. DATA "END OF TITLE"
  327.  
  328. SONGDATA:
  329.  
  330. 'The Song "Animal Fair"
  331.   DATA "mbmsO3T140"
  332.   DATA "e12g12g16g12a6f12g4p8"
  333.   DATA "e12g12g16g12a6g12f4p8"
  334.   DATA "g12b12b16b12b6"
  335.   DATA "g12b12b16b12b6"
  336.   DATA "a12g12g16g12a6f12g4p8"
  337.  
  338.   DATA "e12g12g16g12a6f12g4p8"
  339.   DATA "e12g12g16g12a6g12f4p8"
  340.   DATA "g12b12b16b12b6"
  341.   DATA "g12b12b16b12b6"
  342.   DATA "a12g12g16g12a6b12>c4<p8"
  343.   DATA "END OF SONG"
  344.  
  345. INSTRUCTIONS:
  346.  
  347.   DATA "*INSTRUCTIONS*"
  348.   DATA ""
  349.   DATA "YOU WILL THINK OF AN ANIMAL, AND I WILL"
  350.   DATA "TRY TO GUESS WHAT ANIMAL YOU ARE"
  351.   DATA "THINKING OF.  I WILL DO THIS BY ASKING"
  352.   DATA "YOU A SERIES OF QUESTIONS ABOUT YOUR"
  353.   DATA "ANIMAL, TO WHICH YOU RESPOND EITHER"
  354.   DATA "Y OR N."
  355.   DATA ""
  356.   DATA "IF I DO NOT GUESS WHAT YOUR ANIMAL IS,"
  357.   DATA "I WILL ASK YOU A FEW QUESTIONS SO THAT"
  358.   DATA "NEXT TIME I WILL KNOW YOUR ANIMAL."
  359.   DATA ""
  360.   DATA "END OF INSTRUCTIONS"
  361.  
  362. SUB BIGLETTERS (INSTRING$, ROW%, FGR%, BGR%) STATIC
  363.  
  364.      DEF SEG = FONTSEG
  365.      TARGET = LEN(INSTRING$)
  366.  
  367.      ATTR = BGR% * 2 ^ 4 + FGR%
  368.      '
  369.      LINEBASE = ROW% * 160 + 80 - (TARGET * 8) 'midscreen
  370.  
  371.      FOR SCANLINE = 0 TO 7              'loop for each scanline
  372.        ROW% = LINEBASE + (SCANLINE * 160)
  373.                                         'offset into the framebuffer
  374.       FOR BYTE = 1 TO TARGET            'write one full scanline
  375.  
  376.         SEED = ASC(MID$(INSTRING$, BYTE, 1))'use the ascii value for the key
  377.         OFFSET = (SEED * 8) + SCANLINE  'by bytes per char + scanlines
  378.         CHAR = PEEK(ROMFONT + OFFSET)   'get the template from the rom
  379.  
  380.         DEF SEG = SCREENSEG             'point to the framebuffer
  381.         COL = ROW% + ((BYTE - 1) * 16)  'add char position to the offset
  382.         ATT = COL + 1                   'the attribute for the char
  383.  
  384.       FOR NIBBLE = 0 TO 7               'nibble the bits, lite if lit
  385.         IF (CHAR AND MASK(NIBBLE)) THEN POKE COL, SEED: POKE ATT, ATTR
  386.         COL = COL + 2                   'increment for chars
  387.         ATT = ATT + 2                   'increment for attributes
  388.       NEXT NIBBLE
  389.  
  390.       DEF SEG = FONTSEG                 'point to the font
  391.       NEXT BYTE                        'get another
  392.      NEXT SCANLINE
  393.      DEF SEG
  394. END SUB
  395.  
  396. SUB FATFRAME (INSTRING$, FGR%, BGR%) STATIC
  397.      'a fat frame routine
  398.  
  399.      CHAR = ASC(LEFT$(INSTRING$, 1))
  400.      ATTR = BGR% * 2 ^ 4 + FGR%
  401.      DEF SEG = SCREENSEG
  402.  
  403.      'top of box
  404.      FOR OFFSET = 0 TO 159
  405.                 POKE OFFSET, CHAR
  406.                 OFFSET = OFFSET + 1
  407.                 POKE OFFSET, ATTR
  408.      NEXT OFFSET
  409.  
  410.      'middle of box
  411.      FOR LINES = 1 TO 23
  412.                  OFFSET = LINES * 160
  413.                  POKE OFFSET, CHAR
  414.                  POKE OFFSET + 1, ATTR
  415.                  POKE OFFSET + 158, CHAR
  416.                  POKE OFFSET + 159, ATTR
  417.      NEXT LINES
  418.  
  419.      'bottom of box
  420.      OFFSET = 24 * 160
  421.      WHILE NOT OFFSET = 4000
  422.             POKE OFFSET, CHAR
  423.             POKE OFFSET + 1, ATTR
  424.             OFFSET = OFFSET + 2
  425.      WEND
  426.  
  427.      DEF SEG
  428. END SUB
  429.  
  430. SUB MIDPRINT (TXT$, RW%, CL%, FGC%, BGC%) STATIC
  431.      LOCATE RW%, (CL% + 1) - (LEN(TXT$) / 2)
  432.      COLOR FGC%, BGC%
  433.      PRINT TXT$;
  434. END SUB
  435.  
  436.