Nachdem ich selbstverliebt noch einmal mein altes Video geschaut hatte konnte ich gestern nicht mehr antworten

Die drei Bücher von David H. Ahl (siehe
http://www.atariarchives.org/) enthalten Beispiele für über 200 Spiele, die alle in der Konsole funktionieren. Es ist zugegeben ein bisschen schwer, das archaische Basic zu dekodieren.
Hammurabi war meiner Recherche nach das erste Spiel dieser Art. Die Beschreibung von Leetplex klang auch ein bisschen nach
http://de.wikipedia.org/wiki/Hanse_(Computerspiel) - davon gab es auch etliche Klone.
Um Spiele vielleicht ein bisschen zeitgemäßer Aussehen zu lassen, ohne das man sich aber mit der GUI-Programmierung unter Python auseinandersetzen muss, wäre noch eine Idee, das ganze als Web-Anwendungen, die man dann über einen Browser anspricht, zu gestalten. Damit handelt man sich aber natürlich ein ganz anderes Set von Problemen ein, denn zunächst muss man jetzt natürlich HTML und ein bisschen CSS können und dann auch verstehen, wie die Anwendung gestaltet werden muss, damit sie mit dem Request/Response-Ansatz eines Webbrowsers klar kommt.
Hier ist ein Beispiel für Bottle (
http://bottlepy.org/), den ich schnell zusammengehackt habe:
Code: Alles auswählen
from bottle import get, post, request, run, template, debug
class Hammurabi:
def __init__(self):
self.year = 1
self.people = 100
self.acres = 1000
self.sheffles = 2800
hammurabi = Hammurabi()
@get("/")
def start():
return template("start", h=hammurabi, error="")
@post("/")
def play():
value = int(request.forms['value'])
error = ""
if request.forms['sell']:
if value < 0:
error = "Du musst eine positive Zahl eingeben!"
elif value > hammurabi.acres:
error = "So viel Land besitzt du nicht!"
else:
hammurabi.acres -= value
hammurabi.sheffles += value * 15
return template("start", h=hammurabi, error=error)
debug(True)
run(port=8888, reloader=True)
Dazu gehört noch dieses Template:
Code: Alles auswählen
<h1>Jahr {{h.year}}</h1>
Du hast {{h.people}} Leute.<br>
Du hast {{h.acres}} Land.<br>
Du hast {{h.sheffles}} Getreide.<br>
%if error:
<p style='color:red'>{{error}}</p>
%end
<form method=post action=/>
<input name=value><input type=submit name=sell value="Land verkaufen">
</form>
In der ersten Zeile importiere ich ein paar Bottle-Funktionen. Danach definiere ich eine Klasse "Hammurabi", in der das Spiel implementiert würde. Ein einziges Exemplar dieser Klasse merke ich mir als globale Variable für die Interaktion. Das kann bei einer "echten" Webanwendung so nie funktionieren, weil dort ja beliebig viele Leute parallel zugreifen könnten, aber da ich weiß, dass nur ich das Spiel im Browser aufrufen werde, ist das so OK.
Mit @get() definiere ist, welche Funktion aufgerufen werden soll, wenn die App startet und ich im Browser die URL
http://localhost:8888 aufrufe. Es wird ein Template dargestellt, in das ich mein Hammurabi-Objekt und einen leeren Fehler füttere. Ich hätte eigentlich gedacht, Bottle käme auch mit error=None klar, aber das ging nicht.
Das Template selbst zeigt meine Variablen aus dem Hammurabi-Objekt an und fragt dann danach, wie viel Land ich verkaufen möchte. Andere Funktionen sind vom Leser zu ergänzen. Drücke ich den "Land verkaufen"-Button, komme ich bei der durch @post markierten Funktion von Bottle an. Dort werde ich (ein bisschen ungeschickt) aus, was passiert ist, fange Fehler ab und ändere das Hammurabi-Objekt (was eigentlich als Methode in dieses Objekt gehört) und zeige danach wieder das Template mit den nun aktualisierten Variablen an.
Müsste ich jetzt nicht mal langsam anfangen zu arbeiten, würde ich das ganze noch mal etwas refaktorieren, damit die Spiellogik nicht im Rahmenwerk untergeht. Ich denke aber, man kann so schon loslegen und hat dann natürlich alle Möglichkeiten von HTML, was die Darstellung angeht. Ich könnte das Getreide z.B. durch kleine Grafiken darstellen oder aber als einfache Balkengrafik.
Die letzten beiden Zeilen in meinem Python-Programm starten übrigens den in Bottle eingebauten Webserver im Debug-Modus, sodass ich nichts weiter als Bottle brauche, um mein Programm zu entwickeln.
Stefan