Willkommen Gast. Bitte einloggen oder registrieren.
Übersicht Hilfe Suche Einloggen Registrieren

+  BrettspielWelt
|-+  Technische Fragen
| |-+  Puppet-Stuff (Moderator: SLC)
| | |-+  mehrdimensionale Listen
0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: mehrdimensionale Listen  (Gelesen 233 mal)
der_fuchs
Zauberlehrling
**
Geschlecht: Männlich
Beiträge: 60



Profil anzeigen
« am: 03.11.2005, 00:29:16 »

Huhu ich möchte auch ein puppet schreiben und hab mal folgende Fragen:
-      Gibt es mehrdimensionale Listen?
-      Wie kann ich auf Element x in einer Liste zugreifen? Mit x = liste[3] geht das ja net wie bei andern Sprachen.

Danke für die Hilfe
Gespeichert
Deciman
Zaubermeister
*****
Geschlecht: Männlich
Beiträge: 997


Koch ist kein Beruf, sondern eine Berufung!

117544025
Profil anzeigen
« Antworten #1 am: 03.11.2005, 01:27:46 »

Zitat
-      Gibt es mehrdimensionale Listen?


Was verstehst Du darunter?


Zitat
-      Wie kann ich auf Element x in einer Liste zugreifen?


EVAL x = 3 ELEMENTOF [IRGENDWAS]
Setzt x = 3. Element der Liste 'IRGENDWAS'

Deci
Gespeichert

Deciman, Stelli von C63 (Pirates_Cove)      
Bodo
Zaubermeister
*****
Geschlecht: Männlich
Beiträge: 1504


Mensch, Spieler, BSWler, Dragontowner. Spiele fast alle Spiele mit moderatem Glückseinfluss.


Profil anzeigen WWW
« Antworten #2 am: 03.11.2005, 11:57:17 »

mehrdimensionale Listen müssen leider händisch simuliert werden, indem man mehrere Listen verwendet.

Der Werwölfe-Spielleiter verwendet so etwas für seine Userstatistiken.

In der ersten Liste stehen alle Usernamen. In jeder weiteren Liste dann eine Information (Anzahl Spiele, Häufigkeit Rollen etc) aller Spieler.

Wie man die Daten eines speziellen Users findet:
Mit Findlist den Usernamen in der 1. Liste lokalisieren. Dann hast du die Position aller Informationen zu diesem Datensatz.

Anschließend kannst du dann mit einer For-Schleife mit 2-3 Zeilen alle Informationen in spezielle Variablen kopieren.

Hier als Beispiel mal der Code, der beim spielleiter prüft, ob ein Spieler schon in der Liste ist und entweder seine Daten updatet oder zusätzlich anlegt (sind zugegebenermaßen mehr als 3 Zeilen ;-)
Code:
     SET statvars "spiele sieger ueberlebt verliebt verliebtgewonnen buerger werwolf jaeger hexe seherin dieb amor gegner chatzeilen"
# in obiger Zeile stehen alle gespeicherten Variablen

ACTION statistikenladen      # kopiert die SAVEs in verständliche Variablen
     EVAL gesamtspieler = LISTLENGTH [SAVE80]
     SET counter "80"
     FOR varspeichern IN "spieler [statvars]" DO
           BEGIN
                 SET [varspeichern]_bisher [SAVE[counter]]
                 IF [SAVE[counter]] == ""
                       FOR wessenstat IN [SAVE80] DO
                             ADDLIST [varspeichern]_bisher 0
                 EVAL counter = [counter] + 1
           END
END

ACTION statistikenspeichern      # überträgt die SAVEs aus den verständlichen Variablen wieder zurück
     SET counter "80"
     FOR varspeichern IN "spieler [statvars]" DO
           BEGIN
                 SET SAVE[counter] [[varspeichern]_bisher]
                 EVAL counter = [counter] + 1
           END
     SAVEDATA
END

ACTION statistikspielerladen
     IF [wessenstat] INLIST [spieler_bisher]
                 BEGIN                   #      Spieler war schon in Statistiken
                       FINDLIST spieler_bisher [wessenstat]
                       SET [wessenstat]_spielernr [INDEX1]
                       FOR varspeichern IN [statvars] DO
                             EVAL [varspeichern]_[wessenstat] = [[wessenstat]_spielernr] ELEMENTOF [[varspeichern]_bisher]
                 END
           ELSE
                 BEGIN                  # Spieler war noch NICHT in Statistiken, also muss er angelegt und initialisiert werden
                       ADDLIST spieler_bisher [neuerspieler]
                       FOR varspeichern IN [statvars] DO
                             BEGIN
                                   SET [varspeichern]_[wessenstat] 0
                                   ADDLIST [varspeichern]_bisher 0
                             END
                       EVAL gesamtspieler = [gesamtspieler] + 1
                       SET [wessenstat]_spielernr [gesamtspieler]
                 END
