Retrocomputing

Hammurabi

Hammurabi or Hamurabi is a text-based strategy video game of land and resource management first developed by Doug Dyment in 1968.

Wikipedia article.

BASIC09 edition

PROCEDURE hammurabi
    PRINT TAB(32);"HAMURABI"
    PRINT TAB(15);"CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY"
    PRINT
    PRINT
    PRINT
    PRINT "Try your hand at governing ancient Sumeria"
    PRINT "for a ten-year term of office."
    PRINT
    DIM ACRES,YEAR,D,DIED,INCREASE:INTEGER
    DIM LOSS,HARVEST,STORED,YIELD:INTEGER
    DIEDTOT=0
    DIEDAVG=0
    YEAR=0
    POPULATION=95
    STORED=2800
    HARVEST=3000
    LOSS=HARVEST-STORED
    YIELD=3
    ACRES=HARVEST/YIELD
    INCREASE=5
    PLAGUE=1
    DIED=0
215 PRINT
    PRINT
    PRINT "Hamurabi:  I beg to report to you,"
    YEAR=YEAR+1
    PRINT "in year ";YEAR;", ";DIED;" people starved, ";INCREASE;" came to the city,"
    POPULATION = POPULATION + INCREASE
    IF PLAGUE <= 0 THEN
      POPULATION = POPULATION / 2
      PRINT "a horrible plague struck!  Half the people died."
    ENDIF
    PRINT "Population is now ";POPULATION
    PRINT "The city now owns ";ACRES;" acres."
    PRINT "You harvested ";YIELD;" bushels per acre."
    PRINT "The rats ate ";LOSS;" bushels."
    PRINT "You now have ";STORED;" bushels in store."
    PRINT
    IF YEAR=11 THEN 860
    C=INT(10*RND(1))
    YIELD=C+17
    PRINT "Land is trading at ";YIELD;" bushels per acre."
    LOOP
      PRINT "How many acres do you wish to buy";
      INPUT Q
      IF Q < 0 THEN 850
      EXITIF YIELD * Q <= STORED THEN ENDEXIT
      GOSUB 710
    ENDLOOP

    IF Q > 0 THEN
      ACRES = ACRES + Q
      STORED = STORED - YIELD * Q
      C=0
      GOTO 400
    ENDIF

    LOOP
      PRINT "How many acres do you wish to sell";
      INPUT Q
      IF Q < 0 THEN 850
      EXITIF Q < ACRES THEN ENDEXIT
      GOSUB 720
    ENDLOOP

    ACRES = ACRES - Q
    STORED = STORED + YIELD * Q
    C = 0

400 PRINT
    LOOP
      PRINT "How many bushels do you wish to feed your people";
      INPUT FOOD
      IF FOOD < 0 THEN 850
      REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS?
      EXITIF FOOD <= STORED THEN ENDEXIT
      GOSUB 710
    ENDLOOP

    STORED = STORED - FOOD
    C = 1
    PRINT
440 PRINT "How many acres do you wish to plant with seed";
    INPUT D
    IF D<0 THEN 850
    IF D>0 THEN
      REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
      IF D > ACRES THEN
        GOSUB 720
        GOTO 440
      ENDIF
      REM *** ENOUGH GRAIN FOR SEED?
      IF INT(D/2) > STORED THEN
        GOSUB 710
        GOTO 440
      ENDIF
      REM *** ENOUGH PEOPLE TO TEND THE CROPS?
      IF D >= 10 * POPULATION THEN
        PRINT "But you have only ";POPULATION;" people to tend the fields!  Now then,"
        GOTO 440
      ENDIF
      STORED = STORED - INT(D/2)
    ENDIF

    GOSUB 800
    REM *** A BOUNTIFUL HARVEST!
    YIELD=C
    HARVEST = D * YIELD
    LOSS=0
    GOSUB 800
    IF INT(C/2) = C/2 THEN
      REM *** RATS ARE RUNNING WILD!!
      LOSS=INT(STORED / C)
    ENDIF
    STORED = STORED - LOSS + HARVEST
    GOSUB 800
    REM *** LET'S HAVE SOME BABIES
    INCREASE = INT(C * (20 * ACRES + STORED) / POPULATION / 100 + 1)
    REM *** HOW MANY PEOPLE HAD FULL TUMMIES?
    FEDPPL =INT(FOOD / 20)
    REM *** HORRORS, A 15% CHANCE OF PLAGUE
    PLAGUE = INT(10 * (2 * RND(1) - .3))
    IF POPULATION < FEDPPL THEN
      DIED = 0
    ELSE
      REM *** STARVE ENOUGH FOR IMPEACHMENT?
      DIED = POPULATION - FEDPPL
      IF DIED > .45 * POPULATION THEN
        PRINT
        PRINT "You starved ";DIED;" people in one year!!!"
        GOSUB 560
        GOTO 990
      ENDIF
      DIEDAVG=((YEAR-1) * DIEDAVG + DIED * 100 / POPULATION) / YEAR
      POPULATION=FEDPPL
      DIEDTOT = DIEDTOT + DIED
    ENDIF
    GOTO 215

560 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!!!!"
    RETURN

710 PRINT "Hamurabi:  Think again.  You have only"
    PRINT STORED;" bushels of grain.  Now then,"
    RETURN

720 PRINT "Hamurabi:  Think again.  You own only ";ACRES;" acres.  Now then,"
    RETURN

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

850 PRINT
    PRINT "Hamurabi:  I cannot do what you wish."
    PRINT "Get yourself another steward!!!!!"
    GOTO 990

860 PRINT "In your 10-year term of office, ";DIEDAVG;" percent of the"
    PRINT "population starved per year on the average, I.e. a total of"
    PRINT DIEDTOT;" people died!!"
    L = ACRES / POPULATION
    PRINT "You started with 10 acres per person and ended with"
    PRINT L;" acres per person."
    PRINT
    IF DIEDAVG > 33 OR L < 7 THEN
      GOSUB 560
      GOTO 990
    ENDIF
    IF DIEDAVG > 10 OR L < 9 THEN
      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!!"
      GOTO 990
    ENDIF
    IF DIEDAVG > 3 OR L < 10 THEN
      PRINT "Your performance could have been somewhat better, but"
      PRINT "really wasn't too bad at all. ";FIX(POPULATION * .8 * RND(1));" people"
      PRINT "would dearly like to see you assassinated but we all have our"
      PRINT "trivial problems."
      GOTO 990
    ENDIF
    PRINT "A fantastic performance!!!  Charlemagne, Disraeli, and"
    PRINT "Jefferson combined could not have done better!"


990 PRINT "****************"
    PRINT "So long for now."
    PRINT
    END