"Magic Square"
/Basic game/
Contributor : Antipontifex.
Code: Select all
1 SLOW
10 PRINT AT 0,8;"< MAGIC SQUARES >"
12 PRINT AT 2,14;"816"
13 PRINT AT 3,14;"357"
14 PRINT AT 4,14;"492"
16 PRINT AT 6,1;"IN THE MAGIC SQUARE SHOWN ABOVE"
17 PRINT AT 7,0;"EACH ROW, COLUMN AND DIAGONAL"
18 PRINT AT 8,0;"ADDS UP TO 15. THERE ARE MANY"
19 PRINT AT 9,0;"DIFFERENT KINDS AND SIZES OF"
20 PRINT AT 10,0;"MAGIC SQUARES AND IN THIS GAME I"
21 PRINT AT 11,0;"CAN MAKE THEM WITH UP TO 49 NUM-"
22 PRINT AT 12,0;"BERS. ONCE I HAVE MADE A MAGIC"
23 PRINT AT 13,0;"SQUARE I WILL DISPLAY IT TO YOU"
24 PRINT AT 14,0;"WITH SOME NUMBERS MISSING. THE"
25 PRINT AT 15,0;"GAME IS FOR YOU TO FILL IN THE"
26 PRINT AT 15,0;"MISSING NUMBERS AS QUICKLY AS"
27 PRINT AT 17,0;"POSSIBLE, IF YOU ARE QUICK YOU"
28 PRINT AT 18,0;"WILL BE PROMOTED TO THE NEXT"
29 PRINT AT 19,0;"BIGGER SQUARE. IF NOT, I WILL"
30 PRINT AT 20,0;"EITHER LEAVE YOU OR RELEGATE YOU"
31 PRINT AT 21,3;" ( PRESS RUN WHEN READY ) "
32 IF INKEY$<>"R" THEN GOTO 32
35 CLS
40 PRINT AT 0,8;"< MAGIC SQUARES >"
42 PRINT AT 2,1;"THE AIM OF THE GAME IS TO GET"
43 PRINT AT 3,0;"PROMOTED A HIGH AS POSSIBLE IN"
44 PRINT AT 4,0;"600 SECONDS. THERE ARE THREE"
45 PRINT AT 5,0;"DEGREES OF DIFFICULTY; START AS"
46 PRINT AT 6,0;"A BEGINNER. I WILL ADVISE YOU"
47 PRINT AT 7,0;"WHEN TO GO ON TO THE NEXT LEVEL."
49 PRINT AT 9,1;"EXAMPLE:"
50 PRINT AT 10,7;"MAGIC NUMBER IS 15"
51 PRINT AT 11,12;"«««««««"
52 PRINT AT 12,8;"ROW1«2+7+?«"
53 PRINT AT 13,8;"ROW2«9+5+?«"
54 PRINT AT 14,8;"ROW3«?+?+?«"
55 PRINT AT 15,12;"«««««««"
56 PRINT AT 16,0;"ROW1: 7+2=9 ; 15-9=6 ; SO ?=6"
57 PRINT AT 17,0;"ROW2: 9+5=14; 15-14=1; SO ?=1"
58 PRINT AT 18,0;"ROW3: 2+9=11; 15-11=4; SO ?=4"
59 PRINT AT 19,0;"ROW3: 7+5=12; 15-12=3; SO ?=3"
60 PRINT AT 20,0;"ROW3: 6+1=7 ; 15-7=8 ; SO ?=8"
61 PRINT AT 21,3;" < PRESS RUN WHEN READY > "
65 IF INKEY$<>"R" THEN GOTO 65
70 CLS
80 PRINT AT 12,0;"TYPE IN THE DEGREE OF DIFFICULTY"
82 PRINT AT 14,15;"B FOR BEGINNER"
84 PRINT AT 15,15;"E FOR EXPERT"
86 PRINT AT 16,15;"I FOR IMPOSSIBLE"
88 LET D$=INKEY$
90 IF D$="B" OR D$="E" OR D$="I" THEN GOTO 95
91 GOTO 88
95 LET Y=0
96 LET PREV=0
97 LET B=0
98 CLS
99 FAST
100 LET D=3
101 FOR J=0 TO 31
102 PRINT AT 9,J;"«"
103 IF J>=9 THEN GOTO 105
104 PRINT AT J,15;"«"
105 NEXT J
109 REM MAGIC SQUARE SETTING
110 LET X=1
120 LET ROW=1
121 FOR J=10 TO 20
122 PRINT AT J,0;" "
123 NEXT J
124 FAST
125 DIM I(D,D)
130 DIM M(D,D)
140 IF D=4 THEN GOTO 350
142 IF D=6 THEN GOTO 400
144 GOSUB 150
146 GOTO 500
150 LET C=INT(D/2)+1
160 LET M(ROW,C)=X
170 LET X=X+1
180 LET C=C+1
190 LET ROW=ROW-1
200 IF ROW<1 THEN GOTO 260
210 IF C>D THEN GOTO 290
220 IF M(ROW,C)>0 THEN GOTO 320
230 LET M(ROW,C)=X
240 IF X>=(D**2-0.1+Y) THEN RETURN
250 GOTO 170
260 IF C>D THEN GOTO 320
270 LET ROW=ROW+D
280 GOTO 230
290 LET C=C-D
300 GOTO 230
320 LET C=C-1
330 LET ROW=ROW+2
340 GOTO 230
350 REM FOURTH ORDER
352 FOR J=1 TO 4
353 FOR K=1 TO 4
354 LET M(J,K)=X+4*(J-1)+K-1
355 NEXT K
356 NEXT J
358 FOR J=1 TO 2
360 LET I(J,J)=M(J,J)
362 LET M(J,J)=M(5-J,5-J)
364 LET M(5-J,5-J)=I(J,J)
366 LET K=5-J
368 LET I(J,K)=M(J,K)
370 LET M(J,K)=M(K,J)
372 LET M(K,J)=I(J,K)
374 NEXT J
376 GOTO
400 REM SIXTH ORDER
410 LET D=3
420 GOSUB 150
430 LET D=6
432 FOR J=1 TO 3
434 FOR K=1 TO 3
436 LET M(J,K+3)=M(J,K)+18
438 LET M(J+3,K)=M(J,K)+27
440 LET M(J+3,K+3)=M(J,K)+9
442 NEXT K
444 NEXT J
446 FOR J=1 TO 3
448 LET K=1
450 IF J=2 THEN LET K=2
452 LET I(J,K)=M(J,K)
454 LET M(J,K)=M(J+3,K)
456 LET M(J+3,K)=I(J,K)
458 NEXT J
500 REM ROTATION AND REFLECTION
510 LET R=RND
520 LET S=RND
530 IF S>0.33 THEN GOTO 670
540 FOR J=1 TO D
550 FOR K=1 TO D
560 LET I(K,D+1-J)=M(J,K)
570 NEXT K
580 NEXT J
590 LET R=R-0.33
600 FOR J=1 TO D
610 FOR K=1 TO D
620 LET M(J,K)=I(J,K)
630 NEXT K
640 NEXT J
650 IF R>0.1 THEN GOTO 540
660 GOTO 800
670 IF S>0.66 THEN GOTO 740
680 FOR J=1 TO D
690 FOR K=1 TO D
700 LET I(D+1-J,K)=M(J,K)
710 NEXT K
720 NEXT J
730 GOTO 600
740 FOR J=1 TO D
750 FOR K=1 TO D
760 LET I(J,D+1-K)=M(J,K)
770 NEXT K
780 NEXT J
790 GOTO 600
800 REM PRINT ROUTINES
810 LET VL=17-2*D
820 LET VR=17+D
830 LET HU=14-INT(D/2)
840 LET HL=16+INT(D/2)
850 FOR J=VL TO VR
860 PRINT AT HU,J;"«"
870 PRINT AT HL,J;"«"
880 NEXT J
890 FOR J=1 TO D
900 FOR K=1 TO D
910 IF J=3 OR K=3 THEN GOTO 960
920 IF M(J,K)<10 THEN GOTO 950
930 PRINT AT HU+J,VL+1+(K-1)*3;M(J,K);"+"
940 GOTO 960
950 PRINT AT HU+J,VL+2+(K-1)*3;M(J,K);"+"
960 NEXT K
970 NEXT J
980 FOR J=HU TO HL
990 PRINT AT J,VL;"«"
1000 PRINT AT J,VR;"«"
1001 NEXT J
1005 PRINT AT 0,16;"TIME:"
1010 PRINT AT 2,17;"ALLOWED:600SECS"
1020 PRINT AT 1,17;"TAKEN :"
1030 PRINT AT 1,28;"SECS"
1100 REM MAGIC NUMBER
1110 LET MN=(D**3+D)/2+D*Y
1120 PRINT AT 1,2;"MAGIC NUMBER"
1130 PRINT AT 3,6;" "
1140 PRINT AT 3,5;"IS ";MN
1150 PRINT AT 6,3;"THE CLOCK"
1160 PRINT AT 7,2;"HAS STARTED"
1170 PRINT AT 21,0;"ENTER NUMBER THEN PRESS NEWLINE"
1200 REM TIMER SET AND ENTER ROUTINE
1210 POKE 16436,255
1220 POKE 16437,255
1230 SLOW
1240 LET J=3
1250 FOR K=1 TO D
1255 IF K=J THEN GOTO 1380
1260 LET A$="??"
1270 PRINT AT HU+J,VL+1+(K-1)*3;A$
1275 INPUT A
1280 LET TIME=PEEK 16436+256*PEEK 16437
1285 LET TOT=(65536-TIME)/45+PREV
1290 PRINT AT 1,25;INT(TOT)
1305 PRINT AT HU+J,VL+1+(K-1)*3;" "
1310 IF A=M(J,K) THEN GOTO 1350
1320 LET A$="LL"
1330 IF A>M(J,K) THEN LET A$="HH"
1340 GOTO 1270
1350 LET Z=1
1360 IF M(J,K)<10 THEN LET Z=2
1370 PRINT AT HU+J,VL+Z+(K-1)*3;M(J,K);
1374 IF K=D THEN GOTO 1380
1376 PRINT "+"
1380 NEXT K
1400 LET K=3
1410 FOR J=1 TO D
1420 LET A$="??"
1430 PRINT AT HU+J,VL+1+(K-1)*3;A$
1435 INPUT A
1440 LET TIME=PEEK 16436+256*PEEK 16437
1445 LET TOT=(65536-TIME)/45+PREV
1450 PRINT AT 1,25;INT(TOT)
1465 PRINT AT HU+J,VL+1+(K-1)*3;" "
1470 IF A=M(J,K) THEN GOTO 1510
1480 LET A$="LL"
1490 IF A>M(J,K) THEN LET A$="HH"
1500 GOTO 1430
1510 LET Z=1
1520 IF M(J,K)<10 THEN LET Z=2
1530 PRINT AT HU+J,VL+Z+(K-1)*3;M(J,K);
1534 IF D=3 THEN GOTO 1540
1536 PRINT "+"
1540 NEXT J
1550 PRINT AT 21,0;" "
1560 PRINT AT 7,9;"OPP"
1600 REM EVALUATION
1610 IF (65536-TIME)/45>D**3*2 THEN GOTO 1680
1620 IF (65536-TIME)/45<D**3 THEN GOTO 1660
1630 LET B=B+1
1640 LET X=INT (0.5*(RND*((CODE D$-38)**2+1)))+1
1645 LET Y=X-1
1650 GOTO 1710
1660 LET D=D+1
1670 GOTO 1690
1680 LET D=D-1
1690 LET B=0
1700 LET X=INT(RND*((CODE D$-38)**2+1))+1
1705 LET Y=X-1
1710 LET PREV=TOT
1720 IF D=8 THEN GOTO 1910
1730 IF D=2 THEN LET D=3
1740 IF D=3 THEN LET B$=" NOVICE "
1750 IF D=5 THEN LET B$=" EXPERT "
1760 IF D=6 THEN LET B$=" MASTER "
1770 IF D=7 THEN LET B$="GRAND MASTER"
1780 IF D=4 THEN LET B$=" CHALLENGER"
1790 PRINT AT 4,19;"YOU ARE A"
1795 IF D=5 THEN PRINT AT 4,27;"AN"
1800 PRINT AT 5,17;B$
1810 PRINT AT 6,18;"OF THE MAGIC"
1812 PRINT AT 7,17;"SQUARE-CLASS ";D$
1825 PRINT AT 8,16;" "
1826 IF B=0 THEN GOTO 1835
1830 PRINT AT 8,19;"WITH ";B;" BAR"
1835 FOR J=1 TO 50
1836 NEXT J
1840 IF PREV<600 THEN GOTO 120
1850 PRINT AT 1,2;"END OF GAME"
1860 PRINT AT 3,3;"TYPE S TO"
1870 PRINT AT 4,4;"RESTART"
1890 IF INKEY$<>"S" THEN GOTO 1890
1900 GOTO 95
1910 PRINT AT 1,2;" EXCELLENT "
1920 PRINT AT 3,3;"TRY NEXT "
1930 PRINT AT 4,3;"DEGREE OF"
1940 PRINT AT 5,3;"DIFFICULTY"
1945 PRINT AT 6,3;" "
1950 PRINT AT 7,2;" TYPE RUN "
1960 IF INKEY$<>"R" THEN GOTO 1960
1970 GOTO 70
9998 SAVE"MAGICSQUARE"
9999 RUN