10 !THIS IS A PROGRAM TO PLAY THE GAME ANIMAL. THE PLAYER IS ASKED TO THINK OF AN ANIMAL. THE COMPUTER WILL ASK THE PLAYER QUESTIONS WHICH HAVE A YES OR NO ANSWER. THE COMPUTER WILL MAKE A GUESS 20 ! AT WHAT THE ANIMAL IS. IF IT IS WRONG THEN IT WILL ASK FOR A QUESTION THAT WILL DISTINGUISH ITS GUESS FROM THE PLAYERS ANIMAL 30 ! THE QUESTIONS AND ANSWERS ARE STORED IN A VIRTUAL ARRAY IN THE FILE '[8,9]ANIMAL.STR' AS 16 BYTE STRINGS. A QUESTION OR ANSWER IS STORED IN CONTIGUOUS STRINGS. THE FIRST BYTE OF THE HEAD STRING STORES HOW MANY STRINGS ARE USED 40 ! THE TREE STRUCTURE OF THE GAME IS STORED IN AN 3 X N VIRTUAL ARRAY N%(N%,0%) HOLDS POINTER TO QUESTION, N%(N%,1%) HOLDS YES BRANCH N%(N%,2%) HOLDS NO BRANCH. THIS ARRAY IS IN FILE '[8,9]ANIMAL.LNK' 50 ! IF N%(N%,1%)=-1% THEN THIS NODE IS A LEAF, AND N%(N%,0%) POINTS TO THE ANSWER 60 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 90 ON ERROR GOTO 4500: I$=SYS(CHR$(6%)+CHR$(-7%)) 100 OPEN '[8,9]ANIMAL.LNK' AS FILE 1: DIM #1,N%(32767%,2%): OPEN '[8,9]ANIMAL.STR' AS FILE 2: DIM #2,A$(32767%) 150 PRINT "TYPE 'Y' TO YES ANSWERS, 'N' TO NO ANSWERS": PRINT 'DO NOT CTRL (C) OR (Z) OUT OF THIS PROGRAM' 160 PRINT 'WHEN THE PROGRAM ASKS FOR A NEW QUESTION, IT WANTS A QUESTION': PRINT 'THAT WILL DISTINGUISH ITS GUESS FROM YOUR ANIMAL': GOTO 220 200 ! THIS IS THE INITIALIZATION OF THE FILES, SKIP IF FILES ALREADY USED 210 A$(1%)=RIGHT(CVT%$(0),2%)+'CAT': N%(0%,0%)=1%: N%(0%,1%)=-1%: A$(0%)=CVT%$(2%)+CVT%$(1%) 220 F%=CVT$%(A$(0%)): A$=RIGHT(A$(0%),3%): F1%=CVT$%(A$) !F%-NEXT FREE STRING, F1%-NEXT FREE LINK FIELD 900 PRINT: PRINT 'THINK OF AN ANIMAL AND I WILL TRY TO GUESS WHAT IT IS, ';: PRINT '(CR.) WHEN READY';: INPUT F1$: P%=0%: GOTO 200 IF F1$='INITAL' 1000 GOTO 2000 IF N%(P%,1%)<0%: PRINT FNS$(N%(P%,0%));: IF FNV% THEN P%=N%(P%,1%) ELSE P%=N%(P%,2%) 1010 GOTO 1000 !THIS PART GOES THROUGH THE TREE ASKING QUESTIONS UNTIL THE END 2000 PRINT 'IS YOUR ANIMAL A '; FNS$(N%(P%,0%));: IF FNV% THEN 2200 2010 PRINT 'WHAT IS YOUR ANIMAL';: INPUT F1$: N%(F1%,1%)=-1%: N%(F1%,0%)=N%(P%,0%): F1%=F1%+1%: N%(F1%,1%)=-1%: N%(F1%,0%)=F%: GOSUB 3000 2020 PRINT 'WHAT IS A NEW QUESTION': INPUT LINE F1$: F1$=CVT$$(F1$,141%): F1$=LEFT(F1$,LEN(F1$)-1%) IF RIGHT(F1$,LEN(F1$))='?': N%(P%,0%)=F%: GOSUB 3000: PRINT '**';FNS$(N%(P%,0%));'?' 2025 PRINT 'WHAT IS THE ANSWER TO THAT QUESTION IF THE ANIMAL IS A ';: PRINT FNS$(N%(F1%,0%));: INPUT F$: IF ASCII(F$)=89% THEN N%(P%,1%)=F1%: N%(P%,2%)=F1%-1%: F1%=F1%+1%: GOTO 2200 2030 N%(P%,1%)=F1%-1%: N%(P%,2%)=F1%: F1%=F1%+1% 2200 PRINT 'DO YOU WANT TO PLAY AGAIN';: IF FNV% THEN 900 ELSE 6000 2210 !END OF MAIN PROGRAM 3000 F2$=LEFT(F1$,15%): F1$=RIGHT(F1$,16%) 3010 IF F1$='' THEN A$(F%)=RIGHT(CVT%$(0%),2%)+F2$ ELSE I2%=LEN(F1$)/16%+1%: A$(F%)=RIGHT(CVT%$(I2%),2%)+F2$: FOR I%=1% TO I2%: F%=F%+1%: A$(F%)=LEFT(F1$,16%): F1$=RIGHT(F1$,17%): NEXT I% 3020 F%=F%+1%: RETURN !THIS ROUTINE PUTS THE STRING F1% INTO THE STRING ARRAY A$ IN THE PROPER FORM. THE STRING IS BROKEN UP IF IT IS TO LONG 3100 DEF FNS$(X%): I2%=SWAP%(CVT$%(LEFT(A$(X%),1%))): F2$=RIGHT(A$(X%),2%): FOR I%=1% TO I2%: X%=X%+1%: F2$=F2$+A$(X%): NEXT I%: FNS$=F2$: FNEND 4000 DEF FNV%: INPUT F$: FNV%=0%: FNV%=1% IF ASCII(F$)=89%: FNEND 4490 ! ERROR HANDLING 4500 IF ERR=28% THEN IF LINE>=2020 AND LINE<=2030 THEN RESUME 4600 ELSE RESUME 6000 4510 IF ERR=11% THEN IF ERL=2025 THEN RESUME 4600 ELSE INPUT 'DO YOU WANT TO GO';F$: GOTO 4520 IF F$='CHANGE': IF ASCII(F$)=89% THEN RESUME 6000 ELSE RESUME 2200 4520 X%=N%(P%,0%): PRINT: PRINT FNS$(X%): INPUT F1$: F2%=F%: F%=X%: GOSUB 3000: F%=F2%: RESUME 2200 4530 !THIS IS AN OPTION TO CHANGE A QUESTION THAT HAS BEEN PUT IN WRONG THIS METHOD IS LIMITED IN THAT IT CAN NOT PUT IN A LONGER STRING 4600 F1%=F1%-1%: N%(P%,0%)=N%(F1%,0%): N%(P%,1%)=-1% !THIS LINE TRYS TO RECOVER FROM A CTRL (C) OR (Z) WHEN THEY OCCURE AT BAD TIMES 6000 A$(0%)=CVT%$(F%)+CVT%$(F1%): CLOSE 1,2 32767 I$=SYS(CHR$(6%)+CHR$(-15%)+' '+CHR$(9%)+CHR$(8%)) \ ON ERROR GOTO 0 UNLESS ERR=28% \ END ! DUMP ACCOUNTING DATA TO [8,9]. REPORT ERROR UNLESS ^C.