§ Скриншоты


§ Код игры на Бейсике

10 BORDER 0: PAPER 0: INK 7: CLS
20 DIM a(16, 2)
30 DIM b(16, 2)
40 LET a(1,1)=1: LET a(1,2)=1
50 FOR i=0 TO 31: PRINT AT 0,i;"*": PRINT AT 20,i;"*": NEXT i
60 FOR i=0 TO 20: PRINT AT i,0;"*": PRINT AT i,31;"*": NEXT i
70 LET n=1
80 FOR i=1 TO 8
90 LET b(i,1)=2+INT(RND*28)
100 LET b(i,2)=2+INT(RND*18)
110 PRINT AT b(i,2), b(i,1); "x"
120 NEXT i
130 LET x=16
140 LET y=8
160 LET t=1: LET h=1
170 PRINT AT a(t,2), a(t,1); " "
180 LET t=t+1: IF t>15 THEN LET t=1
190 LET h=h+1: IF h>15 THEN LET h=1
200 LET i$=INKEY$
210 IF i$="1" THEN LET n=1
220 IF i$="2" THEN LET n=2
230 IF i$="3" THEN LET n=3
240 IF i$="4" THEN LET n=4
250 IF n=1 THEN LET x=x-1
260 IF n=2 THEN LET y=y-1
270 IF n=3 THEN LET y=y+1
280 IF n=4 THEN LET x=x+1
290 IF x<1 OR y<1 OR x=31 OR y=20 THEN STOP
300 LET a(h,1)=x: LET a(h,2)=y
310 PRINT AT a(h,2), a(h,1); "@"
320 FOR i=1 TO 8
330 IF b(i,1)=x AND b(i,2)=y THEN LET b(i,1)=0: GO TO 190
340 NEXT i
350 GO TO 170

§ Описание алгоритма

Змейка реализована в виде передвижения по массиву a(). Указывается индекс начала h и конца (хвост) t. При каждом движении змейки передвигается h++ и t++, при этом удаляется символ из адреса, который был в a(t) и ставится новый адрес символа в a(h). При достижении h=16, циклично переворачивается в h=1, так же с t. Если змейка съедает фрукт, то тогда прибавляется только h, хвост остается в неизменной позиции t и не стирается символ.
Такой подход позволяет передвигать только индексы (два индекса), и рисовать минимальное количество раз - только голову и удаление хвоста. Поскольку Бейсик спектрума работает крайне медленно, это единственное быстрое решение.