END


Die ersten 2 Routinen dienen nur dem Luxus, dass ich im Puppet mit hübschen Variablennamen arbeiten kann und nicht die ganze Zeit auf SAVE80, 81 etc. zugreifen muss.

Außerdem wird so die Gefahr, dass ein Absturz des Puppets die Datenbank ruiniert, erheblich gemindert, da nur noch Abstürze während dieser schnellen Routine gefährlich sind.

Ich hoffe, die Routinen sind hilfreich.

Noch eine kleine Anmerkung. Das Ganze geht natürlich auch einfacher, wenn man keinen Wert darauf legt, dass die Datensätze einzeln ausgelesen werden sollen. Theoretisch kann man natürlich mit verschachtelten FORs alle Einträge beim Puppetstart auslesen, aber das würde beim spielleiter inzwischen wohl ca. 15 Minuten dauern und das wäre nach jeder Partie wohl inakzeptabel.
« Letzte Änderung: 03.11.2005, 11:59:40 von Bodo » Gespeichert

Bis dann
Bodo
Dragontowner (C30)
Ich muss nicht immer gewinnen, aber ich muss rechtschaffen sein. Ich muss nicht immer Erfolg haben, aber ich muss meinen Grundsätzen gemäß leben. (Abraham Lincoln)
uvo
(Ω2.12.19 23:51)

Zaubermeister
*****
Geschlecht: Männlich
Beiträge: 2750



Profil anzeigen
« Antworten #3 am: 03.11.2005, 14:19:55 »

Es gibt noch einen Trick, mit dem man mehrdimensionale Listen simulieren kann; ich hab grad keinen passenden Quellcode zur Hand, deswegen hier nur ein Beispiel, wie man ein dreidimensionales Array erzeugt:

Such dir ein paar Sonderzeichen, die in deinen Array-Einträgen garantiert nicht vorkommen, in meinem Beispiel werden das ; und §.
Dann erzeuge eine ganz normale Liste (Elemente durch Leerzeichen getrennt). Deren Einträge sind jetzt nicht einfach nur Element, sondern auch wieder Listen, deren Einträge jetzt allerdings durch ; getrennt werden, und diese Einträge sind dann wieder Listen, deren Elemente durch § getrennt werden.

Das Ganze sieht dann ungefähr so aus:

LOCAL array = "a§b§c;d§e§f g§h§i;j§k§l m§n§o;p§q§r"
# array ist jetzt ein 3x2x3-Array.
# Um an das Element mit den Koordinaten x,y,z zu kommen:
LOCAL element =
  • ELEMENTOF [array]
    REPLACE element ";" " "
    EVAL element = [y] ELEMENTOF [array]
    REPLACE element "§" " "
    EVAL element = [z] ELEMENTOF [array]

    Nicht besonders handlich, aber wenn es din erster Linie darum geht, den vorhandenen Speicherplatz optimal auszunutzen, sehr nützlich.

    Grüßle,
    uvo
Gespeichert
SLC
Magier
*****
Geschlecht: Männlich
Beiträge: 14510


Ich heiße SLC, komme aus Hamburg und spiele gern (wer denn nicht?)

SLC_BSW
Profil anzeigen WWW
« Antworten #4 am: 03.11.2005, 17:42:37 »

Huhu, der_fuchs!

Laß Dich davon mal nicht erschlagen... Grin

Also, zur 2. Frage:

Code:
LOCAL Wert = [Index] ELEMENTOF [Liste]
SETELEMENT Liste [Index] [Wert]

Zur 1. Frage:
Was bei den Puppets geht (und in anderen Sprachen nicht):
Variablennamen sind variabel. Das heißt, man kann z.B.
für ein mxn-Array m Listen der Länge n anlegen:

Code:
LOCAL WertMxN = [IndexN] ELEMENTOF [Liste[IndexM]]
SETELEMENT Liste[IndexM] [IndexN] [WertMxN]

