§ Что рисуется

Моск в Нарнии поплыл, протух и прокис (кис-кис)

Hint: можно двигать мышкой

§ Программный код

1SCREEN 13
2
3' Карта
4DATA 1,1,1,1,1,1,1,1
5DATA 1,1,0,0,1,0,0,1
6DATA 1,0,0,0,1,0,0,1
7DATA 1,0,0,0,0,0,0,1
8DATA 1,0,0,0,0,0,0,1
9DATA 1,0,0,0,0,0,0,1
10DATA 1,0,0,2,0,0,0,1
11DATA 1,1,1,1,1,1,1,1
12
13' Чтение карты
14DIM map(8, 8)
15FOR i = 1 TO 8
16FOR j = 1 TO 8
17  READ a%
18  map(i, j) = a%
19
20  ' Ставим игрока в центр квадрата
21  IF a% = 2 THEN px = j + 0.5: py = i + 0.5
22NEXT
23NEXT
24
25' Рисуем линии слева направо
26FOR x = -160 TO 159
27
28  z = 0
29  dx = x / 160
30  dz = -1
31
32  ' Положение игрока в пространстве
33  intx = INT(px): fx = px - intx
34  inty = INT(py): fy = py - inty
35
36  ' 16 шагов для поиска пересечения
37  FOR i = 1 TO 16
38
39    ' Минимальная дистанция
40    IF dx > 0 THEN crx = (1 - fx) / dx ELSE IF dx < 0 THEN crx = -fx / dx ELSE crx = 100
41    IF dz > 0 THEN cry = (1 - fy) / dz ELSE IF dz < 0 THEN cry = -fy / dz ELSE cry = 100
42
43    ' Если ближе до грани по X
44    IF crx < cry THEN
45
46      z = z + crx
47      fy = fy + crx * dz
48      IF dx > 0 THEN intx = intx + 1: fx = 0 ELSE intx = intx - 1: fx = 1
49      bounce = 0
50
51    ELSE
52
53      z = z + cry
54      fx = fx + cry * dx
55      IF dz > 0 THEN inty = inty + 1: fy = 0 ELSE inty = inty - 1: fy = 1
56      bounce = 1
57
58    END IF
59
60    ' Есть пересечение
61    IF map(inty, intx) = 1 THEN
62
63      h = 100 / z
64      LINE (160 + x, 100 - h)-(160 + x, 100 + h), 1 + bounce
65      EXIT FOR
66
67    END IF
68
69  NEXT
70
71NEXT