Seite 2 von 2
Verfasst: Montag 29. Juni 2009, 09:44
von Rebecca
Das geht aber nur, wenn man auf jedes Feld nicht mehr als einmal kommen darf. Ich wuerde die Informationen eher von der Karte trennen, jeder Spieler koennte eine Liste der besuchten Koordinaten haben, evtl. mit Beschraenkung der Laenge, wie weit man zurueckblicken kann.
Wozu ist die Information ueberhaupt wichtig? EDIT: OK, mir fiele Snake ein

Verfasst: Montag 29. Juni 2009, 10:02
von EyDu
Du solltest als Kartenname besser nicht "map" benutze, damit verdeckst du einen built-in-Namen.
Verfasst: Montag 29. Juni 2009, 19:48
von roschi
Rebecca hat geschrieben:Das geht aber nur, wenn man auf jedes Feld nicht mehr als einmal kommen darf. Ich wuerde die Informationen eher von der Karte trennen, jeder Spieler koennte eine Liste der besuchten Koordinaten haben, evtl. mit Beschraenkung der Laenge, wie weit man zurueckblicken kann.
Kannst du mir das etwas naeher erlaeutern? Ich verstehe deine Aussage nicht so ganz. Die Informationen sollen schon in der Karte ersichtlich sein.
Rebecca hat geschrieben:Wozu ist die Information ueberhaupt wichtig? EDIT: OK, mir fiele Snake ein

Nein, es geht um ein MUD -
http://de.wikipedia.org/wiki/Multi_User_Dungeon. Man kann sich zwischen den einzelnen Feldern bewegen. Auf jedem Feld gibt es bestimmte Ausgaenge, und nur in diese Richtungen kann man laufen. Die Karte soll speziell fuer ein Labyrinth sein, indem es wichtig ist, dass man genau weiß, welche Felder miteinander verbunden sind.
EyDu hat geschrieben:Du solltest als Kartenname besser nicht "map" benutze, damit verdeckst du einen built-in-Namen.
ich weiß, aber es war ja nur ein beispiel

danke dir fuer den hinweis.
lg
roschi
Verfasst: Montag 29. Juni 2009, 21:11
von Rebecca
Die Informationen sollen schon in der Karte ersichtlich sein.
Achso, ich dachte es geht erstmal um das interne Speichern der Daten, was ja mit der Darstellung erstmal nich so viel zu tun hat.
Tja, das Anzeigen wird es mit ASCII-Art natuerlich schon schwieriger, du koenntest versuchen, mit senkrechten, waagerechten und schraegen Strichen Strichen versuchen, die Spur "zu malen", fuer ne Ueberkreuzung dann ein Plus oder so.... K.A. wie gut das funktioniert...
Verfasst: Montag 29. Juni 2009, 21:22
von numerix
Rebecca hat geschrieben:du koenntest versuchen, mit senkrechten, waagerechten und schraegen Strichen Strichen versuchen, die Spur "zu malen", fuer ne Ueberkreuzung dann ein Plus oder so.... K.A. wie gut das funktioniert...
Das war auch mein erster Gedanke, aber dann hat man noch weniger Informationen als durch "N, S, O, W", weil die Richtungsinformation zweideutig ist. Man könnte aus optischen Gründen stattdessen natürlich auch so etwas wie "∧ ∨ < >" verwenden.
Wenn entweder jedes Feld nur einmal betreten werden darf - und dann nicht wieder - funktioniert das mit den Himmelsrichtungen. Falls auch mehrmaliges Betreten erlaubt ist, funktioniert es auch dann, wenn nur die Richtung benötigt wird, aus der *zuletzt* dieses Feld betreten wurde.
Verfasst: Montag 29. Juni 2009, 22:16
von roschi
numerix hat geschrieben:Rebecca hat geschrieben:du koenntest versuchen, mit senkrechten, waagerechten und schraegen Strichen Strichen versuchen, die Spur "zu malen", fuer ne Ueberkreuzung dann ein Plus oder so.... K.A. wie gut das funktioniert...
Das war auch mein erster Gedanke, aber dann hat man noch weniger Informationen als durch "N, S, O, W", weil die Richtungsinformation zweideutig ist. Man könnte aus optischen Gründen stattdessen natürlich auch so etwas wie "∧ ∨ < >" verwenden.
Wenn entweder jedes Feld nur einmal betreten werden darf - und dann nicht wieder - funktioniert das mit den Himmelsrichtungen. Falls auch mehrmaliges Betreten erlaubt ist, funktioniert es auch dann, wenn nur die Richtung benötigt wird, aus der *zuletzt* dieses Feld betreten wurde.
Alle Felder koennen auch mehrmals betreten werden.
Ich dachte gerade an sowas:
Jedes Feld ist von einem Kreis leeren Feldern umgeben, in die dann die Verbindungen gemalt werden... zum Beispiel so:
Wie koennte man das implementieren?
lg
roschi
Verfasst: Dienstag 30. Juni 2009, 09:18
von EyDu
roschi hat geschrieben:Wie koennte man das implementieren?
Indem du zwischen je zwei Spalten und je zwei Zeilen noch jeweils eine Spalte, bzw. Zeile, einfügst.
Verfasst: Dienstag 30. Juni 2009, 10:07
von frabron
Slightly Offtopic:
Irgendwie fällt mir dazu spontan
Nethack ein. Damals auf meinem 8086, das waren noch Zeiten