Außerdem gibt es noch dem Problem angelehnte Lösungen,
sieht dazu Bodos Code (dort steht der Name des Spielers
im Variablennamen drin).

Grüße, SLC

P.S.@all: Gutes Zeichen, daß hier soviel gepostet wird,
bevor ich selbst antworte. Bin trotzdem geschockt! *fg*
Gespeichert
der_fuchs
Zauberlehrling
**
Geschlecht: Männlich
Beiträge: 60



Profil anzeigen
« Antworten #5 am: 04.11.2005, 01:39:46 »

Huhu,

also echt suppi so schnell soviel hilfe!

Muss dann mal probieren *g

VIELEN DANK @ALL
Roll Eyes
Gespeichert
der_fuchs
Zauberlehrling
**
Geschlecht: Männlich
Beiträge: 60



Profil anzeigen
« Antworten #6 am: 06.11.2005, 03:23:20 »

Huhu,

also ich versteh die listen irgendwie net *g

ACTION Test
   ADDLIST Teilnehmer [WHO]
   ADDLIST Punkte 0
   EVAL i = 0
   FOR Pers IN [Teilnehmer] DO
   BEGIN
       IF [Pers] == [WHO]
       BEGIN
           EVAL Wert = ELEMENTOF [Punkte]
           EVAL Wert = [Wert] + 1
           SETELEMENT Punkte [Wert]
       END
       EVAL i = + 1
   END
   EVAL aktuell = ELEMENTOF [Punkte]
   >> [WHO] hat [aktuell] Punkte
END

Im Debugger kommt dann immer ungültiges Element oder so bei „SETELEMENT Punkte [Wert]“. Wobei doch nach einmal ausführen das erste Element von Punkte den Wert 1 haben sollte?!
„EVAL Wert = ELEMENTOF [Punkte]“ funktioniert einwandfrei, da kann ich mit den Wert auch ausgeben lassen.

Was mach ich falsch?

Gibt es eine einfachere Lösung?
Gespeichert
Catdog
Zaubermeister
*****
Geschlecht: Männlich
Beiträge: 1428


warten tut ihr sicherlich weil RL meine Familie grad Vorrang hat.

226987084
Profil anzeigen
« Antworten #7 am: 06.11.2005, 03:50:35 »

ich reisse einfach mal nen kleinen Teil aus nem Testprojektraus ( Mahjonggturnierpuppet)

Code:
     FINDLIST SAVE95 [SAVE97]
     LOCAL vergleich = [INDEX[i]] ELEMENTOF "[SAVE96]"
     IF [vergleich] <= [SAVE98]
     SETELEMENT SAVE96 [i] [SAVE98]


in SAVE95 würde ich die Liste aller schon vorhandenen Spieler gehabt haben ( SAVE97 akt. Suchname ), und in SAVE 96 die dazugehörenden Highscores ( SAVE98 enthält neues Ergebnis das geprüft werden soll auf Verbesserung )
Gespeichert

Wer nichts besseres zu tun hat als Rechtschreibfehler zu korrigieren, der verkneife es sich dieses hierzu zu posten - es interressiert mich einfach nicht, freut euch über eure Funde und behaltet diese als Screenshot zur Erinnerung.
SLC
Magier
*****
Geschlecht: Männlich
Beiträge: 14510


Ich heiße SLC, komme aus Hamburg und spiele gern (wer denn nicht?)

SLC_BSW
Profil anzeigen WWW
« Antworten #8 am: 06.11.2005, 04:18:43 »

Moin, der_fuchs!

Die (Index-) Zählung sowohl bei ELEMENTOF als auch bei SETELEMENT
beginnt bei Puppets immer bei 1. Das wird's sein... Grin

Grüße, SLC
Gespeichert
der_fuchs
Zauberlehrling
**
Geschlecht: Männlich
Beiträge: 60



Profil anzeigen
« Antworten #9 am: 06.11.2005, 04:40:45 »

Zitat
Die (Index-) Zählung sowohl bei ELEMENTOF als auch bei SETELEMENT
beginnt bei Puppets immer bei 1. Das wird's sein...


lol, wer hat denn dass verbrochen? Bei allen Sprachen die ich kenn fängt es mit 0 an Grin

Aber thx mal wieder für die Hilfe! Bis zum nächsten problem! Roll Eyes
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.15 | SMF © 2006-2009, Simple Machines
SMFAds for Free Forums
Prüfe XHTML 1.0 Prüfe CSS