2D-Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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 :)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du solltest als Kartenname besser nicht "map" benutze, damit verdeckst du einen built-in-Namen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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:

Code: Alles auswählen

#-#
| |
# #
| |\
# #-#
|/ X|
# # #
Wie koennte man das implementieren?

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Slightly Offtopic:
Irgendwie fällt mir dazu spontan Nethack ein. Damals auf meinem 8086, das waren noch Zeiten :D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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).
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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 :D
:-) Ja, es hat eine gewisse Aenlichkeit, aber das MUD, welches ich spiele, ist deutlich groeßer und umfangreicher als Nethack :D.
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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann mach doch erstmal eine nicht-effiziente Lösung ;-)
Das Leben ist wie ein Tennisball.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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...

@
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

roschi hat geschrieben:Nein, es geht um ein MUD - http://de.wikipedia.org/wiki/Multi_User_Dungeon.
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
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

sma hat geschrieben:
roschi hat geschrieben:Nein, es geht um ein MUD - http://de.wikipedia.org/wiki/Multi_User_Dungeon.
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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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:

Code: Alles auswählen

  #
  |
#-#
   \
    #
Das ist das eigentliche Problem.


Vielen Dank fuer eure Muehe!

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Antworten