простенький homebrew tetris для начинающих

  • Автор темы Автор темы Ivan
  • Дата начала Дата начала

Ivan

Знаток
Пользователь
Сообщения
2
Счётчик реакций
0
Очки
50
возможно кому-то из начинающих будет интересно, в прошлом году начал изучать asm для zx, в качестве упражнения поставил задачу написать свой тетрис, исходный код тут страничка на zxart тут
 
на 256bytes.untergrund.net этих интро навалом.
 
Всем вечер добрый, уважаемые коллеги. В свое время ещё давно писал этот самый тетрис прямо на бейсике, код остался. Не помню уже сейчас точно полностью отлажен он или нет, но если вдруг будет кому интересно на него глянуть:
Бейсик ZX:
10 BORDER 0: PAPER 0: INK 7: CLS
20 DIM b(10,20): DIM s(7,3,3): DIM c(7)
30 FOR f=1 TO 7: READ c(f): FOR y=0 TO 3: FOR x=0 TO 3: READ s(f,y,x): NEXT x: NEXT y: NEXT f
40 DATA 4,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0
50 DATA 3,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0
60 DATA 3,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0
70 DATA 3,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0
80 DATA 5,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0
90 DATA 5,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0
100 DATA 6,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0
110 LET score=0: LET level=1: LET lines=0: LET game=1
120 PRINT AT 0,0;"SCORE:";score
130 PRINT AT 1,0;"LEVEL:";level
140 PRINT AT 2,0;"LINES:";lines
150 PRINT AT 4,0;"CONTROLS:"
160 PRINT AT 5,0;"A - LEFT"
170 PRINT AT 6,0;"D - RIGHT"
180 PRINT AT 7,0;"W - ROTATE"
190 PRINT AT 8,0;"S - DOWN"
200 PRINT AT 10,0;"P - PAUSE"
210 REM Рисуем игровое поле
220 FOR x=1 TO 10
230 FOR y=1 TO 20
240 PLOT (x-1)*8+32,(y-1)*8+32, 0
250 NEXT y
260 NEXT x
270 LET px=5: LET py=0: LET p=INT (RND*7)+1: LET r=0: LET speed=50
280 GO SUB 1000
290 IF NOT FN c(px,py+1) THEN LET py=py+1: GO SUB 2000: GO TO 280
300 GO SUB 3000
310 REM Проверяем заполненные линии
320 FOR y=20 TO 1 STEP -1
330 LET full=1
340 FOR x=1 TO 10
350 IF b(x,y)=0 THEN LET full=0
360 NEXT x
370 IF full THEN GO SUB 4000
380 NEXT y
390 REM Проверка конца игры
400 FOR x=1 TO 10
410 IF b(x,1)=1 THEN GO SUB 5000
420 NEXT x
430 REM Управление
440 LET k$=INKEY$
450 IF k$="a" AND FN c(px-1,py)=0 THEN GO SUB 2000: LET px=px-1: GO SUB 1000
460 IF k$="d" AND FN c(px+1,py)=0 THEN GO SUB 2000: LET px=px+1: GO SUB 1000
470 IF k$="w" THEN GO SUB 2000: LET r=(r+1) MOD 4: IF FN c(px,py) THEN LET r=(r+3) MOD 4
480 IF k$="w" THEN GO SUB 1000
490 IF k$="s" AND FN c(px,py+1)=0 THEN GO SUB 2000: LET py=py+1: GO SUB 1000
500 IF k$="p" THEN PAUSE 0: PRINT AT 12,0;"PAUSED": PAUSE 0: PRINT AT 12,0;"       "
510 REM Задержка для скорости падения
520 FOR f=1 TO speed-level*5: NEXT f
530 IF game THEN GO TO 270
540 STOP
1000 REM Рисуем фигуру
1010 FOR y=0 TO 3
1020 FOR x=0 TO 3
1030 IF s(p,r,y,x) THEN
1040 PLOT (px+x-1)*8+32,(py+y-1)*8+32, c(p)
1050 END IF
1060 NEXT x
1070 NEXT y
1080 RETURN
2000 REM Стираем фигуру
2010 FOR y=0 TO 3
2020 FOR x=0 TO 3
2030 IF s(p,r,y,x) THEN
2040 PLOT (px+x-1)*8+32,(py+y-1)*8+32, 0
2050 END IF
2060 NEXT x
2070 NEXT y
2080 RETURN
3000 REM Фиксируем фигуру на поле
3010 FOR y=0 TO 3
3020 FOR x=0 TO 3
3030 IF s(p,r,y,x) THEN
3040 LET b(px+x,py+y)=1
3050 PLOT (px+x-1)*8+32,(py+y-1)*8+32, c(p)
3060 END IF
3070 NEXT x
3080 NEXT y
3090 RETURN
4000 REM Удаляем заполненную линию
4010 BEEP 0.1,20
4020 LET score=score+100*level
4030 LET lines=lines+1
4040 IF lines MOD 10=0 THEN LET level=level+1: BEEP 0.2,30
4050 FOR yy=y TO 2 STEP -1
4060 FOR xx=1 TO 10
4070 LET b(xx,yy)=b(xx,yy-1)
4080 IF b(xx,yy) THEN
4090 PLOT (xx-1)*8+32,(yy-1)*8+32, 7
4100 ELSE
4110 PLOT (xx-1)*8+32,(yy-1)*8+32, 0
4120 END IF
4130 NEXT xx
4140 NEXT yy
4150 FOR xx=1 TO 10
4160 LET b(xx,1)=0
4170 PLOT (xx-1)*8+32,0, 0
4180 NEXT xx
4190 PRINT AT 0,6;"       "
4200 PRINT AT 1,6;"       "
4210 PRINT AT 2,6;"       "
4220 PRINT AT 0,6;score
4230 PRINT AT 1,6;level
4240 PRINT AT 2,6;lines
4250 RETURN
5000 REM Конец игры
5010 LET game=0
5020 BEEP 0.5,10: BEEP 0.5,5
5030 PRINT AT 12,0;"GAME OVER!"
5040 PRINT AT 13,0;"FINAL SCORE:";score
5050 PRINT AT 15,0;"PRESS ANY KEY"
5060 PAUSE 0
5070 RETURN
9000 DEF FN c(x,y)
9010 FOR yy=0 TO 3
9020 FOR xx=0 TO 3
9030 IF s(p,r,yy,xx) THEN
9040 IF x+xx<1 OR x+xx>10 OR y+yy>20 THEN LET FN c=1: RETURN
9050 IF b(x+xx,y+yy) THEN LET FN c=1: RETURN
9060 END IF
9070 NEXT xx
9080 NEXT yy
9090 LET FN c=0
 
Последний раз редактировалось модератором:
Назад
Вверх