In einem Spiel gibt es gewisse Rätselsprüche (mehrzeilig). Jeder Spieler kann mehrere Rätsel (ZT) zu lösen erhalten, die zufällig aus einer größeren Menge ausgewählt werden.
Die Tabelle soll nun von oben nach unten alle Rätsel auflisten. Ich habe das in einem Tabellenkalkulationsprogramm gestartet, aber es wurde schnell unübersichtlich und langsam, vor allem wegen der Mehrzeiligkeit. Daher denke ich, es sollte nur die erste Zeile jedes Rätselspruchss angezeigt werden sollen.
Zusätzlich soll zu jedem Rätsel noch ein Hinweis und die Lösung als mehrzeiliger Text gespeichert werden können. Ich kapsle das in eine Klasse. In der Tabelle werde ich nur anzeigen, ob überhaupt Hinweis oder Lösung vorliegen (bool) und nicht den detailierten Inhalt.
Die weiteren Spalten, eine pro Spieler, sollen zeigen, ob dieser Spieler dieses Rätsel derzeit lösen muss (bool).
Ich habe: Eine Klasse ZT(), eine Klasse Spieler(), sowie eine Klasse ZTTableModel(QtCore.QAbstractTableModel) als Datenmodell für das Qt.TableWidget
Ich habe auch schon mal eine Klasse Datenbank() angelegt, ohne mir Qt genauer anzugucken, damit ich die Tabelle als Text ausgeben kann und die Logik ohne Gui testen kann. Das funktioniert (mehr schlecht als recht), aber nun habe ich keine Ahnung, wie ich das mit dem Qt Modell verbinden kann.
Zum Beispiel soll ZTTableModel.removeColumns() ja keine der drei ersten Spalten verschwinden lassen, sondern nur ggf. einen der Spieler aus Spalte 4 oder später. Wenn hingegen ein ZT hinzugefügt werden soll, soll ja erst geprüft werden, ob er vielleicht schon vorhanden ist, dann müsste ggf. die alte Zeile aktualisiert werden, anstatt ihn neu doppelt aufzunehmen. Soll ich vielleicht eine vierte Klasse dazwischenschalten, die nur die Zusammenhänge zwischen Rätselsprüchen und Spieler kennt und dann das Modell fernsteuert? Wald -> Bäume.
Die grundlegenden Klassen waren simpel:
Code: Alles auswählen
class ZT(object):
def __init__(self, tell, hint="", solve=""):
self.tell, self.hint, self.solve = tell, hint, solve
def __str__(self):
return "%s (%s, %s)" % (self.tell_short(), self.hinted(), self.solved())
def hinted(self):
return len(self.hint) > 0
def solved(self):
return len(self.solve) > 0
def tell_short(self):
return self.tell.split("\n")[0] # first line
class Player(object):
def __init__(self, name = "Jemand"):
self.name = name
self.zts = []
def __str__(self):
return "%s knows %d zts." % (self.name, len(self.zts))
def change_name(self, new_name):
self.name = new_name
def knows_zt_short(self, tell_short):
z = tell_short
for x in self.zts:
if x.tell_short() == z:
return True
return False
def knows_zt(self, zt):
z = zt.tell_short()
return self.knows_zt_short(z)
def add_zt(self, zt):
if not self.knows_zt(zt):
self.zts.append(zt)
Später soll auch noch ein weiteres Fenster dazukommen, um die Rätselsprüche, Hinweise und Lösungen als Langtext editierbar zu machen,. Das würde die Tabelle wohl endgültig überfrachten.
Kommentare sind gern gesehen. Bei Interesse werde ich meinen Codeweg weiter dokumentieren.