Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Praxisbeispiel: Eine simple Wirtschaftssimulation

Heinrich-Heine-Universität Düsseldorf

Dies ist die erste Ausbaustufe und bewusst so geschrieben, wie man ein Programm schreibt, wenn man es schnell zum Laufen bringen will: alles in zwei Zellen, der Zustand in freien Variablen, die Spiellogik mitten in der Ausgabe. Es funktioniert, es ist kurz, und man versteht es beim Lesen.

Lesen Sie es als Vorher-Bild. In der nächsten Ausbaustufe wird genau dieser Code refaktorisiert, und jede einzelne Änderung dort hat einen Grund, der hier schon sichtbar ist. Drei davon lohnt es sich beim Lesen zu suchen:

  • Der gesamte Zustand — money, stock, price, history, trend_idx — liegt im Modul. Es gibt dieses Spiel also genau einmal pro Prozess; zwei Partien nebeneinander oder ein Test mit definiertem Ausgangszustand sind nicht möglich (siehe global als Warnsignal).

  • Die Prüfung money >= cost und die Buchung money -= cost stehen in derselben if-Bedingung wie die Bildschirmausgabe. Rechnen, Prüfen und Anzeigen sind nicht zu trennen, ohne die Schleife auseinanderzunehmen.

  • Ein ungültiger Befehl und zu wenig Geld führen in denselben else-Zweig mit derselben Meldung. Das Programm weiß nicht, was schiefgegangen ist — es hat für beides nur einen Fall.

Nichts davon ist ein Fehler in diesem Programm. Für 40 Zeilen ist diese Bauweise angemessen. Sie trägt nur nicht weiter, und die nächste Stufe zeigt, wohin sie stattdessen führt.

# Initial State
money = 100.0
stock = 0
price = 10.0
history = []
trends = [0.2, 0.2, -0.1, -0.3]
trend_idx = 0
# Main Game Loop
while True:
    print("-" * 40)
    print(f"MARKET: Food @ {price:.2f} €")
    print("-" * 40)
    print(f"[Money: {money:.2f} € | Stock: {stock}]")
    print(f"History: {history[-3:]}")
    print("COMMANDS: 'b 1' (buy), 's 5' (sell), 'q' (quit)")
    
    cmd = input(">> ").strip().lower().split()
    
    if not cmd: 
        continue
        
    if cmd[0] == 'q': 
        print("Exiting...")
        break
    
    action = cmd[0]
    amount = int(cmd[1]) if len(cmd) > 1 else 1
    cost = amount * price
    
    if action == 'b' and money >= cost:
        money -= cost
        stock += amount
        history.append(('BUY', amount, price))
        price += 0.5 * amount  # Buy pushes price up
        print(f"\n[SUCCESS] BUY {amount} units\n")
        
    elif action == 's' and stock >= amount:
        money += cost
        stock -= amount
        history.append(('SELL', amount, price))
        price -= 0.5 * amount  # Sell pushes price down
        print(f"\n[SUCCESS] SELL {amount} units\n")
        
    else:
        print("\n[!] Invalid command or insufficient funds/stock.\n")
        continue
        
    # Advance market trend
    price = max(1.0, round(price + trends[trend_idx], 2))
    trend_idx = (trend_idx + 1) % 4
----------------------------------------
MARKET: Food @ 10.00 €
----------------------------------------
[Money: 100.00 € | Stock: 0]
History: []
COMMANDS: 'b 1' (buy), 's 5' (sell), 'q' (quit)
>>  b 1

[SUCCESS] BUY 1 units

----------------------------------------
MARKET: Food @ 10.70 €
----------------------------------------
[Money: 90.00 € | Stock: 1]
History: [('BUY', 1, 10.0)]
COMMANDS: 'b 1' (buy), 's 5' (sell), 'q' (quit)
>>  b 1

[SUCCESS] BUY 1 units

----------------------------------------
MARKET: Food @ 11.40 €
----------------------------------------
[Money: 79.30 € | Stock: 2]
History: [('BUY', 1, 10.0), ('BUY', 1, 10.7)]
COMMANDS: 'b 1' (buy), 's 5' (sell), 'q' (quit)
>>  s 2

[SUCCESS] SELL 2 units

----------------------------------------
MARKET: Food @ 10.30 €
----------------------------------------
[Money: 102.10 € | Stock: 0]
History: [('BUY', 1, 10.0), ('BUY', 1, 10.7), ('SELL', 2, 11.4)]
COMMANDS: 'b 1' (buy), 's 5' (sell), 'q' (quit)
>>  q
Exiting...