Как написать игру для ZX Spectrum 1994 г.

Приложение 1 - игровая программа "МАКСИТ".


МАКСИТ

Начнем с того, что запишем на ленту маленькую программу-загрузчик: 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:"




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
For Coderz - CD video на ZX. Как написать плеер видео с компакт-диска.
Вступление - содержание номера.
АОС - ассоциация Омских спектрумистов.
Вступление - MOVE - празднует пол года своего существования.
Письмо №291

В этот день...   21 ноября