Verfasst: Dienstag 30. Juni 2009, 11:24
von numerix
roschi hat geschrieben:Ich dachte gerade an sowas:
Jedes Feld ist von einem Kreis leeren Feldern umgeben, in die dann die Verbindungen gemalt werden... zum Beispiel so:
Dann hast du aber keine Information darüber, in welche Richtung eine Verbindung hergestellt wurde (aber vielleicht brauchst du die Information ja auch nicht - das ist bisher nicht deutlich geworden).
Verfasst: Mittwoch 1. Juli 2009, 09:22
von roschi
EyDu hat geschrieben:roschi hat geschrieben:Wie koennte man das implementieren?
Indem du zwischen je zwei Spalten und je zwei Zeilen noch jeweils eine Spalte, bzw. Zeile, einfügst.
Genau, aber wie koennte man sowas im Code implementieren? Das grobe System ist mir ja klar, aber eine effiziente Implementierung fehlt

.
frabron hat geschrieben:Slightly Offtopic:
Irgendwie fällt mir dazu spontan
Nethack ein. Damals auf meinem 8086, das waren noch Zeiten


Ja, es hat eine gewisse Aenlichkeit, aber das MUD, welches ich spiele, ist deutlich groeßer und umfangreicher als Nethack

.
numerix hat geschrieben:roschi hat geschrieben:Ich dachte gerade an sowas:
Jedes Feld ist von einem Kreis leeren Feldern umgeben, in die dann die Verbindungen gemalt werden... zum Beispiel so:
Dann hast du aber keine Information darüber, in welche Richtung eine Verbindung hergestellt wurde (aber vielleicht brauchst du die Information ja auch nicht - das ist bisher nicht deutlich geworden).
Nein, diese Information brauche ich nicht. Ich muss nur wissen, welche Felder miteinander verbunden sind. Entschuldigt bitte meine unpraezise Ausdrucksweise.
lg
roschi
Verfasst: Mittwoch 1. Juli 2009, 09:44
von EyDu
Dann mach doch erstmal eine nicht-effiziente Lösung

Verfasst: Mittwoch 1. Juli 2009, 09:53
von sma
frabron hat geschrieben:Slightly Offtopic:
Irgendwie fällt mir dazu spontan
Nethack ein. Damals auf meinem 8086, das waren noch Zeiten :D
Nethack? Das ist doch viel zu modern :) Die Vorläufer Hack oder Rogue wecken andere Erinnerungen. Wer's mal sehen möchte, kein Windows hat und sich nicht von furchtbarem Python-Code, der 1:1 von dem C-Original stammt abschecken lässt:
http://github.com/sma/pyrogue/. NetHack habe ich aber auch mit Begeisterung gespielt...
@
Verfasst: Mittwoch 1. Juli 2009, 11:16
von sma
Ich kenne MUDs nur mit Räumen und Verbindungen. Daher würde ich das Datenmodell so bauen:
http://gist.github.com/138713 (ist ein bisschen länger geworden als gedacht...)
Stefan
Verfasst: Donnerstag 2. Juli 2009, 19:13
von roschi
sma hat geschrieben:
Ich kenne MUDs nur mit Räumen und Verbindungen. Daher würde ich das Datenmodell so bauen:
http://gist.github.com/138713 (ist ein bisschen länger geworden als gedacht...)
Stefan
Hallo!
Das ist nicht schlecht gemacht

