МАКСИТ
Начнем с того, что запишем на ленту маленькую программу-загрузчик: 10 LOAD ""CODE 16384 20 LOAD ""
В этой программе строка 10 загружает в экранную область памяти (с адреса 16384) картинку-заставку, а строка 20 - игровую программу МАКСИТ. Таким образом, после программы-загрузчика на ленте должен располагаться созданный вами ранее (см. главу 2) экранный файл, а вслед за ним - программа МАКСИТ, текст которой приводится ниже.
После загрузки игры на экране появляется поле в виде таблицы чисел 8x8 клеток и курсор в левом нижнем углу.
Каждое число задается программой случайным образом, но в пределах от 0 до 9. Справа от игрового поля выводятся имена играющих и набранные каждым из них очки. Играющие по очереди выбирают числа, причем выбранное число удаляется с игрового поля и прибавляется к счету играющего. Побеждает тот, кто набрал к концу игры большее количество очков.
Первый играющий может перемещать курсор только по горизонтали, выбирая любое число в строке. Его партнер может перемещать курсор только по вертикали и должен выбрать одно из чисел в столбце, отмеченном курсором. Можно играть, задав ограниченное время размышления над каждым ходом, для этого пригодится «секундомер», показывающий общее время игры (он расположен справа в нижней части экрана).
Программа 36. МАКСИТ.
10 POKE 23658,8
15 DIM q$(2,10): DIM t$(8,10): DIM O(8): DIM k$(6) 20 GO SUB 9050 30 LET kol=1
40 PAPER 0: INK 3: OVER 0: FLASH 0: BRIGHT 0: BORDER 0 50 CLS
60 LET w$="": LET v$="": LET i=0 70 LET wx=12: LET wy=18 100 LET c=6: GO SUB 9000
110 PRINT AT 0,0;"*********** nnMAKSITnn* **********"
115 PRINT #0;AT 1 0INK 7-kol; "********************************"
120 RESTORE 9910:'gO SUB 9600'
130 LET x$="OFF": IF kol=1 THEN LET x$="ON"
140 PRINT AT row+7,col+11; INK 8; PAPER 8;x$
160 LET c=3: GO SUB 9000
170 IF INKEY$="1" THEN GO SUB 9120: GO TO 1000
171 IF INKEY$="2" THEN GO SUB 9120: GO TO 200
172 IF INKEY$="3" THEN GO SUB 9120: GO SUB 400: PAUSE 0: GO TO 100
173 IF INKEY$="4" AND kol=1 THEN GO SUB 9120: LET kol=0: GO TO 50
174 IF INKEY$="4" AND kol=0 THEN GO SUB 9120: LET kol=1: GO TO 50
175 IF INKEY$="6" THEN GO SUB 9120: STOP
176 IF INKEY$="5" THEN GO SUB 9120: GO TO 700 180 GO SUB 9500
190 GO TO 170
200 REM ----DEFINE KEYS----
210 RESTORE 9920: GO SUB 9600
215 LET p=3
220 FOR m=1 TO 6
222 IF m=3 THEN LET p=5
225 PRINT AT (M-1)*2+row+p,col+12; INK 8; PAPER 8;"?"
230 PAUSE 0: LET b$=INKEY$
240 IF m=1 THEN GO TO 270
250 FOR n=1 TO m-1: IF b$=k$(n) THEN GO TO 230
260 NEXT n
270 IF b$<" " AND CODE b$<>13 THEN GO TO 230 280 LET k$(m)=b$
290 IF b$=" " THEN LET b$="SPACE" 300 IF CODE b$=13 THEN LET b$="ENTER" 310 GO SUB 9200
320 PRINT AT (M-1)*2+row+p,col+12; INK 8; PAPER 8;b$ 330 NEXT m 340 GO TO 100
400 REM ---- HI SCORE ----
410 RESTORE 9930: GO SUB 9600
420 PRINT AT 6,8; PAPER 8; INK 8;"N1 ";t$(1);TAB 22;o(1) 430 LET c=6: GO SUB 9000 440 FOR n=2 TO 8
445 PRINT AT n*2+4,8; PAPER 8; INK 8;"N";n;" ";t$(n);TAB 22;o(n) 450 NEXT n 452 LET cc=0
465 IF kol=0 THEN PAUSE 3: RETURN
470 IF cc>4 THEN LET cc=0
472 INK cc: LET cc=cc+1
475 PRINT AT row+1,col+7; PAPER 8;"HI SCORE"
480 IF INKEY$="" AND 1=0 THEN GO TO 470
485 GO SUB 9120
490 RETURN
700 REM -- SET TIME --710 RESTORE 9940: GO SUB 9600 720 LET c$="": PRINT AT row+1,col+14; 730 FOR n=1 TO 6 740 PAUSE 0: LET b$=INKEY$ 750 IF b$<"0" OR b$>"9" THEN GO TO 740 760 LET c$=c$+b$ 770 PRINT PAPER 8; INK 8;b$; 780 IF n=2 OR n=4 THEN PRINT PAPER 8; INK 8;":"; 785 GO SUB 9120 790 NEXT n
800 LET ch=VAL c$( TO 2)
820 LET min=VAL c$(3 TO 4)
830 LET s=VAL c$(5 TO )
840 IF ch>24 OR min>60 OR s>60 THEN GO TO 700
850 LET tim=(ch*3600+min*60+s)*50
860 POKE 23674,INT (tim/65536): LET tim=tim-PEEK 23674*65536 870 POKE 23673,INT (tim/256): LET tim=tim-PEEK 23673*256 880 POKE 23672,INT tim 890 GO TO 100
1000 REM ---- START GAME ---1001 FOR N=1 TO 24: RANDOMIZE USR 3582: BEEP .02,N: NEXT N 1005 LET wx=20: LET wy=16 1010 CLS
1020 GO SUB 9300
1030 CLS
1040 DIM Z(8,8)
1050 FOR n=1 TO 8
1060 FOR m=1 TO 8
1070 LET z(m,n)=INT (RND*10)
1075 PRINT AT n*2,m*2;z(m,n)
1080 NEXT m
1090 NEXT n
1095 LET c=6: GO SUB 9000
1100 FOR n=163 TO 35 STEP -16
1110 PLOT 12,n: DRAW 128,0
1120 NEXT n
1130 FOR n=12 TO 140 STEP 16
1140 PLOT n,35: DRAW 0,128
1150 NEXT n
1151 PAPER (7-6*kol): LET c=6: GO SUB 9000
1152 PRINT AT 3,19;"nnnnnnnnnn": REM 10 SPACE
1153 PRINT AT 8,19;"nnnnnnnnnn": REM 10 SPACE
1155 IF kol=0 THEN INK 0
1156 PRINT AT 3,19;v$
1157 PRINT AT 8,19;u$ 1160 LET z(1,8)=10
1170 PRINT AT 16,2;" "
1171 LET c=6: GO SUB 9000
1172 PLOT 145,35: DRAW 0,128
1174 DRAW 93,0: DRAW 0,-128
1175 DRAW -93,0
1180 LET x=1: LET y=8 1190 LET x1=x: LET y1=y 1200 LET pl=1 1220 DIM u(2) 1300 REM ---1310 LET c=6: GO SUB 9000 1320 PAPER kol
1330 PRINT AT y*2,x*2; FLASH 1; OVER 1;" "
1335 IF pl=2 THEN GO TO 1360
1340 IF INKEY$=k$(1) THEN LET x=x-1: GO TO 1400
1350 IF INKEY$=k$(2) THEN LET x=X+1: GO TO 1400
1352 IF INKEY$=k$<5> THEN GO TO 1750
1354 IF INKEY$=k$(6) THEN GO TO 1500
1355 GO SUB 9500
1356 GO TO 1340
1360 IF INKEY$=k$(3) THEN LET y=y-1: GO TO 1400
1365 IF INKEY$=k$(4) THEN LET y=y+1: GO TO 1400
1370 IF INKEY$=k$(5) THEN GO TO 1750
1375 IF INKEY$=k$(6) THEN GO TO 1500
1377 GO SUB 9500
1380 GO TO 1360
1390 REM -------------
1400 BEEP .0007,57
1405 GO SUB 9500
1406 IF x<1 OR x>8 OR y<1 OR y>8 THEN LET x=x1: LET y=y1:GO TO 1335 1430 PAPER 0: LET c=5: GO SUB 9000
1440 PRINT AT y1*2,x1*2; OVER 1;" "
1450 LET x1=x: LET y1=y
1460 GO TO 1310
1500 REM ------------
1505 BEEP .0006,55: BEEP .0007,30 1510 IF z(x,y)=10 THEN GO TO 1400 1520 PRINT AT y*2,x*2; FLASH 1;" "
1530 IF pl=1 THEN LET u(1)=u(1)+z(x,y): LET pl=2: GO TO 1600
1540 LET u(2)=u(2)+z(x,y): LET pl=1
1600 LET z(x,y)=10
1605 LET end=1
1610 FOR n=1 TO 8
1620 IF pl=1 THEN IF z(n,y)<>10 THEN LET end=0: GO TO 1640 1630 IF pl=2 THEN IF z(x,n)<>10 THEN LET end=0 1640 NEXT n 1690 REM --1700 INK 7: PAPER 0 1702 IF pl=1 THEN INVERSE 1 1705 PRINT AT 5,23;u(1): INVERSE 0 1707 IF pl=2 THEN INVERSE 1 1710 PRINT AT 10,23;u(2) 1715 INVERSE 0
1720 IF end=0 THEN GO TO 1400
1730 PAPER 0
1740 PRINT AT y*2,x*2;" "
1750 REM ---- SCORE ----
1760 LET q$(1)=v$: LET q$(2)=w$
1765 LET i=1: GO SUB 400
1770 FOR m=1 TO 2
1780 IF u(m)<o(8) THEN GO TO 1860
1790 LET j=8: FOR n=1 TO 8
1800 IF u(m)>o(n) THEN LET j=n: GO TO 1820
1810 NEXT n
1820 FOR n=8 TO j+1 STEP -1
1830 LET o(n)=o(n-1): LET t$(n)=t$(n-1)
1840 NEXT n
1850 LET t$(j)=q$(m): LET o(j)=u(m) 1855 PAUSE 100: BEEP .1,0: GO SUB 400
1860 NEXT m
1865 PAUSE 100 1870 GO TO 40
9000 REM ---- color ----
9010 IF kol=1 THEN INK c: RETURN
9020 INK 7
9030 RETURN
9050 REM .---- DIM DATA ----
9060 RESTORE 9110 9070 READ t$(1),o(1)
9080 FOR n=1 TO 6 9090 READ k$(n)
9095 NEXT n
9100 FOR n=2 TO 8: LET o(n)=0: LET t$(n) = "..........":NEXT n
9105 RETURN
9110 DATA "Igor K.",200,"0","P","Q","A","E","M" 9120 REM ---- BEEP 1 ---9130 BEEP .0004,55 9140 BEEP .0006,40 9150 BEEP .0004,55 9160 RETURN
9190 REM ---- BEEP 2 ----
9200 BEEP .0009,30 9210 BEEP .003,10
9220 BEEP .0009,45 9230 RETURN
9300 REM ---- YOU NAME ----
9310 FOR n=1 TO 2
9320 LET c=6: GO SUB 9000
9330 PRINT AT 8,13;"PLYER ";n
9340 PRINT AT 10,9;"ENTER YOU NAME:"
9350 LET c=2: GO SUB 9000
9360 PRINT AT 12,10;">nnnnnnnnnn<"
9365 INK 7
9370 PRINT AT 12,11;".........."
9375 LET c$=""
9380 LET c=5: GO SUB 9000
9390 FOR m=1 TO 10
9395 PAUSE 0: LET b$=INKEY$
9396 IF CODE b$=12 AND c$<>"" THEN LET c$=c$( TO LEN c$-1): LET m=m-2: GO TO 9405
9397 IF CODE b$=13 THEN GO TO 9430
9400 IF b$<" " OR b$>"Z" THEN GO TO 9395 9402 LET c$=c$+b$ 9405 GO SUB 9490
9408 PRINT AT 12,11;".........."
9410 PRINT AT 12,11;c$ 9420 NEXT m 9430 BEEP .01,10 9440 CLS
9450 IF n=1 THEN LET v$=c$: GO TO 9470 9460 LET w$=c$ 9470 NEXT n 9480 RETURN
9490 REM ---- BEEP 3 ----
9495 BEEP .002,10
9496 BEEP .003,20
9497 BEEP .004,30
9498 BEEP .005,40
9499 RETURN
9500 REM ---- TIME ----
9510 LET tim=(PEEK 23672+256*PEEK 23673+65536*PEEK 23674)/50
9520 LET ch=INT (tim/3600): LET min=INT ((tim-ch*3600)/60): LET s=INT (tim-ch*3600-
min*60)
9530 IF ch>=24 THEN POKE 23672,0: POKE 23673,0:POKE 23674,0: GO TO 9500 9540 PRINT AT wy,wx; INK 8; PAPER 8;("0" AND ch<10);ch;":";("0" AND min<10);min;":";("0" AND s<10);s 9550 RETURN
9600 REM ---- WINDOW ----
9610 READ row,col,hgt,len,ink,pap
9620 PAPER pap: INK ink
9630 IF kol=0 THEN PAPER 7: INK 0
9640 LET x$="": FOR n=1 TO len: LET x$=x$+" ": NEXT n
9650 FOR n=row TO row+hgt-1
9660 PRINT AT n,col;x$: NEXT n
9670 LET len1=len*8-3: LET hgt1=hgt*8-3
9680 PLOT (col*8+1),(174-row*8): DRAW len1,0: DRAW 0,-hgt1:DRAW -len1,0: DRAW 0,hgt1 9690 READ nn: FOR n=1 TO nn 9700 READ y,x,x$: PRINT AT row+y,col+x;x$ 9710 NEXT n 9720 PAPER 0: RETURN 9900 REM -- DATA WIND --9910 DATA 5,6,15,20,0,5
9911 DATA 6
9912 DATA 1,1,"1 - START GAME"
9913 DATA 3,1,"2 - REDEFINE KEYS"
9914 DATA 5,1,"3 - HI SCORE"
9915 DATA 7,1,"4 - COLOR"
9916 DATA 9,1,"5 - SET TIME"
9917 DATA 11,1,"6 - END OF GAME"
9920 DATA 4,7,17,18,0,3
9921 DATA 8
9922 DATA 1,1,"PLAYER 1"
9923 DATA 3,6,"LEFT:"
9924 DATA 5,5,"RIGHT:"
9925 DATA 7,1,"PLAYER 2"
9926 DATA 9,8,"UP:"
9927 DATA 11,6,"DOWN:"
9928 DATA 13,7,"END:"
9929 DATA 15,6,"FIRE:"
9930 DATA 3,5,19,22,7,1
9931 DATA 1
9932 DATA 1,7,"HI SCORE"
9940 DATA 10,3,3,26,7,2
9941 DATA 1
9942 DATA 1,1,"SET TIME:"