Код Hamurabi

Jul 05, 2011 13:37

Это не прославленный свод законов шумерского царя Хаммурапи (Hammurabi Code), а код некогда популярной игры Hamurabi. Одна буковка m выпала из-за того, что до нашей эры имя файла состояло максимум из 8 букв.

Собственно код программы под катом. Захотелось посмотреть что это было, но перловой версии под руку как-то не попалось. Чаще всего выложены коды для Бейсика, видел джавовый, С и даже действующий Джаваскрипт - можно поиграть онлайн :-)
Перловку пришлось варить самому. Взял топор код на Бейсике и тупо-построчно заменил на соответствующие операторы Perl'а. Благо, что в Perl'е тоже есть оператор goto :-) Бейсиковые строчки я не удалял, а только закомментировал - можно сравнить при желании.

Все прелести "макаронного" программирования налицо. В давние-давние времена в книжном магазине попалась мне книжка про то, что программы должны быть похожи на моделируемые процессы. Я тогда не понял, что имелось в виду, но ознакомившись с этим листингом понял, с чем предлагали бороться авторы. Например, прямо посередение рутинного годового отчета в управляемом поселении случается эпидемия чумы - это действительно мало на что похоже.

#!/usr/bin/perl
#hamurabi.pl

#10 REM *** CONVERTED FROM THE ORIGINAL FOCAL PROGRAM AND MODIFIED
#20 REM *** FOR EDUSYSTEM 70 BY DAVID AHL, DIGITAL
#30 REM *** MODIFIED FOR 8K MICROSOFT BASIC BY PETER TURNBULL
#80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
#85 PRINT "SUCCESSFULLY FOR A 10-YR TERM OF OFFICE.":PRINT
#90 REM RANDOMIZE REMOVED

# режиссер дубляжа - vl.kamov

#95 D1=0:P1=0
$D1 = 0; $P1 = 0;

#110 Z=0:P=95:S=2800:H=3000:E=H-S
$Z = 0; $P=95; $S=2800; $H=3000; $E = $H - $S;

#120 Y=3:A=H/Y:I=5:Q=1
$Y = 3; $A = $H / $Y; $I=5; $Q=1;

#210 D=0
m210:
$D = 0;

#215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,":Z=Z+1
m215:
print "\n\nХамураппи: прошу отчитаться.\n"; $Z = $Z+1;

#217 PRINT "IN YEAR"Z","D"PEOPLE STARVED,"I"CAME TO THE CITY."
print "В ", $Z, " году ", $D, " человек умерло от голода, ", $I," прибыли в город.\n";

#218 P=P+I
$P = $P + $I;

#227 IF Q>0 THEN 230
goto m230 if $Q>0 ;

#228 P=INT(P/2)
$P = int ($P / 2);

#229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED."
print "Ужасная чума ! Половина народу умерло.\n";

#230 PRINT "POPULATION IS NOW"P
m230:
print "Сейчас население составляет ", $P, " человек\n";

#232 PRINT "THE CITY NOW OWNS"A"ACRES."
print "Город владеет ", $A, " акрами.\n";

#235 PRINT "YOU HARVESTED"Y"BUSHELS PER ACRE."
print "Вы собрали ", $Y, " бушелей с акра.\n";

#250 PRINT "RATS ATE"E"BUSHELS."
print "Крысы съели ", $E, " бушелей.\n";

#260 PRINT "YOU NOW HAVE"S"BUSHELS IN STORE.":PRINT
print "Сейчас ", $S, " бушелей в амбаре.\n\n";

#270 IF Z=11 THEN 860
goto m860 if $Z==11;

#310 C=INT(10*RND(1)):Y=C+17
$C = int (10* rand()); $Y = $C + 17;

#312 PRINT "LAND IS TRADING AT"Y"BUSHELS PER ACRE."
print "Земля торгуется по ", $Y, " бушелей за акр.";

#320 PRINT "HOW MANY ACRES DO YOU WISH TO BUY";
m320:
print "Сколько акров вы намерены купить ? ";

