from random import random, seed def gen_random() -> int: return int(random() * 5) + 1 def bad_input_850() -> None: print("\nHAMURABI: I CANNOT DO WHAT YOU WISH.") print("GET YOURSELF ANOTHER STEWARD!!!!!") def bad_input_710(grain_bushels: int) -> None: print("HAMURABI: THINK AGAIN. YOU HAVE ONLY") print(f"{grain_bushels} BUSHELS OF GRAIN. NOW THEN,") def bad_input_720(acres: float) -> None: print(f"HAMURABI: THINK AGAIN. YOU OWN ONLY {acres} ACRES. NOW THEN,") def national_fink() -> None: 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: str) -> int: """emulate BASIC input. It rejects non-numeric values""" x = input(promptstring) while x.isalpha(): x = input("?REDO FROM START\n? ") return int(x) def main() -> None: 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: float = 0 year = 0 population = 95 grain_stores = 2800 H = 3000 eaten_rats = H - grain_stores bushels_per_acre = ( 3 # yield (amount of production from land). Reused as price per acre ) acres = H / bushels_per_acre # acres of land immigrants = 5 plague = 1 # boolean for plague, also input for buy/sell land people = 0 while year < 11: # line 270. main loop. while the year is less than 11 print("\n\n\nHAMURABI: I BEG TO REPORT TO YOU") year += 1 print( "IN YEAR", year, ",", people, "PEOPLE STARVED,", immigrants, "CAME TO THE CITY,", ) population = population + immigrants if plague == 0: population = int(population / 2) print("A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED.") print("POPULATION IS NOW", population) print("THE CITY NOW OWNS", acres, "ACRES.") print("YOU HARVESTED", bushels_per_acre, "BUSHELS PER ACRE.") print("THE RATS ATE", eaten_rats, "BUSHELS.") print("YOU NOW HAVE ", grain_stores, "BUSHELS IN STORE.\n") C = int(10 * random()) # random number between 1 and 10 bushels_per_acre = C + 17 print("LAND IS TRADING AT", bushels_per_acre, "BUSHELS PER ACRE.") plague = -99 # dummy value to track status while plague == -99: # always run the loop once plague = b_input("HOW MANY ACRES DO YOU WISH TO BUY? ") if plague < 0: plague = -1 # to avoid the corner case of Q=-99 bad_input_850() year = 99 # jump out of main loop and exit elif bushels_per_acre * plague > grain_stores: # can't afford it bad_input_710(grain_stores) plague = -99 # give'm a second change to get it right else: acres = acres + plague # increase the number of acres by Q grain_stores = ( grain_stores - bushels_per_acre * plague ) # decrease the amount of grain in store to pay for it C = 0 # WTF is C for? if plague == 0 and year != 99: # maybe you want to sell some land? plague = -99 while plague == -99: plague = b_input("HOW MANY ACRES DO YOU WISH TO SELL? ") if plague < 0: bad_input_850() year = 99 # jump out of main loop and exit elif plague <= acres: # normal case acres = acres - plague # reduce the acres grain_stores = ( grain_stores + bushels_per_acre * plague ) # add to grain stores C = 0 # still don't know what C is for else: # Q>A error! bad_input_720(acres) plague = -99 # reloop print("\n") plague = -99 while plague == -99 and year != 99: plague = b_input("HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE? ") if plague < 0: bad_input_850() year = 99 # jump out of main loop and exit # REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS? elif plague > grain_stores: bad_input_710(grain_stores) plague = -99 # try again! else: # we're good. do the transaction grain_stores = grain_stores - plague # remove the grain from the stores C = 1 # set the speed of light to 1. jk print("\n") people = -99 # dummy value to force at least one loop while people == -99 and year != 99: people = b_input("HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED? ") if people < 0: bad_input_850() year = 99 # jump out of main loop and exit elif people > 0: if people > acres: # REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN? bad_input_720(acres) people = -99 elif int(people / 2) > grain_stores: # REM *** ENOUGH GRAIN FOR SEED? bad_input_710(grain_stores) people = -99 elif people > 10 * population: # REM *** ENOUGH PEOPLE TO TEND THE CROPS? print( "BUT YOU HAVE ONLY", population, "PEOPLE TO TEND THE FIELDS! NOW THEN,", ) people = -99 else: # we're good. decrement the grain store grain_stores = grain_stores - int(people / 2) C = gen_random() # REM *** A BOUNTIFUL HARVEST! bushels_per_acre = C H = people * bushels_per_acre C = gen_random() eaten_rats = int(grain_stores / C) if int(C / 2) == C / 2 else 0 grain_stores = grain_stores - eaten_rats + H # deduct losses from stores C = gen_random() # REM *** LET'S HAVE SOME BABIES immigrants = int(C * (20 * acres + grain_stores) / population / 100 + 1) # REM *** HOW MANY PEOPLE HAD FULL TUMMIES? C = int(plague / 20) # REM *** HORROS, A 15% CHANCE OF PLAGUE # yeah, should be HORRORS, but left it plague = int(10 * (2 * random() - 0.3)) if ( population >= C and year != 99 ): # if there are some people without full bellies... # REM *** STARVE ENOUGH FOR IMPEACHMENT? people = population - C if people > 0.45 * population: print("\nYOU STARVED", people, "PEOPLE IN ONE YEAR!!!") national_fink() year = 99 # exit the loop P1 = ((year - 1) * P1 + people * 100 / population) / year population = C D1 = D1 + people if year != 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 = acres / population print("YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH") print(L, "ACRES PER PERSON.\n") if P1 > 33 or L < 7: national_fink() elif P1 > 10 or L < 9: print("YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV.") print("THE PEOPLE (REMAINING) 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(population * 0.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 _ in range(1, 10): print("\a") print("\nSO LONG FOR NOW.\n") if __name__ == "__main__": main()