home *** CD-ROM | disk | FTP | other *** search
- ' Program Name : ANIMALS
- ' Author : Bill Buckels
- ' Date : September 28, 1991
- ' Purpose : A rewrite of the APPLESOFT ANIMALS PROGRAM
- ' in QuickBASIC 4.5
-
- 'This is a classic program and really doesn't deserve to die.
- 'It wasn't a great game but is definitely reminiscent of a
- 'period of computing history that had its own ambience and charm.
- 'I hope that my rewrite hasn't mutated it beyond all recognition.
-
- DIM MASK(8) ' a logical bitmask array
-
- CONST FONTSEG = &HFFA6 ' romfont segment
- CONST ROMFONT = &HE ' romfont offset
- CONST WHITESPACE = 32
- CONST MONOCHROME = &HB000 ' address for the monochrome adapter
- CONST CGA = &HB800 ' address for the cga
- CONST BLACK = 0 ' color constants
- CONST BLUE = 1
- CONST RED = 4
- CONST WHITE = 7
- CONST LCYAN = 11
- CONST BWHITE = 15
-
-
- COMMON SHARED MASK(), SCREENSEG
- DECLARE SUB FATFRAME (INSTRING$, FGR%, BGR%)
- DECLARE SUB BIGLETTERS (INSTRING$, ROW%, FGR%, BGR%)
- DECLARE SUB MIDPRINT (TXT$, RW%, CL%, FG%, BG%)
-
- 'CHECK FOR MONOCHROME DISPLAY
-
-
- DEF SEG = MONOCHROME 'clear the screen and
- CLS 'try to read a whitespace
- A = PEEK(0) 'if it's not there assume
- IF NOT A = WHITESPACE THEN
- SCREENSEG = CGA 'we have a color adapter
- ELSE
- PRINT "Sorry... CGA Required."
- SYSTEM
- END IF
- DEF SEG
-
- MASK(0) = &H80
- MASK(1) = &H40
- MASK(2) = &H20
- MASK(3) = &H10
- MASK(4) = &H8
- MASK(5) = &H4
- MASK(6) = &H2
- MASK(7) = &H1
- QT$ = CHR$(34)
-
-
- COLOR BWHITE, BLUE
- CLS
-
- RESTORE TITLEDATA
- READ TXT$
- FATFRAME TXT$, WHITE, RED
- READ TXT$
- BIGLETTERS TXT$, 2, RED, WHITE
- ROW% = 11
- COL% = 39
- READ TXT$
- WHILE NOT TXT$ = "END OF TITLE"
- MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
- ROW% = ROW% + 1
- READ TXT$
- WEND
-
- RESTORE SONGDATA
- READ TXT$
- WHILE NOT TXT$ = "END OF SONG"
- PLAY TXT$
- READ TXT$
- WEND
-
- '=======================| INITIALIZATION SECTION |======================
-
- ON ERROR GOTO ERRORHANDLER
- WIDTH 40
- COLOR BWHITE, BLUE
- CLS
- MIDPRINT "DO YOU WANT INSTRUCTIONS ?(Y/N)", 12, 21, BWHITE, BLUE
-
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" OR A$ = CHR$(27) THEN DONE = 1
- WEND
- CLS
-
- IF A$ = CHR$(27) THEN
- COLOR WHITE, BLACK
- WIDTH 80
- PRINT "Have a Nice Dos!"
- SYSTEM
- END IF
-
-
-
- IF A$ = "N" THEN
- ROW% = 12
- COL% = 20
- ELSE
- RESTORE INSTRUCTIONS
- ROW% = 6
- COL% = 20
- READ TXT$
- WHILE NOT TXT$ = "END OF INSTRUCTIONS"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- ROW% = ROW% + 1
- READ TXT$
- WEND
- END IF
-
-
- MIDPRINT "DO YOU WANT TO DELETE OLD GAMES?", ROW%, COL%, BWHITE, BLUE
- ROW% = ROW% + 1
- MIDPRINT "ERASE ALL PREVIOUS ANIMALS (Y/N)", ROW%, COL%, BWHITE, BLUE
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" THEN DONE = 1
- WEND
-
- IF A$ = "Y" THEN
- OPEN "ANIMALS.LST" FOR OUTPUT AS #1
- PRINT #1, "DOES IT LIVE IN THE WATER" 'question
- PRINT #1, "Y" 'response
- PRINT #1, "FROG" 'match
- CLOSE #1
- END IF
-
-
- DO
- START:
-
- ON ERROR GOTO ERRORFILER
- OPEN "ANIMALS.LST" FOR INPUT AS #1
- ON ERROR GOTO ERRORHANDLER
-
- '======================| PLAY THE GAME |=====================
-
-
- CNT = 1
-
- WHILE NOT EOF(1)
- '================| step 1. get a question for a yes or no answer
- '================| and the answer and the guess
- LINE INPUT #1, QUESTION$
- LINE INPUT #1, YESNO$
- LINE INPUT #1, ANI$
- CNT = CNT + 1
-
- '================| step 2. ask the question. get the response.
- CLS
- ROW% = 12
- TXT$ = QUESTION$ + " ?"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" THEN DONE = 1
- WEND
-
- IF A$ = YESNO$ THEN
-
- '====| step 3. if it matches the measured response make a guess
- COLOR BWHITE, BLUE
- PRINT A$
- ROW% = ROW% + 1
- TXT$ = "ARE YOU THINKING OF A " + ANI$ + " ?"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
-
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" THEN DONE = 1
- WEND
-
- '===========| step 4. did we guess correctly |==================
- '===========| if yes we did... |==================
- IF A$ = "Y" THEN
- CLOSE #1
- CLS
- ROW% = 12
- MIDPRINT "I GOT IT RIGHT!!!", ROW%, COL%, BWHITE, BLUE
- ROW% = ROW% + 1
- MIDPRINT "WANT TO PLAY AGAIN ? (Y/N)", ROW%, COL%, BWHITE, BLUE
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" THEN DONE = 1
- WEND
- IF A$ = "N" THEN
- COLOR WHITE, BLACK
- WIDTH 80
- PRINT "Have a Nice Dos!"
- SYSTEM
- ELSE GOTO START
- END IF
- END IF
- END IF
- WEND
- CLOSE #1
-
- 'If I Don't Know What The Animal is, I ask and update the data file
-
- '=================| step 1. get the new name |=====================
- CLS
- ROW% = 10
- TXT$ = "ALL RIGHT, I GIVE UP."
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- ROW% = ROW% + 1
- TXT$ = "WHAT ANIMAL ARE YOU THINKING OF ?"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- COLOR BWHITE, BLUE
- A$ = ""
- WHILE LEN(A$) < 1
- LOCATE ROW% + 2, 1
- INPUT "", A$
- WEND
- NEW$ = UCASE$(LTRIM$(RTRIM$(A$)))
-
-
- '===============| step 2. get the new question |================
- CLS
- ROW% = 10
- TXT$ = "PLEASE TYPE A QUESTION THAT WOULD"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- ROW% = ROW% + 1
- TXT$ = "DISTINGUISH BETWEEN A " + ANI$
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- ROW% = ROW% + 1
- TXT$ = "AND A " + NEW$ + "."
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- COLOR BWHITE, BLUE
- A$ = ""
- WHILE LEN(A$) < 1
- LOCATE ROW% + 2, 1
- INPUT "", A$
- WEND
- QUESTION$ = UCASE$(LTRIM$(RTRIM$(A$)))
-
- '===========| step 3. get the new answer |======================
- CLS
- ROW% = 12
- TXT$ = "WHAT IS THE Y or N ANSWER ?"
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- ROW% = ROW% + 1
- TXT$ = QT$ + QUESTION$ + " ?" + QT$
- MIDPRINT TXT$, ROW%, COL%, LCYAN, BLUE
- DONE = 0
- WHILE DONE = 0
- YESNO$ = UCASE$(INPUT$(1))
- IF YESNO$ = "Y" OR YESNO$ = "N" THEN DONE = 1
- WEND
-
- '===========| step 4. print the new record to file |============
- OPEN "ANIMALS.LST" FOR APPEND AS #1
- PRINT #1, QUESTION$
- PRINT #1, YESNO$
- PRINT #1, NEW$
- CLOSE #1
-
- '===========| step 5. find out if they want to play again |=====
- CLS
- ROW% = 10
- TXT$ = "I NOW KNOW" + STR$(CNT) + " ANIMALS!"
- MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
- ROW% = ROW% + 2
- TXT$ = "WANT TO PLAY AGAIN ? (Y/N)"
- MIDPRINT TXT$, ROW%, COL%, BWHITE, BLUE
- DONE = 0
- WHILE DONE = 0
- A$ = UCASE$(INPUT$(1))
- IF A$ = "Y" OR A$ = "N" THEN DONE = 1
- WEND
-
- LOOP UNTIL A$ = "N"
- COLOR WHITE, BLACK
- WIDTH 80
- PRINT "Have a Nice Dos!"
- SYSTEM
-
-
-
- ERRORHANDLER:
- RESUME NEXT
-
- ERRORFILER:
-
- 'IF THE FILE IS NOT FOUND
- 'CREATE A NEW DATA FILE
-
- OPEN "ANIMALS.LST" FOR OUTPUT AS #1
- PRINT #1, "DOES IT LIVE IN THE WATER"
- PRINT #1, "Y"
- PRINT #1, "FROG"
- CLOSE #1
- OPEN "ANIMALS.LST" FOR INPUT AS #1
- RESUME NEXT
-
-
-
- TITLEDATA:
-
- DATA "*"
- DATA "ANIMALS"
- DATA "A PROGRAM THAT LEARNS ABOUT VARIOUS ANIMALS FROM THE USER."
- DATA "FIRST DRAFT 1978 BY APPLE COMPUTER INC.* UPDATED: OCTOBER 1983 BY WHS"
- DATA "IBM-PC VERSION BY BILL BUCKELS 1991"
- DATA ""
- DATA "BASICALLY, THIS PROGRAM ILLUSTRATES THE USE OF A"
- DATA "BINARY TREE STRUCTURE. SINCE THE ANSWER TO A QUESTION MUST"
- DATA "EITHER BE A YES OR NO, WE WILL TRAVERSE THE TREE EITHER"
- DATA "LEFT OR RIGHT. IF WE DO NOT GUESS THE ANIMAL CORRECTLY,"
- DATA "WE SIMPLY GET THE NEW ANIMAL AND A QUESTION TO DISTINGUISH"
- DATA "IT FROM OTHER ANIMALS, AND UPDATE THE TREE STRUCTURE."
- DATA ""
- DATA "ORIGINAL PROGRAM IDEA: WHO KNOWS?"
- DATA "END OF TITLE"
-
- SONGDATA:
-
- 'The Song "Animal Fair"
- DATA "mbmsO3T140"
- DATA "e12g12g16g12a6f12g4p8"
- DATA "e12g12g16g12a6g12f4p8"
- DATA "g12b12b16b12b6"
- DATA "g12b12b16b12b6"
- DATA "a12g12g16g12a6f12g4p8"
-
- DATA "e12g12g16g12a6f12g4p8"
- DATA "e12g12g16g12a6g12f4p8"
- DATA "g12b12b16b12b6"
- DATA "g12b12b16b12b6"
- DATA "a12g12g16g12a6b12>c4<p8"
- DATA "END OF SONG"
-
- INSTRUCTIONS:
-
- DATA "*INSTRUCTIONS*"
- DATA ""
- DATA "YOU WILL THINK OF AN ANIMAL, AND I WILL"
- DATA "TRY TO GUESS WHAT ANIMAL YOU ARE"
- DATA "THINKING OF. I WILL DO THIS BY ASKING"
- DATA "YOU A SERIES OF QUESTIONS ABOUT YOUR"
- DATA "ANIMAL, TO WHICH YOU RESPOND EITHER"
- DATA "Y OR N."
- DATA ""
- DATA "IF I DO NOT GUESS WHAT YOUR ANIMAL IS,"
- DATA "I WILL ASK YOU A FEW QUESTIONS SO THAT"
- DATA "NEXT TIME I WILL KNOW YOUR ANIMAL."
- DATA ""
- DATA "END OF INSTRUCTIONS"
-
- SUB BIGLETTERS (INSTRING$, ROW%, FGR%, BGR%) STATIC
-
- DEF SEG = FONTSEG
- TARGET = LEN(INSTRING$)
-
- ATTR = BGR% * 2 ^ 4 + FGR%
- '
- LINEBASE = ROW% * 160 + 80 - (TARGET * 8) 'midscreen
-
- FOR SCANLINE = 0 TO 7 'loop for each scanline
- ROW% = LINEBASE + (SCANLINE * 160)
- 'offset into the framebuffer
- FOR BYTE = 1 TO TARGET 'write one full scanline
-
- SEED = ASC(MID$(INSTRING$, BYTE, 1))'use the ascii value for the key
- OFFSET = (SEED * 8) + SCANLINE 'by bytes per char + scanlines
- CHAR = PEEK(ROMFONT + OFFSET) 'get the template from the rom
-
- DEF SEG = SCREENSEG 'point to the framebuffer
- COL = ROW% + ((BYTE - 1) * 16) 'add char position to the offset
- ATT = COL + 1 'the attribute for the char
-
- FOR NIBBLE = 0 TO 7 'nibble the bits, lite if lit
- IF (CHAR AND MASK(NIBBLE)) THEN POKE COL, SEED: POKE ATT, ATTR
- COL = COL + 2 'increment for chars
- ATT = ATT + 2 'increment for attributes
- NEXT NIBBLE
-
- DEF SEG = FONTSEG 'point to the font
- NEXT BYTE 'get another
- NEXT SCANLINE
- DEF SEG
- END SUB
-
- SUB FATFRAME (INSTRING$, FGR%, BGR%) STATIC
- 'a fat frame routine
-
- CHAR = ASC(LEFT$(INSTRING$, 1))
- ATTR = BGR% * 2 ^ 4 + FGR%
- DEF SEG = SCREENSEG
-
- 'top of box
- FOR OFFSET = 0 TO 159
- POKE OFFSET, CHAR
- OFFSET = OFFSET + 1
- POKE OFFSET, ATTR
- NEXT OFFSET
-
- 'middle of box
- FOR LINES = 1 TO 23
- OFFSET = LINES * 160
- POKE OFFSET, CHAR
- POKE OFFSET + 1, ATTR
- POKE OFFSET + 158, CHAR
- POKE OFFSET + 159, ATTR
- NEXT LINES
-
- 'bottom of box
- OFFSET = 24 * 160
- WHILE NOT OFFSET = 4000
- POKE OFFSET, CHAR
- POKE OFFSET + 1, ATTR
- OFFSET = OFFSET + 2
- WEND
-
- DEF SEG
- END SUB
-
- SUB MIDPRINT (TXT$, RW%, CL%, FGC%, BGC%) STATIC
- LOCATE RW%, (CL% + 1) - (LEN(TXT$) / 2)
- COLOR FGC%, BGC%
- PRINT TXT$;
- END SUB
-