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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Im Prinzip smas __str__-Methode:

Code: Alles auswählen

v = VirtualMap(" ")
#fill map here
for y in range (10):
    for x in range(10):
        v[x,y] = "x" if (x+y)%2 else "o"

for y in range(v.miny, v.miny + v.height):
    for x in range(v.minx, v.minx +v .width):
        print v[x, y],
    print
ungetestet.
Zuletzt geändert von EyDu am Sonntag 21. Juni 2009, 10:37, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Was kann ich, was nicht auch du ausprobieren könntest?

Code: Alles auswählen

>>> m = VirtualMap('.')
>>> m[0,0] = m[9,9] = 'x'
>>> print m
0-9, 0-9
x . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . x
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo sma und EyDu

Danke für eure Antworten. Beides funktioniert.
sma hat geschrieben:Was kann ich, was nicht auch du ausprobieren könntest?
Wenn ich es nicht versucht hätte würde ich dich auch nicht fragen!

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Hallo!

Hier hat sich ja waehrend meiner Abwesenheit viel um die Frage gedreht, wie ich sehe :-).

Mein jetziger Stand:
Der Mapper funktioniert soweit.
Den Code der Map-Klasse findet ihr hier: http://paste.pocoo.org/show/125687/

Verwendet wird das Ganze dann z.B. so:

Code: Alles auswählen

# liste der verschiedenen himmelsrichtungen,
# ihren positionsaenderung auf den achsen
# und den Gegenrichtungen
# (die in dem beispiel aber nicht gebraucht werden)
DIRECTIONS = {"n":(0, 1, "s"),
              "o":(1, 0, "w"),
              "s":(0, -1, "n"),
              "w":(-1, 0, "o"),
              "no":(1, 1, "sw"),
              "so":(1, -1, "nw"),
              "sw":(-1, -1, "no"),
              "nw":(-1, 1, "so")}
# benutzung der klasse
map = Map()
current_cords = (0, 0)
# beispiel fuer norden:
direction = "n"
new_cords = (current_cords[0] + DIRECTIONS[direction][0],
             current_cords[1] + DIRECTIONS[direction][1])
# ...
# hier werden im orginialscript noch informationen
# gespeichert, damit die aktion wieder rueckgaengig
# gemacht werden kann.
# ...
current_cords = new_cords
map.write_field(current_cords, DEFAULT_SYMBOL)
# karte in datei schreiben
map.write_into_file("map.txt")
Der Benutzer kann sich nun (in einem Spiel) durch die Himmelsrichtungen bewegen, und eine Funktion im Script wird dabei aufgerufen, die die Aenderungen dann in die Karte eintraegt. Nun habe ich allerdings noch ein grundsaetzliches Problem:
Der Spieler geht z.B. folgenden Weg: norden, nordem, norden, osten, sueden, sueden, sueden.
Man wuerde nun in der karte das hier sehen:

Code: Alles auswählen

##
##
##
##
Keiner weiß nun, ob er nicht vielleicht immer zwischen Westen und Osten gewechselt hat, da man keine Verbindungen zwischen den einzelnen Feldern sieht.
Hat vielleicht jemand einen Vorschlag, wie ich diese Verbindungen noch mit in die Karte schreiben koennte? Mir wuerde ein Beispielcode sehr helfen.

lg und vielen Dank fuer die Hilfe
roschi

[edit]
Typo im Code gefixt.
[/edit]
Zuletzt geändert von roschi am Montag 29. Juni 2009, 23:25, insgesamt 1-mal geändert.
[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
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du könntest die Rauten ersetzen z.B. durch Buchstaben N, S, O, W, wobei der Buchstabe jeweils angibt, aus welcher Richtung das Feld belegt wurde.
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
Antworten