lustige Sache - Danke dir!
Also meinst du, ich sollte fuer jeden Raum eine eigene Klasseninstanz erzeugen? Der Mapper soll verfolgen, welche Raeume ein Spieler in einem Labyrinth besucht, und dann diese Raeume mit samt ihren Verbindungen in eine Karte einzeichnen. Außerdem muessen einzelne Raeume auch wieder loeschbar sein, falls man mal in die falsche Richtung laeuft. Meine Klasse fuer die Karte arbeitet ja schon gut, nur weiß ich nicht, wie ich nun beim Schreiben der Karte in eine Datei die Verbindung in die umgebenden Felder einzeichne. Als Grundlage fuer die Verbindungsinformationen koennte ich ein Dictionary haben, indem die Koordinaten des Raumes als Key, und die Richtungen, in die man laufen kann, inform eines Tuples als Value eingetragen sind. Koennte mir jemand dazu einen Tipp geben? Das System mit den Koordinaten in den Dictionaries wuerde ich schon sehr gern behalten...
lg und vielen dank fuer eure Hilfe!
roschi
Verfasst: Samstag 4. Juli 2009, 09:05
von sma
Vorweg, ich würde nie zu Klasseninstanzen raten, höchsten zu Exemplaren. Zudem wären Klasseninstanzen nach meinem Verständnis Exemplare von Metaklassen, doch genug der Haarspalterei. Abhängig davon, ob sich dein MUD eher wie ein Textadventure mit einzelnen Orten anfühlen soll oder eher wie das ja auch schon erwähnte Hack (oder meinetwegen Diablo oder WoW), würde ich einzelne Räume als Exemplare einer Room- (oder Location)-Klasse modellieren oder doch eine Karte einführen. Ich kenne ein MUD so, dass man als Spieler auch die Welt mitgestalten kann, und z.B. eigene Räume "graben" kann und mit selbst erschaffenen Gegenstände "bevölkern" kann.
Einzelne Räume erlauben eine beliebige Topologie, auch eine, die man niemals kreuzungsfrei in 2D oder 3D aufzeichnen kann. Das kann ein Vorteil oder aber ein Nachteil sein.
Willst du einfach pro Spieler eine Karte haben, in der diesem Spieler bekannte Dinge eingezeichnet werden und hast du sowieso schon eine 2D-Karte, dann nimm doch einfach pro Spieler eine weitere dieser Karten. Dann verstehe ich dein Problem nicht genau.
Stefan
Verfasst: Mittwoch 29. Juli 2009, 11:10
von roschi
Hallo!
Erstmal bitte ich um Entschuldigung dafuer, dass ich jetzt so lange nicht geantwortet habe. Das lag daran, dass ich im Ausland war und keinen Internetzugang hatte. Es tut mir wirklich sehr leid.
sma hat geschrieben:Vorweg, ich würde nie zu Klasseninstanzen raten, höchsten zu Exemplaren. Zudem wären Klasseninstanzen nach meinem Verständnis Exemplare von Metaklassen, doch genug der Haarspalterei. Abhängig davon, ob sich dein MUD eher wie ein Textadventure mit einzelnen Orten anfühlen soll oder eher wie das ja auch schon erwähnte Hack (oder meinetwegen Diablo oder WoW), würde ich einzelne Räume als Exemplare einer Room- (oder Location)-Klasse modellieren oder doch eine Karte einführen. Ich kenne ein MUD so, dass man als Spieler auch die Welt mitgestalten kann, und z.B. eigene Räume "graben" kann und mit selbst erschaffenen Gegenstände "bevölkern" kann.
Mir geht es ja nicht darum, als Programmierer eines MUD's dem Spieler eine dynamische Karte zu liefern, mithilfe der er sich orientieren kann, sondern darum, als Spieler in einem Dungeon rumzulaufen und mitzuschneiden, wo ich langgelaufen bin, damit ich mich mich dann spaeter im selben Dungeon besser zurechtfinde.
sma hat geschrieben:Einzelne Räume erlauben eine beliebige Topologie, auch eine, die man niemals kreuzungsfrei in 2D oder 3D aufzeichnen kann. Das kann ein Vorteil oder aber ein Nachteil sein.
In meinem Fall sind die Raeume klar strukturiert. Sie lassen sich gut aufzeichnen, wenn man die einzelnen Verbindungen einzeichnen kann.
Was mir nun im Grunde einfach noch fehlt, ist eine Erweiterung meiner Schreib-Funktion, die die Verbindungen mit einbezieht. Wenn ich z.B. solch ein Dictionary habe, in dem die Verbindungen gespeichert sind:
Code: Alles auswählen
connections = {(0,0):("n","w","so"), (0,1):("s"), (-1,0):("o"), (1,-1):("nw")}
Dann muss ich nun am Ende sowas hier erhalten:
Das ist das eigentliche Problem.
Vielen Dank fuer eure Muehe!
lg
roschi
Verfasst: Mittwoch 29. Juli 2009, 14:19
von EyDu
Ich habe es mal schnell hingeschrieben, aber so in etwas sollte es funktionieren. Da kann man noch ein wenig optimieren und PEP 8 umsetzen, als Ansatz sollte es aber reichen.
Code: Alles auswählen
import operator
direction_map = {
"n": ((0,1), "|"), "e": ((1,0), "-"),
"s": ((0,-1), "|"), "w":((-1,0), "-"),
"ne": ((1,1), "/"), "se":((1,-1), "\\"),
"sw": ((-1,-1), "/"), "nw": ((-1,1), "\\")
}
connections = {(0,0):("n","w","se"), (0,1):("s",), (-1,0):("e",), (1,-1):("nw",)}
the_map = {}
for (x,y), dirs in connections.iteritems():
x, y = 2*x, 2*y
the_map[x,y] = "#"
for dir in dirs:
(xo, yo), c = direction_map[dir]
the_map[x+xo, y+yo] = c
xs = map(operator.itemgetter(0), the_map)
ys = map(operator.itemgetter(1), the_map)
xstart, xend = min(xs), max(xs)
ystart, yend = min(ys), max(ys)
for y in range(yend, ystart-1, -1):
for x in range(xstart, xend+1):
try:
print the_map[x,y],
except KeyError:
print " ",
print