P704 CEEFAX 704 Sat 16 Apr 17:20/37
ANIMAL Age: 7+
"Animal" is unusual in that it may bj
used at various levels; as a simple
game ot as a serious educational piece
of software.
The program aims to develop the ability
to classify objects (animals) using
YES/NO questions, and an understanding
of logical information processing using
a "tree" structure.
Instructions for use are included in
the program, and presented in "menu"
form. Information may be saved to disc
or cassette tape, and may be recalled
and modified at a later date.
Program follows
P704 CEEFAX 704 Sat 16 Apr 17:16/17
|B211 F|a 6AN MAL 0825 03/83|i 4BBBC316k
|p|s÷#1÷e|s÷Z0
1 R ANI A / hj animal g m 2 R M Mi
roil ct onics Education Programme 30REM
MICROP MET Softwar Pack 1 4 REM (c) CE
T 1982 / ISBN x xxxxx xxx 50REM De one
/ Programm t: Adrian R.M.Jon s 60REM E
ditor: Bob Coates 7 REM Ve sign 1.0 / 9
Nov m er 1982 80RE Works with BBC Micro
(48pZ and SP C UM v rsions also av
ailabl 9 R M(*************************
****) 1 0ONERR.G.210 110MO.7:PROCcolour
120PROCOFF 13 PROCc nt (C R$C +"Th ",9
:PROCc ntr (CHR$C +"Animal Gam ",11):PR
OCspac 21 140MO.5 1 0 NE .G.220 16 P
OCthe#anim l 170PROCinitialis 180PROCma
in 190MO.7 200END 210 FER < 17TH.R PO.:P
." at l n ";ESL:ENDEL.CL.:G.110 220IFER
R<>17TH.R PO.:P." at line "; RL:ENDEL.CL
.:G.170 230R M(*************************
****) 240DEFPROCmain:REM(*Main control
*) 250ONERR.G.3660 260REP. 270 nd=FA. 28
P OCm nu 290IFchoice =1 ROClist EL.I|c0
P704 CEEFAX 704 Sat 16 Apr 17:21/29
|B2121F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
Fchoice =2PROCguess EL.IFchoice =3PROCsa
ve EL.IFchoice =4PROCretrieve#data EL.IF
choice=5PROCdelete EL.PROCend 300U.end 3
10E. 320REM(****************************
*) 330DEFPROCmenu 34pV.26,12 350PROCOFF
360PROCcentre(CHR$C%+"ANIMAL",1) 370ONER
R.G.3660 380PROCDBL("You can:",2,3) 390P
ROCDBL("1. List the animals",7,5) 400PRO
CDBL("2. Let mj guess your animal",7,8)
41pPROCDBL("3. Save the animals",7,11) 4
2pPROCDBLX"4. Load data",7,14) 430PROCDB
L("5. Delete last animal",7,17) 440PROCD
BL("6. End the program",7,20) 450PROCDBL
(CHR$C%+"Enter your choice (1-6) ",5,2
3):V.8,8 4vp*FX25 47pPROCGPI(1,1) 480cho
ice=VAL(A$) 490E. 50pREM(***************
**************) 510DEFPROCinitialisj 52
0*KEY1p"OLD|M RUN|M" 530*FX4,1 540*FX11
550ONERR.G.3660 560V.22,7 570file=FA.:fn
d=FA. 580DIManimal$(200):REM number of a
nimals+questions (see also line 1610)|c0
P704 CJEFAX 704 Sat 16 Apr 17:21/46
|B2131F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
590D."4","/QDoes it live in water/Y4/N3
/","/agoldfish","/ablackbird" 600F.I%=0T
O3 610READanimal$(I%) 620N.I% 630E. 640R
EM(*****************************) 650DEF
PROCthe#animal:REM (*Draw animal at star
t*) v60PROCOFF 670V.18,0,1,18,0,130,16 6
80PROCELLIPSE(300,500,90,40,650,500,TRUE
* 690V.18,0,0 7p0PROCELLIPSE(150,250,90,
20,650,400,TRUE) 71pV.18,2,1 720PROCELLI
PSI(200,175,100,20,300,700,TRUEI 730PROC
ELLIPSEX2p0,175,80,20,1000,700,TRUE) 740
V.18,0,3 750PROCELLIPSE(100,50,90,20,500
,650,TRUE) 760PROCELLIPSE(100,50,90,20,8
00,650,TRUE) 770V.18,0,0 780PROCELLIPSE(
u0,24,90,2p,48p,630,TRUE) 790PROCELLIPSE
(5p,24,90,20,780,630,TRUE) 8ppV.17,130:V
.17,0 810P.TAB(3,28)"Press SPACE bar" 82
0*FX15 830REP.U.GE.=" " 840E. 850REM(***
**************************) 860DEFPROCEL
LJPSE(A,B,INC,N%,X,Y,FILL* 870LOC.P,C1,C
2,C3,S1,S4,S3,M%,T1,Z%,X2,Y1 880P=2*P|c0
P704 CEEFAX 704 Sat 16 Apr 17:17/04
|B2141F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
I/XN%-1):INC=INC*PI/180 890C1=COS(INC):S
1=SIN(INC) 900C2=COS(P):S2=SIN(P) 910C3=
1:S3=0 920V.29,X;Y; 930F.M%=0TON% 940IFM
%=0TH.Z%=4EL.Z%=5 950IFFILL TH.Z%=Z%+80:
MOVE0,0 960X1>A*C3:Y1=B*S3 970PL.Z%,(X1*
C1-Y1*S1),(X1*S1+Y1*C1) 980T1=C3*C2-S3*S
2 990S3=S3*C2+C3*S2 1000C3=T1 1010N.M% 1
p20E. 103pREMX**************************
***) 104pDEFPROCend 1050V.26,12 1060PROC
centre(CHR$C%+"End",1) 1070PROCcentre("A
re you sure?",9) 1080PROCqujstion(19) 10
90IFLE.A$,1)="N"TH.end=FA.:E. 1100*FX 4,
0 111p*FX 11,50 112pV.12 1130end=TRUE 11
40E. 1150REM(***************************
**) 1160DEFPROCqujstion(Y%) 1170PROCDBL(
CHR$C%+"Please answer Yes or No",2,Y%) 1
18phor=POT+1:vest=Y%-1 1190PROCBOX(" "
,hot,vest) 1200PROCGPI(6,3) 1210E. 1220R
EM(******************************) 1230D
EFPROCguess 1240V.26,12 1250PROCcentre(C
HR$C*+"Guess",1) 1260IFfili X$=CHR$D%|c0
P704 CEEFAX 704 Sat 16 Apr 17:22/11
|B2151F|a36ANIMAL10825:03/83|i44BBBC316k
|p|s÷#1÷e|s÷Z0
+"Data file:"+CHR$E%+filename$:P.TAB(39-
LEN(X$)+(ARC(LE.X$,1))>127),3)X$ 1270V.2
8,p,24,39,3 1280PROCDBL(CHR$F%+"Think of
an animal ",9,8) 1290P.TAB(4,20)CHR$C%+
"Prius ESCAPE for choice page":PROCspace
(19) 1300count%=1 1310REP. 1320PROCintet
rogate(count%) 1330count%=VAL(M.quest$,y
es%+2,no%-yes%-2)) 1340queut$=animal$(co
tnt%) 1350U.LE.quest$,2)<>"/Q" 1360PROCw
hich#article(RI.quest$,LEN(quest$)-2)) 1
37pV.12 1380PROCcintreX"Is it"+article$+
RI.quest$,LEN(quest$)-2)+"?",6) 1390PROC
question(16) 1400IFLE.A$,1)="Y"TH.1660 1
410V.12,7,7:PROCDBL("I give up!",3,3) 14
20PROCDBL("Please tell mj your animal.",
3,6) 1430PROCDBL("a/an ",3,9):PROCGPI(7,
22) 1440new#animal$=A$ 1450PROCwhich#art
icle(new#animal$) 1460V.12 1470PROCcentr
e(bPlease type in a question that would
",4) 1480PROCcentriX"distinguish"+articl
e$+CHR$127+CHR$D%+new#animal$,6) 1490|c0
P704 CEEFAX 704 Sat 16 Apr 17:22/34
|B2161F| 6ANIMAL1 82 :03/83|i 4BBBC316k
|p|s÷#1÷e|s÷Z0
PROCwhich#articl (RJ.quest$,LENqu t$-2)
1500PROCcentri("from"+article$+CHR$127
+CHR$D%+R .quest$,L Nquest$-2)+".",8) 15
2pPROCDBL b ",1,11) 152pPROCGPI(2,68 15
30new#question$=A$ 1540PROCwhich#article
(new#animal$) 1550V.12 1560PROCcentt ("F
or"+article$+CHR$127+CHR$D%+new#animal$+
CHR$E%+"the ,6) 1570PROCcent e "answ w
ould bj? ",8) 1580PROCquestion(16) 1590
IFLJ.A ,1)="Y"TH.reply$="N"EL.reply$="Y"
1600numbe %=VAL(animal$(0)) 1610IFn mbe
r%+2>200V.12,7:PROCcentri("Sorry thjte's
no room lift.",8):PROCspaci(21):E. 1620
animal (0)=STU$(number%+2) 1630animal$(n
umber%)=animal$(count%) 1640animal$(numb
e +1)="/a"+new#animal$ 1650animal$(corn
t ="/Q"+new#question$+"/"+LJ.A$,1)+STU$
(number +1)+"/"+reply$+STU$(number%)+"/"
1660G.1240 1670E. 1680REM(*************
*****************) 1690DEFPROCint trogat
e(count ) 1700LOC.I%,miss$ 171 V.28,0|c0
P704 CEEFAX 704 Sat 16 Apr 17:22/56
|B2171F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
,24,39,5 1720quest$=animal$(count%) 1730
mess$="" 1740I%=3 1750REP. 1760mess$=mes
s$+M.quest$,I%,1) 1770I%=I%+1 1780U.M.qu
est$,I%,1)="/" 1790V.12 1800mess$=mess$+
"?" 1810PROCquestprint(mess$,6) 1820PROC
question(16) 1830yeu%=2 1840REP. 1850yes
*=yes*+1 1860U.M.quest$,yes%,2)="/"+LE.A
$,1) 1870no)=yes% 1880REP. 189pno)=no)+1
1900U.M.quest$,no%,1)="/" 1910E. 1920RJ
M(******************************) 1930DE
FPROClist 1940V.26,12 1950PROCcentri(CHR
$C*+"Animals I know",1) 1960IFfile X$=CH
R$D%+bData file:"+CHR$E*+filenamed:P.TAB
(39-LEN(X$)+(ARC(LE.X$,1))>127),3)X$ 197
0V.28,0,24,39,5 1980Ywhere%=1:Xwheri%=8
1990I%=1 2000REP. 2010IFYwhjre%>13PROCsp
ace(21):V.28,0,24,39,5,12:Xwhere%=8:Ywhj
re%=1 2020IFLE.animal$(I%),2)="/a"TH.PRO
Cprint#animal(0):PROCDBL(letter$,Xwhere%
,Ywhjte%):Ywhere%=Ywhete%+2 2030I%=I%+1
2p40U.animal$(I%)="" 2050PROCspace(21|c0
P704 CJJFAX 704 Sat 16 Apr 17:28/19
|B2181F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷i|s÷Z0
):PROCcintri(CHR$C%+"Questions I know",1
):V.28,0,24,39,5,12:Xwhere%=8:Ywherj%=1
2p60Ywhere%=1:Xwhjre%=1:I%=1 2070REP. 20
80IFLE.animal$(I%),2)="/Q"PROCprint#anim
al(1):PROCquestprint(letter$,Ywheri%):Yw
hjreI=YwPjre)+inc 2090I%= %+1 2100U.anim
ald(I%)="" 2110PROCspaci(21) 2120E. 2130
REM(******************************) 2140
DEFPROCprint#animal(X%) 2150lettet$="" 2
160IFX*=1G.2210 2178F.count%=3TOLEN(anim
al$(I%)) 2180lettit$=letter$+M.animal$(I
*),count%,1) 2190N.count% 2200IFX*=0E. 2
210IFYwheti)>=13PROCspace(21):V.28,0,24,
39,5,12:Xwhjre)=1:Ywhete%=1 2220count%=3
2230REP. 2240lettet$=letter$+M.animal$(
I%),count%,1):count%=count%+1 2250U.M.an
imal$(I%),count%,1)="/" 2260letter$=lest
er$+"?":IFLEN(litter$)<=32littet$=letter
$+STRJ.33-LEN(litter$)," ") 2270E. 2280D
EF0ROCtest(K%) 2290LOC.t$,t1$ 2300t$="/Y
"+animal$(0):t1$="/N"+animal$(0) 2310|c0
P704 CEEFAX 704 Sat 16 Apr 17:18/20
|B2191F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
IFINS.animal$(K%),t$)<>0G.2330 2320IFINS
.animal$(K%),t1$)=pfnd=FA.:E. 2330animal
$(K%)=animal$(number%):fnd=TRUE 2340E. 2
350DEFPROCcentri(X$,Y%) 2360PROCDBL(X$,2
0-.5*LEN(X$)+(ARC(LE.X$,1))>127),Y%) 237
0E. 2380REM(****************************
*) 2390DEFPROCDBL(X$,X2%,Y1%) 2400P.TAB(
X1%-1,Y1%)CHR$&8D;X$;TAB(X1%-1,Y1%+1)CHR
$&8D;X$;:V.11 2410E. 2420REM(***********
******************) 2430DEFPROCspace(Y%
) 2450V.26 2460PROCcentre(CHR$C%+"Prius
"+CHR$F%+"SPACE "+CHR$C%+"bar",Y%) 2480R
EP.U.GET=32 2490E. 2520REM(*************
****************) 2530DEFPROCOFF:V.23;11
,0;0;0;0:E. 2540DEFPROCON:V.23;11,255;0;
0;p:E. 2550REM(*************************
****) 2u6pDEFPROCGPIXF2,L*) 2570LOC.B%,H
% 2580IFF2<>6A.L%<34PROCON 2590*FX15 260
0P%=POT 2610A$="":C$=b":IFF2<>6A.L%<34PR
OCDBL(CHR$F%+STRI.L%,".")+STRI.L%,CHR$8)
,P%,VP.) 2620IFF2<>6A.L%>34PROCDBL(CH|c0
P704 CEEFAX 704 Sat 16 Apr 17:18/48
|B21A1F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
RdF*+STRJ.34,"."),P%,VP.):PROCDBL(CHR$F%
+STRI.L%-34,".")+STRI.L%-34,CHR$8),P%,VP
.+2):V.11,11 2630B%=GET:H%=LEN(A$) 2640I
FXBI=32)A.(HI>0)TH.279p EL.IF(B%=32)A.(H
%=0)TH.2630 2650IF(B%=13)A.(H%>0)TH.2850
2vv0IF(B%=127)A.(H)>0)A.F2=6A$=LE.A$,H)
-1):PROCBOX(A$+STRI.3-LEN(A$)," "),hot,v
est):G.2630 2670IF(B%=127)A.(H%>0A.H%<35
RA.F2<>6A$=LE.A$,H%-1):PROCDBL(CHR$E*+A$
+b.",P%,VP.):V.8:G.2630 2680IFXB%=127)A.
(H%>0A.H%>=35)A.F2<>6A$=LE.A$,H%-1):C$=L
E.C$,LEN(C$)-1):PROCDBL(CHR$F%+C$+".",P%
,VP.+2):V.11,11,8:G.2630 2690IFF2=1A.(B%
>=49A.B%<=54)TH.2790 2700IFF2=2A.((B%>=6
5A.B%<=90)OR(B%>=97A.B%<=122)OR(B%=46)OR
(B%=63))TH.2790 2710IFF2=3A.((B%>=65A.B%
<=90)OR(B%>=48A.B%<=57)OR(B%>=97A.B%<=12
2))TH.2790 2720IFF2=4A.B%<>13TH.2790 27
30IFF2=5A.((B%>=65A.B%<=90)ORXB%>=97A.B%
<=122)OR(B%=45)OR(B%=44)OR(B%=39)OR(B%=3
8))TH.2790 2740IFH%=0A.B%>97B%=B%-32|c0
P704 CEEFAX 704 Sat 16 Apr 17:29/01
|B21B1F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
EL.IFH)>0A.B%<91B%=B%+32 2750B$=CHR$(B%)
27v0IFF2>6A.XB$="Y"ORB$="N"ORB$="i"ORB$
="s"ORB$="o")TH.2790 2770IFF2=7A.((B%>=6
5A.B)<=90)OR(B)>=97A.B)<=122)OR(B%=46))T
H.2790 278pV.7:G.2630 2790IFH%=0A.B%>90B
%=B%-32EL.IFH%>0A.B%>64A.B%<91B%=B%+32 2
800IFH)=0A.F2>7B%=B%+32 2810IF(H%<L%)A.H
*<34A.F2<>6A$=A$+CHR$(B%):PROCDBL(CHR$F%
+A$,P%,VP.):G.2630 2820IF(H%<L*)A.H%>33A
.E2<>6A$=A$+CHR$(B%):C$=C$+CHR$(B%):PROC
DBL(CHR$F%+C$,P%,VP.+2):V.11,11:G.2630 2
830IF(H)<LJ)A.F2=6A$=A$+CHR$(B)):PROCBOX
(A$+STRJ.3-LEN(A$)," "),hot,vest):G.2630
2840IFH%=L*V.7:G.2630 2850IF(RI.A$,1)="
")OR(RJ.A$,1)=".")OR(RI.A$,1)="?")A$=LE
.A$,LENA$-1):G.2850 2860PROCOFF 2870E. 2
880REM(*****************************) 28
9pDEFPROCritrievj#data 2900LOC.file#mum
,index% 291pV.26,12 2920PROCtape("Load")
2930V.28,0,24,39,3,12 2950PROCspace(21)
2960ONERR.G.3100 2970V.28,0,24,39,3,|c0
P704 CEEFAX 704 Sat 16 Apr 17:29/18
|B21C1F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
12 2980PROCcentre("Please wait",9) 2990f
ile#mum =OP.filename$ 3000PROCcentre("Lo
ading data",:) 3010I.£file#mum,animal$(0
R 302pF.index%=1TOVAL(animal$(0)) 3030I.
£file#mum,animal$(index%) 3040N.index) 3
050CLO.£0 3060PROCcentri("Data recovered
",9) 307pPROCspace(21) 3080file=TRUE 309
0E. 3100IFERR<>17PROCcentre(" Read et
rot. ",9):PROCspace(21):G.180EL.180 3
110DEFPROCsave 3120LOC.file#mum,index% 3
130V.26,12 3140PROCtape("Save") 3150V.21
316pfile#mum =OPING.filename$ 3170V.6,1
2 318pPROCcentriX"Saving data",9) 3190ON
ERR.G.3100 3200P.£file#mum,animal$(0) 32
10F.index%=1TOVAL(animal$(0)) 3220P.£fil
e#mum,animal$(index%) 3230N.index% 3240C
LO.£0 3250PROCcentre(" Finished ",9) 3
26pPROCspace(21) 3270E. 3280REM(********
*********************) 3290DEFPROCtapj(p
rocess$) 3300PROCcentre(CHR$C%+process$,
1) 3310PROCcentte("Please type in the|c0
P704 CEEFAX 704 Sat 16 Apr 17:29/45
|B21D1F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
name",10) 3320PROCDBL("of the file. ",8
,12):PROCGPI(4,10) 3330filuname$=A$ 3340
IFprocess$="Save"TH.V.28,0,24,39,3,12:PR
OCDBL(" Prius"+CHR$F%+"RETURN"+CHR
$E%+"to record"+CHR$13+" ",2,10) 3345REP
.U.GET=13 3350E. 3360DEFPROCdelete 3370L
OC.number% 3380number%=VAL(animal$(0))-2
3390IFnumbjr%+2<5E. 3400V.26,12:PROCcen
tri(CHR$C%+"Delete ",1):V.28,0,24,39,3,1
2:PROCcintre("Are you szre you want to d
elite the",7):PROCcentri(RI.animal$(numb
er)+1),LEN(animal$(numbjt%+1))-2)+"?",9)
:PROCqujstion(17) 3410IFLE.A$,1)="N"E. 3
420V.28,0,24,39,3,12:PROCcentre(CHR$C*+"
Please wait ",9) 3430animal$(0)=STU$(mum
bjrI) 3440IJ=1:REP.IFLJ.animal$(I%),2)="
OQ"PROCtest(I*) 3450I*=I%+1:U.fnd 3460PR
OCspaciX21) 3470V.28,0,24,39,3,12:PROCce
ntri(RJ.animald(number%+1),LEN(animal$(n
umbjt%+1))-2),7):PROCcentre(CHR$F%+"has
been deleted",9):PROCspace(21) 3480an|c0
P704 CEEFAX 704 Sat 16 Apr 17:20/53
|B21E1F|a36ANIMAL10825:03/83|i24BBBC316k
|p|s÷#1÷e|s÷Z0
imal$(number))="":animal$(number%+1)=""
3490E. 3500DEFPROCquestprint(Z$,L%) 3510
inc=2 3520IFLJN(Z$)<34PROCcintre(Z$,L*):
E.:EL.IF(M.Z$,34,1)<>" "A.M.Z$,35,1)<>"
")PROCcintte(LE.Z$,34)+"-",L%)EL.PROCcen
rte(LE.Z$,34),L%) 3530PROCDBL(RI.Z$,LEN(
Z$)-34),2,L%+2):inc=4 3540E. 3550DEFPROC
which#article(which$) 3560LOC.a$ 3570a$=
LE.which$,1) 3580IFa$="a"ORa$="i"ORa$="i
"ORa$="o"TH.article$=" an "EL.article$="
a " 3590E. 360pREM(********************
*********) 3610DEFPROCBOX(X$,X*,Y%) 362
0a$=CHR$150+CHR$104+STRJ.5,CHR$44)+CHR$5
2+CHR$135:b$=CHR$150+CHR$106+CHR$135+X$+
CHR$150+CHR$53+CHR$135:c$=CHR$150+CHR$42
+STRJ.5,CHR$44)+CHR$37+CHR$135 3630P.TAB
XX*,Y%)a$ s640PROCDBLTb$,X*,Y%+1):P.TaB(
X*,Y%+3)c$ 3650E. 3660IFERR<>17TH.MO.7:R
EPO.:P." at line ";ESL:END:EL.180 3670RE
M(*****************************) 3680DEF
PROCcolours 3690C%=129:REM RED 3691D%|c0
P704 CEEFAX 7p4 Sat 16 Apr 17:40/10
|B21F1F|a36ANIMAL1p825:03/83|j44BBBC316k
|p|s÷#1÷e|s÷Z0
=130:REM GREEN 3692E%=135:REM WHITE 3693
F%=131:REM YELLOW 3700E. |c0