#321 INPUT Q:IF Q<0 THEN 850
$Q = ; goto m850 if $Q<0;

#322 IF Y*Q<=S THEN 330
goto m330 if $Y*$Q <= $S;

#323 GOSUB 710
m710();

#324 GOTO 320
goto m320;

#330 IF Q=0 THEN 340
m330:
goto m340 if $Q==0;

#331 A=A+Q:S=S-Y*Q:C=0
$A = $A + $Q; $S = $S - $Y*$Q; $C = 0;

#334 GOTO 400
goto m400;

#340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL";
m340:
print "Сколько акров вы намерены продать ? ";

#341 INPUT Q:IF Q<0 THEN 850
$Q = ; goto m850 if $Q<0;

#342 IF Q;

#412 IF Q<0 THEN 850
goto m850 if $Q < 0;

#418 REM *** TRYING TO USE MORE GRAIN THAN IN THE SILOS?
# попытка использовать больше зерна чем есть в хранилище

#420 IF Q<=S THEN 430
goto m430 if $Q <= $S;

#421 GOSUB 710
m710();

#422 GOTO 410
goto m410;

#430 S=S-Q:C=1:PRINT
m430:
$S = $S - $Q; $C = 1; print "\n";

#440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";
m440:
print "Сколько акров вы намерены засеять ?";

#441 INPUT D:IF D=0 THEN 511
$D = ; goto m511 if $D == 0;

#442 IF D<0 THEN 850
goto m850 if $D < 0;

#444 REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
# Пытаетесь засеять больше акров чем у вас есть

#445 IF D<=A THEN 450
goto m450 if $D <= $A;

#446 GOSUB 720
m720();

#447 GOTO 440
goto m440;

#449 REM *** ENOUGH GRAIN FOR SEED?
# хватит ли семян ?

#450 IF INT(D/2)C/2 THEN 530
goto m530 if (int($C/2) != $C/2);

#523 REM *** THE RATS ARE RUNNING WILD!!
# крысы идут !

#525 E=INT(S/C)
$E = int($S/$C);

#530 S=S-E+H
m530:
$S = $S - $E + $H;

#531 GOSUB 800
m800();

#532 REM *** LET'S HAVE SOME BABIES
# деторождение

#533 I=INT(C*(20*A+S)/P/100+1)
$I = int($C*(20*$A + $S)/$P/100 + 1);

#539 REM *** HOW MANY PEOPLE HAD FULL TUMMIES?
# сколько людей накормлено ?

#540 C=INT(Q/20)
$C = int($Q / 20);

#541 REM *** HORRORS, A 15% CHANCE OF PLAGUE
# ужас, 15% вероятность чумы

#542 Q=INT(10*(2*RND(1)-.3))
$Q = int(10*(2*rand() - 0.3));

#550 IF P.45*P THEN 560
$D = $P - $C; goto m560 if $D > 0.45*$P;

#553 P1=((Z-1)*P1+D*100/P)/Z
$P1 = (($Z - 1)*$P1 + $D*100/$P)/$Z;

#555 P=C:D1=D1+D:GOTO 215
$P = $C; $D1 = $D1 + $D; goto m215;

m560:
#560 PRINT:PRINT "YOU STARVED"D"PEOPLE IN ONE YEAR!!!"
print "Вы уморили ", $D, " людей за год !!!\n";

#565 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY"
#566 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE"
#567 PRINT "ALSO BEEN DECLARED 'NATIONAL FINK' !!":GOTO 990
m565:
print "Из-за чрезвычайно плохого управления вы не только\nподвергнуты импичменту и выброшены из резиденции, но также\nвы объявлены \"Предателем нации\" !!"; goto m990;

#710 PRINT "HAMURABI: THINK AGAIN. YOU HAVE ONLY"
#711 PRINT S"BUSHELS OF GRAIN. NOW THEN,"
#712 RETURN

sub m710{
print "Хамурапи: думайте снова. У вас только \n", $S, " бушелей зерна. Итак, \n";
}

