home *** CD-ROM | disk | FTP | other *** search
AmigaBASIC Source Code | 1989-10-04 | 11.3 KB | 438 lines |
- GOTO redux:
- recoup:
- CLS
- STOP
- redux:
- ON BREAK GOSUB recoup:
- BREAK ON
- start:
-
- ' Math Drill by Alex Bogomolny
- DEFINT a-z:WIDTH "scrn:",80
- DIM titles$(3):PosReply=18:NegReply=12
- DIM sp$(PosReply+NegReply)
- RANDOMIZE TIMER:ON BREAK GOSUB ExitProgram:BREAK ON
- SCREEN 1,320,200,2,1:WIDTH ,80
- WINDOW 2,"Math Drill",,0,1:WINDOW OUTPUT 2
- LOCATE 5,3
- GOSUB ReadData:GOSUB SetMenu:ON MENU GOSUB ProcessMenu
- GOSUB ChooseColors
- SAY "THAENKS. WEHLKAHM TUW DHEH MAE3TH DRIYL."
- GOSUB RequestSelection
- MainStart:
- RANDOMIZE TIMER
- score=6:count=0
- IF oldchoice=0 GOTO MainStart
- IF oldchoice=5 THEN ExitProgram
- WHILE score<25
- choice=oldchoice
- RepeatAfterWrongAnswer:
- GOSUB ChooseColors
- GOSUB DrawTitle
- GOSUB DigitsChoice
- GOSUB ScoreColumn
- GOSUB GiveProblem
- GOSUB GetAnswer
- IF answer=axb THEN GOSUB Correct :ELSE GOSUB Wrong
- WEND
- GOSUB RequestSelection
- GOTO MainStart
- ExitProgram:
- SAY "SIY2 YUW AXGEY3N SUW6N."
- MENU OFF:WINDOW CLOSE 2:SCREEN CLOSE 1:WINDOW 1:WINDOW OUTPUT 1
- GOTO recoup
- '
- RequestSelection:
- CLS
- SAY "MEY3K YOHR CHOY4S."
- oldchoice=0
- GOSUB DigitsChoice
- RETURN
- ReadData:
- DECLARE FUNCTION Move LIBRARY
- LIBRARY "graphics.library":RP&=WINDOW(8)
- bckgr=0:forgr=1:boxclr=2:flush=3
- stp=2:Maximum=100:MenuOn=0
- FOR i=0 TO 3:READ titles$(i):NEXT
- DATA "ADDITION","SUBTRACTION","MULTIPLICATION","DIVISION"
- FOR i=0 TO PosReply+NegReply:READ sp$(i):NEXT
- DATA "UWRX TEHRIY4FIXK.","AO9BOY7.","GUH3D DJAA6B.","FAY9N."
- DATA "KAH2NGRXAH3CHUHLEY8SHNS.","DHAE2TS GUH4D."
- DATA "GUH2D FAXR YUW5.","NAYS DJAAB.","DHAE2TS GREY6T."
- DATA "YUW2RX GREY6T.","YUW2L MEY8K IHT.","VEH3RIH GUW6D."
- DATA "AY AXM PRAW3D AXV YUW3.","YUW2 DIH5D IHT.","WEH2L DAH4N."
- DATA "YUW MEYK MIH /HAE4PIH.","GREY9T.","DHAETS RAY4T.","KAX2REH5KT."
- DATA "/HAW4Z DHAE2T?","AO2 /HOH /HOH5.","ROH6NG.","AY AXM SAA5RIH."
- DATA "TRAY AXGEY4N.","THIH4NK BEH6TEH2RX.","AA YUW SHUW3R?"
- DATA "YUW3 BEH9T.","KAXM AO2N.","OH KAX3M AO2N.","IHNDIY2D?"
- DATA "AA YUW SIY4RIHEH2Z?"
- RETURN
- RETURN
- ScoreColumn:
- LINE (290,0)-(309,199),forgr,bf
- LINE (290,194-8*score)-(309,199),boxclr,bf
- LINE (290,0)-(309,186),forgr,b:LINE(291,1)-(308,185),bckgr,b
- FOR i=2 TO score
- i8=i*8
- LINE(291,193-i8)-(308,193-i8),bckgr
- LINE(301,196-i8)-(303,198-i8),forgr:LINE(303,198-i8)-(306,195-i8),forgr
- NEXT
- RETURN
- DigitsChoice:
- FOR i=0 TO 9
- LINE (7+i*24,155)-(30+i*24,172),boxclr,bf
- COLOR ,boxclr:CALL Move&(RP&,13+i*24,167)
- PRINT RIGHT$(STR$(i),1);
- LINE (7+i*24,155)-(30+i*24,172),forgr,b
- NEXT
- LINE (173,35)-(246,80),boxclr,bf
- LINE (173,92)-(246,136),boxclr,bf
- LINE (173,35)-(246,80),forgr,b
- LINE (173,92)-(246,136),forgr,b
- CALL Move&(RP&,202,60):PRINT "OK":CALL Move&(RP&,182,116):PRINT "CANCEL"
- RETURN
- DrawTitle:
- t$=titles$(choice-1):nt=(30-LEN(t$))/2:LOCATE 1,nt:PRINT t$
- RETURN
- GiveProblem:
- IF answer<>axb THEN GOSUB DrawProblem:RETURN
- a=INT(RND*(Maximum+1))
- ON choice GOSUB Addition,Subtraction,Multiplication,Division
- GOSUB DrawProblem
- RETURN
- Addition:
- sign$="+":b=INT(RND*(Maximum+1-a)):axb=a+b:RETURN
- Subtraction:
- sign$="-":b=INT(RND*(Maximum+1)):IF b>a THEN SWAP a,b
- axb=a-b:RETURN
- Multiplication:
- sign$="x":b=INT(RND^1.2*(Maximum+1)):axb=a*b:RETURN
- Division:
- sign$=":":b=INT(RND^1.2*(Maximum+1)):IF b=0 GOTO Division
- axb=a:a=a*b:RETURN
- SUB DrawP(x,h) STATIC
- DEFINT a-z
- x$=MID$(STR$(x),2):l=LEN(x$):ll=l
- FOR i=1 TO l
- v=VAL(LEFT$(x$,1))
- 'SOUND RND*150+200,2,48,0: SOUND RND*150+200,2,48,1
- 'SOUND RND*150+200,2,48,2: SOUND RND*150+200,2,48,3
- CALL DisplayOneDigit(112,l,i,24,h,v)
- ll=ll-1:IF ll<>0 THEN x$=RIGHT$(x$,ll)
- NEXT
- END SUB
- DrawProblem:
- LINE(0,10)-(115,115),bckgr,bf 'erase previous example
- CALL DrawP(a,50)
- nd1=LEN(STR$(a))-1:nd2=LEN(STR$(b))-1:IF nd1<nd2 THEN SWAP nd1,nd2
- Xstart=34+24*(nd1>2):Ystart=64:clr1=bckgr:clr2=forgr
- ON choice GOSUB Plus,Minus,Times,Divide
- 'SOUND RND*150+200,2,64,0: SOUND RND*150+200,2,64,1
- 'SOUND RND*150+200,2,64,2: SOUND RND*150+200,2,64,3
- CALL DrawP(b,76)
- LINE(62+24*(axb>=100 OR nd1=3),82)-(112,86),forgr,bf
- RETURN
- GetAnswer:
- answer=0:nd=0 'nd is the number of entered digits
- WaitAgain:
- m=MOUSE(0):IF m=0 GOTO WaitAgain
- WHILE MOUSE(0)<>0:WEND
- x=MOUSE(1):y=MOUSE(2)
- IF x>173 AND x<246 AND y>35 AND y<80 THEN CALL Flushlight(173,246,35,80):RETURN 'OK
- IF x>173 AND x<246 AND y>92 AND y<136 THEN answer=0:nd=0:LINE (0,90)-(115,120),bckgr,bf:CALL Flushlight(173,246,92,136):GOTO WaitAgain
- GOSUB SeeIfInteger:IF NOT intgr GOTO WaitAgain
- FOR fl=0 TO 8
- LINE(7+k*24,155)-(30+k*24,172),flush,bf
- LINE(7+k*24,155)-(30+k*24,172),boxclr,bf
- NEXT
- CALL Move&(RP&,13+k*24,167):PRINT RIGHT$(STR$(k),1);
- LINE(7+k*24,155)-(30+k*24,172),forgr,b
- nd=nd+1
- IF nd>4 THEN
- answer=0:SAY TRANSLATE$("too large a number. sorry for that.")
- LINE (0,90)-(115,115),bckgr,bf:nd=0
- ELSE
- answer=answer*10+k
- IF MenuOn=0 THEN
- GOSUB DisplayAnswer
- ELSE
- LOCATE 17,nd+3:PRINT RIGHT$(STR$(k),1)
- END IF
- END IF
- GOTO WaitAgain
- RETURN
- SeeIfInteger:
- intgr=0
- IF y<155 OR y>172 THEN RETURN
- IF x>7 AND x<30 THEN
- intgr=-1:k=0
- ELSEIF x>31 AND x<54 THEN
- intgr=-1:k=1
- ELSEIF x>55 AND x<78 THEN
- intgr=-1:k=2
- ELSEIF x>79 AND x<102 THEN
- intgr=-1:k=3
- ELSEIF x>103 AND x<126 THEN
- intgr=-1:k=4
- ELSEIF x>127 AND x<150 THEN
- intgr=-1:k=5
- ELSEIF x>151 AND x<174 THEN
- intgr=-1:k=6
- ELSEIF x>175 AND x<198 THEN
- intgr=-1:k=7
- ELSEIF x>199 AND x<222 THEN
- intgr=-1:k=8
- ELSEIF x>223 AND x<246 THEN
- intgr=-1:k=9
- END IF
- RETURN
- DisplayAnswer:
- FOR scr=1 TO 8
- SCROLL(0,90)-(112,115),-3,0
- NEXT
- PAINT(110,102),bckgr
- 'SOUND RND*150+350,2,64,0: SOUND RND*150+350,2,64,1
- 'SOUND RND*150+350,2,64,2: SOUND RND*150+350,2,64,3
- CALL DisplayOneDigit(112,nd,nd,24,112,k)
- RETURN
- Correct:
- score=score+1:SAY sp$(FIX(RND*(PosReply+1)))
- RETURN
- Wrong:
- score=score-1:IF score<1 THEN score=1
- SAY sp$(FIX((PosReply+1)+RND*NegReply))
- a$=MID$(STR$(a),2):b$=MID$(STR$(b),2)
- LOCATE 16,2:PRINT "Correct Result:":LOCATE 17,8
- PRINT a$;sign$;b$;"=";MID$(STR$(axb),2)
- CALL Waiting(3):LINE (0,120)-(60,150),bckgr,bf
- RETURN RepeatAfterWrongAnswer
- SUB Waiting(n) STATIC
- FOR i=1 TO n:now$=TIME$:WHILE TIME$=now$:WEND:NEXT
- END SUB
- ChooseColors:
- PALETTE bckgr,RND/4,RND/2,RND/2
- PALETTE forgr,RND/8,(4+RND)/5,RND/2
- PALETTE boxclr,(3+RND)/4,RND/4,RND/2
- PALETTE flush,(3+RND)/4,(1+RND)/3,(3+RND)/8
- IF RND<0.5 THEN SWAP forgr,bckgr
- IF RND<0.5 THEN SWAP flush,boxclr
- COLOR forgr,bckgr:CLS
- RETURN
- SUB Flushlight(x1,x2,y1,y2) STATIC
- DEFINT a-z
- SHARED flush,bckgr
- FOR j=1 TO 3
- FOR i=1 TO 6
- PALETTE flush,(1+RND)/2,(1+RND)/2,(1+RND)/2
- LINE(x1-i,y1-i)-(x2+i,y2+i),flush,b
- NEXT
- FOR i=6 TO 1 STEP -1
- LINE(x1-i,y1-i)-(x2+i,y2+i),bckgr,b
- NEXT
- NEXT
- END SUB
- SUB DisplayOneDigit(Xptr,TotalLength,Xoffset,Xsize,Ystart,v) STATIC
- SHARED stp,forgr,bckgr
- DEFINT a-z
- Xstart=Xptr-(TotalLength-Xoffset+1)*Xsize
- PSET(Xstart,Ystart),bckgr
- ON (v+1) GOSUB Digit0,Digit1,Digit2,Digit3,Digit4,Digit5,Digit6,Digit7,Digit8,Digit9
- COLOR forgr
- EXIT SUB
- Digit0:
- AREA STEP(0,-stp):AREA STEP(0,-8*stp):AREA STEP(stp,-stp)
- AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,8*stp)
- AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
- AREAFILL
- PSET STEP(2*stp+1,-2-stp):AREA STEP(0,3-6*stp):AREA STEP(6*stp-3,0)
- AREA STEP(3-6*stp,6*stp-3):COLOR bckgr:AREAFILL
- PSET STEP(2*stp,1):AREA STEP(4*stp-2,2-4*stp):AREA STEP(0,4*stp-2)
- AREA STEP(2-4*stp,0):AREAFILL
- RETURN
- END
- Digit1:
- AREA STEP(0,-2*stp):AREA STEP(4*stp,0):AREA STEP(0,-5*stp)
- AREA STEP(-3*stp,0):AREA STEP(3*stp,-3*stp):AREA STEP(2*stp,0)
- AREA STEP(0,8*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp)
- AREA STEP(-10*stp,0):AREAFILL
- RETURN
- END
- Digit2:
- AREA STEP(0,-5*stp):AREA STEP(stp,-stp):AREA STEP(7*stp,0)
- AREA STEP(0,-2*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp)
- AREA STEP(-2*stp,0):AREA STEP(0,-2*stp):AREA STEP(stp,-stp)
- AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
- AREA STEP(-stp,stp):AREA STEP(-7*stp,0):AREA STEP(0,2*stp)
- AREA STEP(8*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
- AREAFILL
- RETURN
- END
- Digit3:
- AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp)
- AREA STEP(-6*stp,0):AREA STEP(0,-2*stp):AREA STEP(6*stp,0)
- AREA STEP(0,-2*stp):AREA STEP(-8*stp,0):AREA STEP(0,-2*stp)
- AREA STEP(9*stp,0):AREA STEP(stp,stp):AREA STEP(0,3*stp)
- AREA STEP(-stp,stp):AREA STEP(stp,stp):AREA STEP(0,3*stp)
- AREA STEP(-stp,stp):AREA STEP(-9*stp,0)
- AREAFILL
- RETURN
- END
- Digit4:
- PSET STEP(6*stp,0),bcgr
- AREA STEP(0,-4*stp):AREA STEP(-6*stp,0):AREA STEP(0,-6*stp)
- AREA STEP(2*stp,0):AREA STEP(0,4*stp):AREA STEP(4*stp,0)
- AREA STEP(0,-4*stp):AREA STEP(2*stp,0):AREA STEP(0,4*stp)
- AREA STEP(2*stp,0):AREA STEP(0,2*stp):AREA STEP(-2*stp,0)
- AREA STEP(0,4*stp):AREA STEP(-2*stp,0)
- AREAFILL
- RETURN
- END
- Digit5:
- PSET STEP(0,-stp),bckgr
- AREA STEP(0,-2*stp):AREA STEP(2*stp,0):AREA STEP(0,stp)
- AREA STEP(6*stp,0):AREA STEP(0,-2*stp):AREA STEP(-7*stp,0)
- AREA STEP(-stp,-stp):AREA STEP(0,-5*stp):AREA STEP(10*stp,0)
- AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp)
- AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
- AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
- AREAFILL
- RETURN
- END
- Digit6:
- PSET STEP(0,-stp),bckgr
- AREA STEP(0,-8*stp):AREA STEP(stp,-stp):AREA STEP(9*stp,0)
- AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp)
- AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
- AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
- AREAFILL
- PSET STEP(2*stp,-stp):AREA STEP(1,-2*stp+1)
- AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(-6*stp+2,0)
- COLOR bckgr:AREAFILL
- RETURN
- END
- Digit7:
- AREA STEP(8*stp,-8*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp)
- AREA STEP(-2*stp,0):AREA STEP(0,-3*stp):AREA STEP(11*stp,0)
- AREA STEP(0,2*stp):AREA STEP(-8*stp,8*stp):AREA STEP(-3*stp,0)
- AREAFILL
- RETURN
- END
- Digit8:
- AREA STEP(0,-stp)
- AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(-stp,-stp)
- AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(8*stp,0)
- AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp)
- AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp)
- AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
- AREAFILL
- AREA STEP(1+2*stp,1-3*stp)
- AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0)
- COLOR bckgr:AREAFILL
- AREA STEP(0,1-6*stp):AREA STEP(6*stp-2,0)
- AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0)
- AREAFILL
- RETURN
- END
- Digit9:
- AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp)
- AREA STEP(-7*stp,0):AREA STEP(-stp,-stp):AREA STEP(0,-4*stp)
- AREA STEP(stp,-stp):AREA STEP(8*stp,0):AREA STEP(stp,stp)
- AREA STEP(0,8*stp):AREA STEP(-stp,stp):AREA STEP(-9*stp,0)
- AREAFILL
- PSET STEP(8*stp,-8*stp):AREA STEP(-1,2*stp-1)
- AREA STEP(2-6*stp,0):AREA STEP(0,2-2*stp):AREA STEP(6*stp-2,0)
- COLOR bckgr:AREAFILL
- RETURN
- END
- END SUB
- Plus:
- PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
- AREA STEP(4*stp,0):AREA STEP(0,-4*stp):AREA STEP(2*stp,0)
- AREA STEP(0,4*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp)
- AREA STEP(-4*stp,0):AREA STEP(0,4*stp):AREA STEP(-2*stp,0)
- AREA STEP(0,-4*stp):AREA STEP(-4*stp,0)
- COLOR clr2:AREAFILL
- RETURN
- END
- Minus:
- PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
- AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
- COLOR clr2:AREAFILL
- RETURN
- END
- Times:
- PSET(Xstart,Ystart),clr1:AREA STEP(0,-stp):AREA STEP(4*stp,-4*stp)
- AREA STEP(-4*stp,-4*stp):AREA STEP(0,-stp):AREA STEP(stp,0)
- AREA STEP(4*stp,4*stp):AREA STEP(4*stp,-4*stp):AREA STEP(stp,0)
- AREA STEP(0,stp):AREA STEP(-4*stp,4*stp):AREA STEP(4*stp,4*stp)
- AREA STEP(0,stp):AREA STEP(-stp,0):AREA STEP(-4*stp,-4*stp)
- AREA STEP(-4*stp,4*stp):AREA STEP(-stp,0)
- COLOR clr2:AREAFILL
- RETURN
- END
- Divide:
- PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
- AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
- COLOR clr2:AREAFILL
- CIRCLE(Xstart+5*stp,Ystart-9*stp),stp*1.4
- PAINT(Xstart+5*stp,Ystart-9*stp),clr2
- CIRCLE(Xstart+5*stp,Ystart-stp),stp*1.4
- PAINT(Xstart+5*stp,Ystart-stp),clr2
- RETURN
- END
- SetMenu:
- MENU 1,0,1,"Operation"
- MENU 1,1,1,"Addition"
- MENU 1,2,1,"Subtraction"
- MENU 1,3,1,"Multiplication"
- MENU 1,4,1,"Division"
- MENU 1,5,1,"Quit"
- MENU 2,0,1,"Maximum"
- MENU 2,1,1," 10"
- MENU 2,2,1," 100"
- MENU 2,3,1," Define"
- MENU 2,4,1,"Display"
- MENU ON
- RETURN
- END
- Op:
- oldchoice=MENU(1)
- IF oldchoice<3 AND Maximum>1000 THEN Maximum=1000
- IF oldchoice>2 AND Maximum>31 THEN Maximum=31
- RETURN
- END
- MaxNum:
- IF MENU(1)=1 THEN
- Maximum=10:RETURN
- END IF
- IF MENU(1)=2 THEN
- Maximum=100:IF oldchoice>2 THEN Maximum=31
- RETURN
- END IF
- IF MENU(1)=4 THEN GOSUB DisplayMaximum:RETURN
- TryAgain:
- LINE(5,120)-(130,140),bckgr,bf
- LOCATE 16,2:PRINT "Maximum Number";
- LOCATE 17,2:PRINT CHR$(62);" ";
- answTemporary=answer:ndTemporary=nd
- GOSUB GetAnswer:Maximum=answer:answer=answTemporary:nd=ndTemporary
- IF oldchoice<3 AND Maximum>1000 THEN TryAgain
- IF oldchoice>2 AND Maximum>31 THEN TryAgain
- LINE(5,120)-(150,152),bckgr,bf
- RETURN
- END
- ProcessMenu:
- MenuOn=MENU(0)
- ON MenuOn GOSUB Op,MaxNum
- MenuOn=0
- RETURN
- END
- DisplayMaximum:
- LOCATE 16,2:PRINT "Maximum Number";
- LOCATE 17,2:PRINT CHR$(62);" ";Maximum
- WHILE MOUSE(0)=0:WEND
- LINE(5,120)-(150,152),bckgr,bf
- RETURN
-
-
-