From c860f7a9f5cfbf8521dc0003910a23a3e642c04b Mon Sep 17 00:00:00 2001 From: PeterQuinn925 Date: Sat, 27 Feb 2021 15:37:11 -0800 Subject: [PATCH] Port of Hamurabi to Python --- 43 Hammurabi/python/hamurabi.py | 183 ++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 43 Hammurabi/python/hamurabi.py diff --git a/43 Hammurabi/python/hamurabi.py b/43 Hammurabi/python/hamurabi.py new file mode 100644 index 00000000..24ebe581 --- /dev/null +++ b/43 Hammurabi/python/hamurabi.py @@ -0,0 +1,183 @@ +def GenRandom(C): + C=int(random()*5)+1 +def BadInput850(): + print ( "\nHAMURABI: I CANNOT DO WHAT YOU WISH.") + print ( "GET YOURSELF ANOTHER STEWARD!!!!!") + Z=99 +def BadInput710(S): + print ( "HAMURABI: THINK AGAIN. YOU HAVE ONLY") + print ( S,"BUSHELS OF GRAIN. NOW THEN,") +def BadInput720(A): + print ( "HAMURABI: THINK AGAIN. YOU OWN ONLY",A,"ACRES. NOW THEN,") +def BadInput710(S): + print ( "HAMURABI: THINK AGAIN. YOU HAVE ONLY") + print ( S,"BUSHELS OF GRAIN. NOW THEN,") +def NationalFink(): + print ( "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY") + print ( "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE") + print ( "ALSO BEEN DECLARED NATIONAL FINK!!!!") + +def B_input(promptstring): #emulate BASIC input. It rejects non-numeric values + x=input(promptstring) + while x.isalpha(): + x=input("?REDO FROM START\n? ") + return int(x) + +from random import random +from random import seed +seed() +title = "HAMURABI" +title = title.rjust(32,' ') +print (title) +attribution = "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +attribution = attribution.rjust(15," ") +print (attribution) +print ('\n\n\n') +print ("TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA") +print ("FOR A TEN-YEAR TERM OF OFFICE.\n") +D1=0 +P1=0 +Z=0 #year +P=95 #population +S=2800 #grain stores +H=3000 +E=H-S #rats eaten +Y=3 #yield (amount of production from land). Reused as price per acre +A=H/Y #acres of land +I=5 #immigrants +Q=1 #boolean for plague, also input for buy/sell land +D=0 # people +while (Z<11): #line 270. main loop. while the year is less than 11 + print ("\n\n\nHAMURABI: I BEG TO REPORT TO YOU") + Z=Z+1 #year + print ( "IN YEAR",Z,",",D,"PEOPLE STARVED,",I,"CAME TO THE CITY,") + P=P+I + if Q==0: + P=int(P/2) + print ("A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED.") + print ("POPULATION IS NOW",P) + print ("THE CITY NOW OWNS",A,"ACRES.") + print ("YOU HARVESTED",Y,"BUSHELS PER ACRE.") + print ("THE RATS ATE",E,"BUSHELS.") + print ("YOU NOW HAVE ",S,"BUSHELS IN STORE.\n") + C=int(10*random()) #random number between 1 and 10 + Y=C+17 + print ("LAND IS TRADING AT",Y,"BUSHELS PER ACRE.") + Q=-99 #dummy value to track status + while Q==-99: #always run the loop once + Q = B_input("HOW MANY ACRES DO YOU WISH TO BUY? ") + if Q<0: + Q = -1 #to avoid the corner case of Q=-99 + BadInput850() + Z=99 #jump out of main loop and exit + elif Y*Q>S: #can't afford it + BadInput710(S) + Q=-99 # give'm a second change to get it right + elif Y*Q<=S: #normal case, can afford it + A=A+Q #increase the number of acres by Q + S=S-Y*Q #decrease the amount of grain in store to pay for it + C=0 #WTF is C for? + if Q ==0 and Z!=99: #maybe you want to sell some land? + Q = -99 + while Q==-99: + Q = B_input( "HOW MANY ACRES DO YOU WISH TO SELL? ") + if Q<0: + BadInput850() + Z=99 #jump out of main loop and exit + elif Q<=A:#normal case + A=A-Q # reduce the acres + S=S+Y*Q #add to grain stores + C=0 #still don't know what C is for + else: #Q>A error! + BadInput720() + Q=-99 #reloop + print ("\n") + Q=-99 + while Q==-99 and Z!=99: + Q = B_input("HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE? ") + if Q<0: + BadInput850() + #REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS? + elif Q>S: + BadInput710 + Q=-99 #try again! + else: #we're good. do the transaction + S=S-Q #remove the grain from the stores + C=1 #set the speed of light to 1. jk + print ("\n") + D=-99 #dummy value to force at least one loop + while D == -99 and Z!=99: + D = B_input("HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED? ") + if D<0: + BadInput850() + Z=99 + elif D>0: + if D>A: + #REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN? + BadInput720(A) + D = -99 + elif int(D/2)>S: + #REM *** ENOUGH GRAIN FOR SEED? + BadInput710(S) + D = -99 + elif D>=10*P: + #REM *** ENOUGH PEOPLE TO TEND THE CROPS? + print ("BUT YOU HAVE ONLY",P,"PEOPLE TO TEND THE FIELDS! NOW THEN,") + D=-99 + else: #we're good. decrement the grain store + S=S-int(D/2) + GenRandom(C) + #REM *** A BOUNTIFUL HARVEST! + Y=C + H=D*Y + E=0 + GenRandom(C) + if int(C/2)==C/2: #even number. 50/50 chance + #REM *** RATS ARE RUNNING WILD!! + E=int(S/C) #calc losses due to rats, based on previous random number + S=S-E+H #deduct losses from stores + GenRandom(C) + #REM *** LET'S HAVE SOME BABIES + I=int(C*(20*A+S)/P/100+1) + #REM *** HOW MANY PEOPLE HAD FULL TUMMIES? + C=int(Q/20) + #REM *** HORROS, A 15% CHANCE OF PLAGUE + #yeah, should be HORRORS, but left it + Q=int(10*(2*random()-.3)) + if P>=C and Z!=99: #if there are some people without full bellies... + #REM *** STARVE ENOUGH FOR IMPEACHMENT? + D=P-C + if D>.45*P: + print ("\nYOU STARVED",D,"PEOPLE IN ONE YEAR!!!") + NationalFink() + Z=99 #exit the loop + P1=((Z-1)*P1+D*100/P)/Z + P=C + D1=D1+D +if Z!=99: + print ( "IN YOUR 10-YEAR TERM OF OFFICE,",P1,"PERCENT OF THE") + print ( "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF") + print ( D1,"PEOPLE DIED!!") + L=A/P + print ( "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH") + print ( L,"ACRES PER PERSON.\n") + if (P1>33 or L<7): + NationalFink() + elif (P1>10 or L<9): + print ( "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV.") + print ( "THE PEOPLE (REMIANING) FIND YOU AN UNPLEASANT RULER, AND,") + print ( "FRANKLY, HATE YOUR GUTS!!") + elif (P1>3 or L<10): + print ( "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT") + print ( "REALLY WASN'T TOO BAD AT ALL. ",int(P*.8*random()),"PEOPLE") + print ( "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR") + print ( "TRIVIAL PROBLEMS.") + else: + print ( "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND") + print ( "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!\n") + for N in range(1,10): + print ( '\a') +print("\nSO LONG FOR NOW.\n") + + +