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

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

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

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

SCREEN 13

' Карта
DATA 1,1,1,1,1,1,1,1
DATA 1,1,0,0,1,0,0,1
DATA 1,0,0,0,1,0,0,1
DATA 1,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,1
DATA 1,0,0,2,0,0,0,1
DATA 1,1,1,1,1,1,1,1

' Чтение карты
DIM map(8, 8)
FOR i = 1 TO 8
FOR j = 1 TO 8
  READ a%
  map(i, j) = a%

  ' Ставим игрока в центр квадрата
  IF a% = 2 THEN px = j + 0.5: py = i + 0.5
NEXT
NEXT

' Рисуем линии слева направо
FOR x = -160 TO 159

  z = 0
  dx = x / 160
  dz = -1

  ' Положение игрока в пространстве
  intx = INT(px): fx = px - intx
  inty = INT(py): fy = py - inty

  ' 16 шагов для поиска пересечения
  FOR i = 1 TO 16

    ' Минимальная дистанция
    IF dx > 0 THEN crx = (1 - fx) / dx ELSE IF dx < 0 THEN crx = -fx / dx ELSE crx = 100
    IF dz > 0 THEN cry = (1 - fy) / dz ELSE IF dz < 0 THEN cry = -fy / dz ELSE cry = 100

    ' Если ближе до грани по X
    IF crx < cry THEN

      z = z + crx
      fy = fy + crx * dz
      IF dx > 0 THEN intx = intx + 1: fx = 0 ELSE intx = intx - 1: fx = 1
      bounce = 0

    ELSE

      z = z + cry
      fx = fx + cry * dx
      IF dz > 0 THEN inty = inty + 1: fy = 0 ELSE inty = inty - 1: fy = 1
      bounce = 1

    END IF

    ' Есть пересечение
    IF map(inty, intx) = 1 THEN

      h = 100 / z
      LINE (160 + x, 100 - h)-(160 + x, 100 + h), 1 + bounce
      EXIT FOR

    END IF

  NEXT

NEXT