#720 PRINT "HAMURABI: THINK AGAIN. YOU OWN ONLY"A"ACRES. NOW THEN,"
#730 RETURN

sub m720{
print "Хамурапи: думайте снова. У вас только \n", $A, " акров земли. Итак, \n";
}

#800 C=INT(RND(1)*5)+1
#801 RETURN

sub m800{
$C = int(rand()*5) + 1;
}

#850 PRINT:PRINT "HAMURABI: I CANNOT DO WHAT YOU WISH."
#855 PRINT "GET YOURSELF ANOTHER STEWARD!!!!!"
m850:
print "\nХамурапи: я не могу сделать то, что вы хотите.\n";
print "Замените себя другим управляющим !!!!!";

#857 GOTO 990
goto m990;

#860 PRINT "IN YOUR 10-YEAR TERM OF OFFICE,"P1"PERCENT OF THE"
m860:
print "За время вашего 10 летнего пребывания на посту в среднем ", $P1, "процентов\n";

#862 PRINT "POPULATION STARVED PER YEAR ON AVERAGE, I.E., A TOTAL OF"
print "населения ежегодно умирали от голода, т.е. всего \n";

#865 PRINT D1"PEOPLE DIED!!":L=A/P
print $D1, " человек умерли !!\n"; $L = $A / $P;

#870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH"
print "Вы начали с 10 акров на человека, а закончили \n";

#875 PRINT L"ACRES PER PERSON.":PRINT
print $L; "акрами на человека.\n\n";

#880 IF P1>33 THEN 565
goto m565 if $P1 > 33;

#885 IF L<7 THEN 565
goto m565 if $L < 7;

#890 IF P1>10 THEN 940
goto m940 if $P1 > 10;

#892 IF L<9 THEN 940
goto m940 if $L < 9;

#895 IF P1>3 THEN 960
goto m960 if $P1 > 3;

#896 IF L<10 THEN 960
goto m960 if $L < 10;

#900 PRINT "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND"
#905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!":GOTO 990
print "Фантастический результат !!! Шарлемань, Дизраели и \nДжефферсон вместе не смогли бы сделать лучше ! \n";
goto m990;

#940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
#945 PRINT "THE PEOPLE (REMAINING) FIND YOU AN UNPLEASANT RULER, AND,"
#950 PRINT "FRANKLY, HATE YOUR GUTS!":GOTO 990
m940:
print "Ваша тяжелая рука припахивает Нероном и Иваном IV. \nВыжившие люди считают вас плохим правителем и ужасно ненавидят ваши потроха ! \n";
goto m990;

#960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT"
#965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";
m960:
print "Ваши достижения могли бы быть лучше, но \nдела не совсем плохи. \n";

#966 PRINT INT(P*.8*RND(1));"PEOPLE WOULD"
#970 PRINT "DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR"
#975 PRINT "TRIVIAL PROBLEMS."
print int($P*0.8*rand()), " человек хотели бы видеть вас убитым, но это обычная проблема для нас.\n";

#990 PRINT:FOR N=1 TO 10:PRINT CHR$(7);:NEXT N
m990:
print "Биииииииииииип\n";

#995 PRINT "SO LONG FOR NOW.":PRINT
print "Пока.\n\n";

#999 END
exit;
#

Как всегда нашелся неисчерпаемый источник ресурсов, он же объект экспансии - земля.
В ходе тестирования у меня два раза подряд случилась чума, так что народу стало слишком мало, чтобы обрабатывать имеющуюся землю и совершенно непроизвольно подумал "А где бы прикупить рабов..."

Даже в полутора сотнях строк программного кода имени древнего шумерского царя нашлось место для обычного для англосаксов черного пиара:
940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
У британцев были примеры куда как ближе и роднее, не говоря уж о том, что "Васильевичем" Иван IV был прозван отнюдь не за великий голод.

К слову
смотрел британский фильм "Риск Шарпа".
Фишка фильма в том, что там главный злодей наркоторговец - граф Драгомиров. Типичная британская фамилия. Напоминаю, действие в 1818 году, Ост-Индийская кампания.
Previous post Next post
Up