2023-07-12

vak: (Default)
Игру "посадка на Луну" написал в 1969 году семнадцатилетний американский школьник Джим Сторер. Изначально он назвал её Rocket, но позже игра стала известна как Lunar Landing. Написана игра была на языке Focal для компьютера PDP-8. Позже широко разошёлся вариант, переписанный на Бейсик. На БЭСМ-6 эта игра имелась в составе игровой системы Джин. Не так давно [personal profile] spamsink смог восстановить исходный бэсмовский код (landing.pas).

Игра довольно трудная. Чаще всего вы получаете результат вида:
SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!
IN FACT YOU BLASTED A NEW LUNAR CRATER 267.13 FT. DEEP
Чтобы результат считался приемлемым, остаточная скорость не должна превышать 22 мили в час: "CONGRATULATIONS ON A POOR LANDING". Пришлось припомнить бэсмовский опыт и потрудиться несколько дней, чтобы снизить скорость меньше 10 mph: "GOOD LANDING-(COULD BE BETTER)". Хитрость в том, что не нужно начинать тормозить прямо сразу, иначе вам не хватит топлива. Надо первые 70 секунд просто свободно падать. Со временем мне удалось достичь 4 mph. Но судя по исходникам, можно сесть ещё более мягко, ниже 1 mph.

Пришлось сварганить серьёзный оптимизатор, методом Монте-Карло подбирающий оптимальные величины расхода топлива на каждом шаге. Вот мой рекорд: 0.17 мили в час остаточной скорости прилунения. Будем запускать версию, переписанную с Фокала на Си. Скачаем с сайта самого Джима Сторера, ныне профессора университета Brandeis в Массачусетсе:
$ wget https://www.cs.brandeis.edu/~storer/LunarLander/LunarLanderTranslations/LunarLanderJohnsonTranslation-c.txt 
$ mv LunarLanderJohnsonTranslation-c.txt rocket.c
$ cc rocket.c -o rocket
$ ./rocket
CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY
YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE
BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED
FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS


FIRST RADAR CHECK COMING UP


COMMENCE LANDING PROCEDURE
TIME,SECS ALTITUDE,MILES+FEET VELOCITY,MPH FUEL,LBS FUEL RATE
0 120 0 3600.00 16000.0 K=:0
10 109 5016 3636.00 16000.0 K=:0
20 99 4224 3672.00 16000.0 K=:0
30 89 2904 3708.00 16000.0 K=:0
40 79 1056 3744.00 16000.0 K=:0
50 68 3960 3780.00 16000.0 K=:0
60 58 1056 3816.00 16000.0 K=:0
70 47 2904 3852.00 16000.0 K=:200
80 37 1930 3476.43 14000.0 K=:200
90 28 1385 3072.94 12000.0 K=:189
100 20 1515 2664.30 10110.0 K=:189
110 13 2592 2222.89 8220.0 K=:177
120 7 4892 1777.47 6450.0 K=:183
130 3 3573 1274.99 4620.0 K=:198
140 0 5050 673.10 2640.0 K=:198
150 0 9 1.49 660.0 K=:10
ON THE MOON AT 157.20 SECS
IMPACT VELOCITY OF 0.17 M.P.H.
FUEL LEFT: 588.05 LBS
PERFECT LANDING !-(LUCKY)
Исходный текст программы на Фокале лежит здесь: LunarLanderListing.jpg

В игру можно играть онлайн на сайте: lunar69.uber.space/lunar.html