Геннадий, вот одна из моих самых первых программ (храню как память о тех временах) Можете оценить степень хаоса в голове самоучки во время первых шагов в программировании, когда рядом нет никого знающего. Эта программа примечательна тем, что тут я впервые столкнулся со сложностью логики.
Игра "Змейка"
Код:
CLS
SCREEN 12
RANDOMIZE TIMER
DIM h(490): DIM v(388)
FOR v = 2 TO 390 STEP 6
vi = vi + 1
hi = 0
FOR h = 2 TO 492 STEP 6
hi = hi + 1
h(hi) = h
PSET (h, v), 8
FOR z = 1 TO 50: NEXT z
NEXT h
v(vi) = v
NEXT v
DIM x(100): DIM y(100)
DIM nelzax(1000): DIM nelzay(1000)
KEY(4) ON: ON KEY(4) GOSUB pause
KEY(11) ON: ON KEY(11) GOSUB vverch
KEY(12) ON: ON KEY(12) GOSUB vlevo
KEY(13) ON: ON KEY(13) GOSUB vpravo
KEY(14) ON: ON KEY(14) GOSUB vniz
ON TIMER(15) GOSUB tuhloe
LINE (1, 1)-(489, 387), 15, B
LINE (2, 2)-(488, 386), 7, B
LINE (3, 3)-(487, 385), 8, B
PAINT (4, 4), 2, 8
live = 5
nachalo:
x = 236: y = 158
FOR n = 1 TO 4
x(n) = 230
y(n) = 152
NEXT n
dy = -6
n = 0
d = 4
c = 6
DO
LOOP UNTIL INKEY$ = CHR$(13)
GOSUB yabloco
WHILE INKEY$ <> CHR$(27)
IF x = h(hi) AND y = v(vi) AND clr = 1 THEN d = d + 3: TIMER OFF: c = 1: GOSUB yabloco
IF x = h(hi) AND y = v(vi) AND clr = 4 THEN d = d + 6: TIMER OFF: c = 6: GOSUB yabloco
IF c = 1 THEN GOSUB ponos
n = n + 1
IF x(n + 1) = 0 THEN x(n + 1) = -10
x = x + dx: y = y + dy
GOSUB proverka
x(n) = x: y(n) = y
IF n = d THEN n = 0
x1 = x(n + 1): y1 = y(n + 1)
CIRCLE (x, y), 2, c
CIRCLE (x, y), 1, c
PSET (x - 1, y - 1), c: PSET (x + 1, y + 1), c: PSET (x + 1, y - 1), c: PSET (x - 1, y + 1), c: PSET (x, y), c
CIRCLE (x1, y1), 2, 2
CIRCLE (x1, y1), 1, 2
PSET (x1 - 1, y1 - 1), 2: PSET (x1 + 1, y1 + 1), 2: PSET (x1 + 1, y1 - 1), 2: PSET (x1 - 1, y1 + 1), 2: PSET (x1, y1), 8
FOR i = 1 TO 5000: NEXT i
WEND
END
vverch:
IF dy <> 6 THEN dy = -6: dx = 0
RETURN
vniz:
IF dy <> -6 THEN dy = 6: dx = 0
RETURN
vlevo:
IF dx <> 6 THEN dx = -6: dy = 0
RETURN
vpravo:
IF dx <> -6 THEN dx = 6: dy = 0
RETURN
yabloco:
clr = 4
zan:
vi = 2 + RND * 61: hi = 2 + RND * 78
FOR prov = 1 TO d
IF h(hi) = x(prov) OR v(vi) = y(prov) THEN GOTO zan
NEXT prov
tuh:
CIRCLE (h(hi), v(vi)), 2, clr
CIRCLE (h(hi), v(vi)), 1, clr
PSET (h(hi) - 1, v(vi) - 1), clr: PSET (h(hi) + 1, v(vi) + 1), clr: PSET (h(hi) + 1, v(vi) - 1), clr: PSET (h(hi) - 1, v(vi) + 1), clr: PSET (h(hi), v(vi)), clr
TIMER ON
RETURN
proverka:
IF live = 0 THEN END
IF x > 3 AND x < 487 AND y = 2 OR y = 386 THEN live = live - 1: GOTO nachalo
IF y > 3 AND y < 385 AND x = 2 OR x = 488 THEN live = live - 1: GOTO nachalo
FOR prov = 1 TO d
IF x = x(prov) AND y = y(prov) THEN END
NEXT prov
FOR prov = 1 TO kolvo
IF x = nelzax(prov) AND y = nelzay(prov) THEN END
NEXT prov
RETURN
pause:
WHILE INKEY$ <> CHR$(13)
WEND
RETURN
ponos:
naugad = RND * 1000
IF naugad > 500 AND naugad < 600 THEN
CIRCLE (x1, y1), 1, 0: CIRCLE (x1, y1), 2, 0: kolvo = kolvo + 1: nelzax(kolvo) = x1: nelzay(kolvo) = y1
PSET (x1 - 1, y1 - 1), 0: PSET (x1 + 1, y1 + 1), 0: PSET (x1 + 1, y1 - 1), 0: PSET (x1 - 1, y1 + 1), 0: PSET (x1, y1), 0
END IF
RETURN
tuhloe:
clr = 1
GOTO tuh
END