Textadventure in Python
Verfasst: Mittwoch 22. September 2010, 00:54
Hi,
hab mich mal dran gesetzt ein altes (sehr einfaches) Textadventure nach Python zu portieren.
Ging wie immer hauptsächlich darum was zu lernen, habe auch bereits eine funktionierende Lösung. Da ich das ganze schön verpackt für den nächsten Hochladen möchte suche ich eine Möglichkeit das ganze etwas zu entschlacken.
Benutze immo wxPython mit einem Richtext um eine Console zu emulieren (das Adventure ist sehr einfach, man hat im Prinzip im jedem Raum verschiedene Antwortmöglichkeiten, die einen dann in den entsprechenden nächsten Raum bringen aber ohne dauerhaft gespeicherte Sachen...)
Dadurch kommt das ganze mit Abhängigkeiten auf Stolze 16MB (das Originalspiel kommt auf 22kb ^^)
Versuche nun den Engine entweder so umzuschreiben das ich ne echte Console verwende und dort dann halt Farben anpassen kann (was wenn ich die Beiträge hier im Forum so sehe nicht gerade schön ist...) oder ne andere Lösung für das Problem finde.
Brauche Eigentlich auch nur 2 Sachen (hab den Rest testweise eingebaut um für den nächsten Engine zu lernen)
Ich muss den ganzen Bildschirm Centern können, den ganzen Bildschirm Linksbündig machen, den Hintergrund auf Blau und die Schrift auf Gelb.
Sowas kompliziertes wie eine Farbe pro Buchstaben usw muss nicht sein, wäre aber super.
Das ganze soll auch Crossplatform werden.
Hier erst mal der Engine (und bitte nicht tot umfallen)
Ich weiß, ich weiß, viel zu viel.
Was ich im Prinziep mache ist, ich erstelle Räume, jeder Raum besteht aus Name, Angezeigtem Text und Auswahlmöglichkeiten (Keys)
Keys sind wiederum eine Anzahl von Key die die entsprechende Auswahl (also den Char der erwartet wird), den Text der dabei angezeigt wird und die folgenden Aktion enthalten.
Einfach mal mit einem "Engine()" den Testscreen hochbringen, dann sieht man was ich meine.
Habe schon nach PyGame geschielt, konnte dort aber bisher nur 2D und 3D Tutorials finden obwohl ich weiß das es da auch Textadventures gibt. Vlt kann mir da einer einen Tipp geben?
hab mich mal dran gesetzt ein altes (sehr einfaches) Textadventure nach Python zu portieren.
Ging wie immer hauptsächlich darum was zu lernen, habe auch bereits eine funktionierende Lösung. Da ich das ganze schön verpackt für den nächsten Hochladen möchte suche ich eine Möglichkeit das ganze etwas zu entschlacken.
Benutze immo wxPython mit einem Richtext um eine Console zu emulieren (das Adventure ist sehr einfach, man hat im Prinzip im jedem Raum verschiedene Antwortmöglichkeiten, die einen dann in den entsprechenden nächsten Raum bringen aber ohne dauerhaft gespeicherte Sachen...)
Dadurch kommt das ganze mit Abhängigkeiten auf Stolze 16MB (das Originalspiel kommt auf 22kb ^^)
Versuche nun den Engine entweder so umzuschreiben das ich ne echte Console verwende und dort dann halt Farben anpassen kann (was wenn ich die Beiträge hier im Forum so sehe nicht gerade schön ist...) oder ne andere Lösung für das Problem finde.
Brauche Eigentlich auch nur 2 Sachen (hab den Rest testweise eingebaut um für den nächsten Engine zu lernen)
Ich muss den ganzen Bildschirm Centern können, den ganzen Bildschirm Linksbündig machen, den Hintergrund auf Blau und die Schrift auf Gelb.
Sowas kompliziertes wie eine Farbe pro Buchstaben usw muss nicht sein, wäre aber super.
Das ganze soll auch Crossplatform werden.
Hier erst mal der Engine (und bitte nicht tot umfallen)
Code: Alles auswählen
class Keys:
def __init__(self):
self.list = dict()
def add(self, key):
self.list[key.char] = key
def generatetext(self):
listkeys = self.list.keys()
listkeys.sort()
out = ""
for listkey in listkeys:
if self.list[listkey].visible:
out = out + self.list[listkey].char + "." + "\t\t" + self.list[listkey].chartext + "\n"
return out
class Key:
def __init__(self, char, chartext, do, visible):
self.char = char
self.chartext = chartext
self.do = do
self.visible = visible
class Screens:
def __init__(self):
self.list = dict()
def add(self, screen):
self.list[screen.name] = screen
class Screen:
def __init__(self, name, text, keys):
self.name = name
self.text = text
self.keys = keys
import wx
import wx.richtext
class Engine(wx.Frame):
def __init__(self, title = "Test", GameScreens = None, GameStart = None):
self.app = wx.App()
wx.Frame.__init__(self, None, -1, title, style= wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX, size=(745,425))
self.title = title
self.panel = wx.Panel(self, -1)
self.output = wx.richtext.RichTextCtrl(self.panel, wx.ID_ANY, value="", size=(740,420), style = wx.TE_READONLY)
self.output.SetEditable = False
self.output.BeginTextColour(wx.Colour(255,255,0))
self.output.BeginFontSize(11)
self.output.BeginBold()
self.output.SetBackgroundColour(wx.Colour(0,0,128))
self.Centre()
self.output.EnableScrolling(False, False)
self.Show(True)
self.Bind(wx.EVT_CHAR, self.onCharEvent)
self.Screen = None
self.Screens = Screens()
self.output.Enabled = False
if Screen is None:
#Default Screens
default = Screens()
b = Keys()
b.add(Key("ALL", "No Keys pressent", ("load", "test"), False))
b.add(Key("1", "Testscreen", ("load", "test"), True))
a = Screen("default", "<(255,0,0)>Engine loaded </(255,0,0)>\nDefault Screen loaded!", b)
default.add(a)
#Test Screen
b = Keys()
c = Key("B", "Back", ("load", "default"), True)
b.add(c)
a = Screen("test", "Test loaded!", b)
default.add(a)
self.Screens = default
self.load("default")
else:
self.Screens = GameScreens
self.load(GameStart)
self.app.MainLoop()
def onCharEvent(self, event):
try:
a = chr(event.GetKeyCode())
except ValueError:
a = ""
try:
key = self.Screen.keys.list[a]
except KeyError:
try:
key = self.Screen.keys.list['ALL']
except KeyError:
return False
if key.do[0] == "load":
self.load(key.do[1])
if key.do[0] == "quit":
pass
# hier quit rein!
def load(self, screenname):
self.Screen = self.Screens.list[screenname]
self.output.Clear()
#text = self.Screen.text
text = []
text.extend(parser(self.Screen.text))
text.extend("\n\n")
text.extend(parser(self.Screen.keys.generatetext()))
for l in text:
if l == "center":
self.output.BeginAlignment(2)
elif l == "/center":
self.output.EndAlignment()
elif l == "!left":
self.output.BeginAlignment(1)
elif l == "!/left":
self.output.EndAlignment()
elif l == "!right":
self.output.BeginAlignment(3)
elif l == "!/right":
self.output.EndAlignment()
elif l[:1] == "(" and l[-1:] == ")":
self.output.BeginTextColour(colourparser(l[1:-1]))
elif l[:2] == "/(" and l[-1:] == ")":
self.output.EndTextColour()
else:
self.output.WriteText(l)
#self.output.WriteText(self.Screen.text)
#self.output.WriteText("\n \n")
#self.output.WriteText(self.Screen.keys.generatetext())
def parser(string):
out = []
stringlist = string.split("<")
for k in stringlist:
out.extend(k.split(">"))
return out
def colourparser(string):
stringlist = string.split(",")
return wx.Colour(int(stringlist[0]),int(stringlist[1]),int(stringlist[2]))
Was ich im Prinziep mache ist, ich erstelle Räume, jeder Raum besteht aus Name, Angezeigtem Text und Auswahlmöglichkeiten (Keys)
Keys sind wiederum eine Anzahl von Key die die entsprechende Auswahl (also den Char der erwartet wird), den Text der dabei angezeigt wird und die folgenden Aktion enthalten.
Einfach mal mit einem "Engine()" den Testscreen hochbringen, dann sieht man was ich meine.
Habe schon nach PyGame geschielt, konnte dort aber bisher nur 2D und 3D Tutorials finden obwohl ich weiß das es da auch Textadventures gibt. Vlt kann mir da einer einen Tipp geben?