Как написать игру для 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:"




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
C миру по биту - ответы на письма читателей.
И смех, и грех - Письмо в Военно-исторический форум.
Система - Обзор новых системок: Sprite Maker v4.0, Turbo Copier v2.0, Sample Studio, Art Works 1, Burst Eyes v1.2, Excess Sample Editor v1.4.25, Excess Deluxe Paint v1.1, Graphic Station, BA v1.0, Global Commander v1.31, Quick Commander v2.3, Stall Spriter v0.1, AGA v1.0, Ultra Sonic v0.1, Universal Sprite Studio v1.0, HRUST v1.1, STORM v1.3.
Эпилог - Будет пиво - будет и cweek!
Новелла - "Последняя битва" (по игре "Last Battle").

В этот день...   6 мая