|
Volume Number: | 3 | |
Issue Number: | 12 | |
Column Tag: | Basic School |
Games for Teaching Children
By Dave Kelly, MacTutor Editorial Board
Happy 3rd Birthday MacTutor!!! I can hardly believe that MacTutor has been around for a whole 3 years. The Macintosh has certainly come a long way in that time. All the way from a puny 128K RAM model to the gobs of memory available for the Macintosh II. Let’s celebrate!
Every celebration should not be complete with out friends. First I thank all of you readers that have supported MacTutor these past years. But all of this would not be possible if not for the vision of one special, although fictitious character, Professor Mac. For those of you that have not met the Professor, turn to your front cover and take a look just in front of the big ‘M’ in MacTutor. The Professor started out teaching you Apple II Pascal in the “Apple Shoppe” (also published by David Smith). Since that time we’ve seen him popping in and out of the covers of MacTutor. (see Best of MacTutor Vol 1, pg. 1, 8, 13, 61, 71, 92, 107, 313; Best of MacTutor Vol 2, pg. 2, 20, 42, 357, 371-375; not to mention the numerous times the Professor appears at the end of each and every MacTutor column.
A few days ago, the Professor reminded me that I haven’t written any games lately. So what should the game do? Well, my oldest son, who was 3 (now age 6) when we started up MacTutor, is now in first grade. Thanks to vol. 1 no. 1, Kevin now knows his ABC’s. (see Best of MacTutor Vol 1, pg. 298). I guess besides learning to read the next thing that first graders learn to do is count. So a counting game!!!
Last week Kevin brought home some homework that was just type of game I was looking for. The problems showed a price tag with a price. To solve the problem, he had to cut and paste pictures of coins under the price tag to equal the amount on the tag. So Professor Mac’s coin game was born. The object of the game is to click on the fewest possible number of coins to equal the amount of money shown in the price tag. If too many coins are selected the answer is not wrong, but the program lets you know that you could have done it with fewer coins. If you know that you have too many coins you may subtract coins by clicking the radio button named subtract and clicking on the coin you want to remove. The game does require some ability to read. Children that don’t know their numbers will have problems with this. At least it passed my kid test Kevin loved it.
Fig. 1 Our coin game display
On the technical side: the program doesn’t have any real surprizes technically. However, there are a few annoyances that appear to be ZBasic’s fault. In fact, sometimes I wish I was writing in Pascal or C. The blow by blow description follows:
There are four PICT resources, a quarter, a dime, a nickel, and a penny, which are used. These resources should be installed in the application itself in order to work. Creation of the coins was done via Thunderscan® by clipping the scanned pictures into a resource file using ResEdit. The “Get Coin Resources” subroutine gets the handles to the resources by using the ROM function GETNAMEDRESOURCE. Each resource is then loaded into memory (from the disk). Each coin is displayed on right side of the screen to give you something to click on to select the coins in the game. The ZBasic PICTURE statement will display the PICT resources by using the handle for the resource which was retrieved with GETNAMED RESOURCE. The active area to select each coin is marked by the Qrect, Drect, Nrect and Prect rectangles. Here is where the first problem shows up. The SETRECT call is used to set up the coordinates of each rectangle. But the SETRECT parameters are mixed up. Inside Macintosh shows SetRect parameters as being left, top, right, bottom in that order (see IM page I-174), but the ZBasic manual says the ZBasic parameters for SETRECT are Top, Left, Bottom, Right. The call (fortunately) works like IM; there is a typo in the ZBasic manual, pg. E-169.
The event loop is established using menu, dialog and mouse events in the same way that has been demonstrated in other programs. There are a few funnies that show up though. In earlier versions of the program, when I was still working on it, I used MOUSE ON, MOUSE OFF to control the About menu dialog. The problem was that when the About dialog was closed the screen erased itself just after the refresh routine did its refresh. This left a blank where the dialog window was. The screen had been updated, but something in ZBasic was trying to do its own refresh (I guess?). When I turned off all the event trapping for the About routine, the screen refreshed properly. This appears to be one of those little obscure bugs in ZBasic that nobody has fixed yet. This one problem turned what should have been a few minutes of programming into several hours trying to figure out what was going on. The GETMOUSE routine turned out to be just the solution. I get the feeling that I should be writing all my code using the toolbox calls and leave the ZBasic routines to the cockroaches (or other ‘bugs’).
‘Professor Mac’s Coin Game ‘By Dave Kelly ‘ ©MacTutor, DEC.1987 ‘ For ZBasic™ version 4.0 WINDOW OFF COORDINATE WINDOW DEF MOUSE=-1 False=0:True=NOT False DIM Qrect%(3), Drect%(3), Nrect%(3), Prect%(3), Displayrect%(3) DIM 63 A$(4) Mousy=0:’Set up point record Mousx=0:’for mouse location WINDOW 1,””,(2,22)-(510,335),4 CALL SETRECT(Qrect(0),388,0,510,80) CALL SETRECT(Drect(0),388,81,510,140) CALL SETRECT(Nrect(0),388,141,510,215) CALL SETRECT(Prect(0),388,216,510,310) CALL SETRECT(Displayrect(0),0,140,385,250) BUTTON 1,0,”Add Coins”,(300,80)-(375,100),2 BUTTON 2,0,”Subtract”,(300,110)-(375,130),2 APPLE MENU “About Professor Mac’s Coins ” MENU 1,0,1,”File” MENU 1,1,1,”New Amount/N” MENU 1,2,1,”Quit/Q” EDIT MENU 2 Amount!=0 GOSUB “Get Coin Resources” GOSUB “Draw Page” ON MENU GOSUB “MenuEvent” ON DIALOG GOSUB “DialogEvent” ON MOUSE GOSUB “MouseEvent” MENU ON:DIALOG ON:MOUSE ON DO UNTIL TheEnd MENU OFF:DIALOG OFF:MOUSE OFF END “MenuEvent” Menunumber=MENU(0) Menuitem=MENU(1) MENU SELECT Menunumber CASE 255 GOSUB “AppleMenu” GOSUB “Display Amount” GOSUB “Draw Page” CASE 1 GOSUB “FileMenu” CASE 2 END SELECT RETURN “AppleMenu” WINDOW 2,””,(100,40)-(415,310),-2 TEXT 0,12 PRINT @(5,1)”Professor Mac’s Coin Game” PRINT @(10,2)”by” PRINT @(8,3)”Dave Kelly” PRINT @(7,4)”©MacTutor, 1987" PRINT @(7,5)”ZBasic version 4.0" PRINT @(3,8)”Professor Mac’s MacTutor Store will” PRINT @(3,9)”display prices on the price tag.” PRINT @(3,10)”The object is to select (by clicking)” PRINT @(3,11)”the fewest number of coins to equal” PRINT @(3,12)”the price. Hopefully this may be of” PRINT @(3,13)”assistance to children first learning” PRINT @(3,14)”about money.” DO CALL GETMOUSE(Mousy) outsiderect=(Mousx<0 OR Mousx>300 OR Mousy<0 OR Mousy>270) UNTIL FN BUTTON AND NOT (outsiderect) WINDOW CLOSE 2 RETURN “FileMenu” SELECT Menuitem CASE 1 GOSUB “New” CASE 2 GOSUB “Quit” END SELECT RETURN “Quit” ‘Release all resource handles CALL RELEASERESOURCE(QHndl&) CALL RELEASERESOURCE(DHndl&) CALL RELEASERESOURCE(NHndl&) CALL RELEASERESOURCE(PHndl&) CALL RELEASERESOURCE(THndl&) CALL RELEASERESOURCE(MHndl&) END “New” RANDOMIZE TIMER Amount!=RND(100)*.01 Add=True NumOfQ%=0 NumOfD%=0 NumOfN%=0 NumOfP%=0 Total!=0 GOSUB “Display Amount” GOSUB “Display Total” GOSUB “Draw Display” BUTTON 1,2 BUTTON 2,1 RETURN “DialogEvent” Dilg=DIALOG(0) SELECT Dilg CASE 5 RefWin=DIALOG(5) ‘Get window to refresh WINDOW 1 GOSUB “Display Amount” GOSUB “Draw Page” CASE 1 Buttonpressed=DIALOG(1) BUTTON Buttonpressed,2 LONG IF Buttonpressed=1 BUTTON 2,1 Add=True XELSE BUTTON 1,1 Add=False END IF END SELECT RETURN “Display Amount” TEXT 3,24,1,0 PICTURE (60,50),THndl& CALL MOVETO (130,100) PRINT USING “$#.##”;Amount!;SPC(2) RETURN “Display Total” TEXT 2,12,1,0 CALL MOVETO(5,285) PRINT NumOfQ;” Quarters, “; NumOfD;” Dimes, “; NumOfN; “ Nickels, “; NumOfP;” Pennies” CALL MOVETO(5,300) PRINT “Total:”;USING “$#.##”;Total! ‘Check for winner IF Total!=Amount! AND Total!<>0 THEN GOSUB “WinDialog” RETURN “WinDialog” Temp!=Amount! CorrectNumOfQ%=Temp!/.25 Temp!=Temp!-CorrectNumOfQ%*.25 CorrectNumOfD%=Temp!/.1 Temp!=Temp!-CorrectNumOfD%*.1 CorrectNumOfN%=Temp!/.05 Temp!=Temp!-CorrectNumOfN%*.05 CorrectNumOfP%=Temp!*100 LONG IF NumOfQ%=CorrectNumOfQ% AND NumOfD%= CorrectNumOfD% AND NumOfN%= CorrectNumOfN% AND NumOfP%= CorrectNumOfP% A$(1)=”TA-DA! You Did it!” A$(2)=”Select ‘New Amount’ to start again” A$(3)=”” A$(4)=”” CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4)) Response%=FN ALERT(1,0) XELSE A$(1)=”Nice Try!” A$(2)=”You have too many coins!” A$(3)=”You should have: “+ STR$(CorrectNumOfQ%)+ “ Quarters, “ +STR$(CorrectNumOfD%)+ “ Dimes,” A$(4)=STR$(CorrectNumOfN%)+” Nickels, “+ STR$(CorrectNumOfP%)+” Pennies” CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4)) Response%=FN ALERT(1,0) END IF Amount!=0 BUTTON 1,0 BUTTON 2,0 RETURN “TooMuchDialog” A$(1)=”Adding that coin will give you “+ USING “$#.##”;Total! A$(2)=”Try a different coin!” A$(3)=” “ A$(4)=” “ CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4)) Response%=FN ALERT(1,0) RETURN “No More Coins” A$(1)=”Sorry, You don’t have any more “+Coin$ A$(2)=” “ A$(3)=” “ A$(4)=” “ CALL PARAMTEXT(A$(1),A$(2),A$(3),A$(4)) Response%=FN ALERT(1,0) RETURN “Get Coin Resources” QHndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Quarter”) CALL LOADRESOURCE(QHndl&) DHndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Dime”) CALL LOADRESOURCE(DHndl&) NHndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Nickel”) CALL LOADRESOURCE(NHndl&) PHndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Penny”) CALL LOADRESOURCE(PHndl&) THndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Tag”) CALL LOADRESOURCE(THndl&) MHndl&=FN GETNAMEDRESOURCE( CVI(“PICT”),”Professor Mac”) CALL LOADRESOURCE(MHndl&) RETURN “Draw Page” PICTURE (400,0),QHndl& PICTURE (406,78),DHndl& PICTURE (400,138),NHndl& PICTURE (406,220),PHndl& CALL MOVETO(385,0) CALL PENSIZE(2,2) CALL LINETO(385,340) CALL MOVETO(0,135) CALL LINETO(385,135) CALL PENNORMAL PICTURE (0,0),MHndl& CALL MOVETO(60,40) TEXT 2,18,0,0 PRINT “Professor Mac’s Coin Game” “Draw Display” CALL ERASERECT(Displayrect(0)) IF NumOfQ>0 THEN PICTURE (0,140),QHndl& IF NumOfD>0 THEN PICTURE (100,140),DHndl& IF NumOfN>0 THEN PICTURE (200,140),NHndl& IF NumOfP>0 THEN PICTURE (300,140),PHndl& RETURN “MouseEvent” IF Amount!=0 THEN FLUSHEVENTS:RETURN CALL GETMOUSE(Mousy) LONG IF (FN PTINRECT(Mousy,Qrect%(0))) LONG IF Add=True Total!=Total!+.25 NumOfQ=NumOfQ+1 GOSUB “Draw Display” XELSE LONG IF NumOfQ-1<0 Coin$=”Quarters!” GOSUB “No More Coins” XELSE NumOfQ=NumOfQ-1 Total!=Total!-.25 IF Total!<0 THEN Total!=Total!+.25 GOSUB “Draw Display” END IF END IF LONG IF Total!>Amount! GOSUB “TooMuchDialog” Total!=Total!-.25 NumOfQ=NumOfQ-1 END IF GOSUB “Display Total” END IF LONG IF FN PTINRECT(Mousy,Drect(0)) LONG IF Add=True Total!=Total!+.1 NumOfD=NumOfD+1 GOSUB “Draw Display” XELSE LONG IF NumOfD-1<0 Coin$=”Dimes!” GOSUB “No More Coins” XELSE NumOfD=NumOfD-1 Total!=Total!-.1 IF Total!<0 THEN Total!=Total!+.1 GOSUB “Draw Display” END IF END IF LONG IF Total!>Amount! GOSUB “TooMuchDialog” Total!=Total!-.1 NumOfD=NumOfD-1 END IF GOSUB “Display Total” END IF LONG IF FN PTINRECT(Mousy,Nrect(0)) LONG IF Add=True Total!=Total!+.05 NumOfN=NumOfN+1 GOSUB “Draw Display” XELSE LONG IF NumOfN-1<0 Coin$=”Nickels!” GOSUB “No More Coins” XELSE NumOfN=NumOfN-1 Total!=Total!-.05 IF Total!<0 THEN Total!=Total!+.05 GOSUB “Draw Display” END IF END IF LONG IF Total!>Amount! GOSUB “TooMuchDialog” Total!=Total!-.05 NumOfN=NumOfN-1 END IF GOSUB “Display Total” END IF LONG IF FN PTINRECT(Mousy,Prect(0)) LONG IF Add=True Total!=Total!+.01 NumOfP=NumOfP+1 GOSUB “Draw Display” XELSE LONG IF NumOfP-1<0 Coin$=”Pennies!” GOSUB “No More Coins” XELSE NumOfP=NumOfP-1 Total!=Total!-.01 IF Total!<0 THEN Total!=Total!+.01 GOSUB “Draw Display” END IF END IF LONG IF Total!>Amount! GOSUB “TooMuchDialog” Total!=Total!-.01 NumOfP=NumOfP-1 END IF GOSUB “Display Total” END IF DO:UNTIL NOT (FN BUTTON) FLUSHEVENTS RETURN
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine