Ich brauche Hilfe beim Scripten, hab mich verrannt!

Fragen zu "Adventure Game Studio"? Hier rein!
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

lieber khrismuc, ich hoffe du bist mir nicht böse, wenn ich den Thread noch mal ausgrabe, um dir Löcher in den Bauch zu fragen. Gestern hab ich den Schweinehund gepackt und aus dem Fenster geworfen, um mich endlich mal dem Labyrinthrätsel wieder anzunehmen. Muss dich aber noch einiges fragen.

(aus deinem ersten post:)
-->bool symbolused[10];
-->int platesymbol[7];

wofür stehen die Zahlen in den eckigen Klammern?
wofür sind die Variablen da?
Danke, Adventuretreff! <3
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

hoffe keiner ist böse wenn ich antworte :-)

das sind variablen arrays.
das heisst du hast 10 variabeln vom typ bool (von [0] - bis [9] ) und
7 von typ int (von [0] bis [6]).
bool für wahr oder falsch, int für ganzzahlen.

zugriff
ist zB so.

symbolused[0] = true;
symbolused[1] = false;
...

abfrage if(symbolused[4] == true)

mach was sinnvolles


das selbe bei den andern variablen.

platesymbol[3] = 162;
platesymbol[5] = 12;
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

achso also lauter variablen mit gleichem namen die aber trotzdem unterschiedlich sind, richtig?
Danke, Adventuretreff! <3
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7308
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Beitrag von Fightmeyer »

Richtig. Stell dir die Zahl in der eckigen Klammer als so ne Art Nummerierung der Variable vor.

EDIT:
So was bietet sich zum Beispiel immer sehr schön in Schleifen an. Man muß dann nicht jede Variabel benennen, sondern läßt die Nummerierung einfach per Code hochzählen.
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

ok danke schonmal, allerdings versteh ich noch nicht, warum ich denn 10x die eine und 7x die andere variable brauche, bei 9 symbolen und 6 bodenplatten?
Danke, Adventuretreff! <3
Wintermute
Adventure-Gott
Adventure-Gott
Beiträge: 3360
Registriert: 27.02.2004, 20:49

Beitrag von Wintermute »

Das hängt von deiner Nummerierung ab:
Wenn du ein Feld mit [9] Elementen hast, geht die eigentliche Indizierung von [0] bis [8] und nicht von [1] bis [9].
Wenn du jetzt also die Platten 1-9 ansprechen möchtest, kannst du entweder bei der Indizierung einfach eine Eins abziehen, oder stattdessen das Feld ein Element größer machen (Die [0]-Variable bleibt dann ungenutzt.)
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

ja, dann hätte ich ja auch 1-9, warum dann die 10? (platten sind übrigens nur 6, die symbole sind 9 frames in 6 views, je ein view für eine platte)
Danke, Adventuretreff! <3
Wintermute
Adventure-Gott
Adventure-Gott
Beiträge: 3360
Registriert: 27.02.2004, 20:49

Beitrag von Wintermute »

Weil du dann die Felder direkt mit der gleichen Nummer ansprechen kannst. Eine Feld das 10 Elemente groß ist, geht von der 0 bis zur 9.

Also in deinem Beispiel:
Platte 1 -> Feldelement 1
Platte 2 -> Feldelement 2
.....

Es geht auch mit nur 9 Elementen, nur dann mußt du etwas aufpassen:

Platte 1 -> Feldelement 0
Platte 2 -> Feldelement 1
.....

Ist ein bißchen Geschmackssache, was dir lieber ist.
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

achso, ok verstanden :)
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

versteh ich das richtig, dass die funktion

function SetPlates(int symbol, bool exists) { etc.

wenn ich zB 9 und true einsetze, das symbol 9 auf jeden fall verteilt und aus den restlichen 8 dann auswählt?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Genau. Wenn du für exists true einsetzt, ist die symbol-zahl auf jeden Fall dabei, der Rest zufällig.
Bei false ist die symbol auf keinen Fall dabei.

Außerdem kommt natürlich jedes der 9 Symbole höchstens einmal vor, egal ob true oder false.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

So, nun bin ich fast durch mit dem Skript, hier noch zwei letzte Fragen:
khrismuc hat geschrieben: if (exists) { // symbol MUSS dabei sein
Ich nehme mal an, dass "if(exists)" so viel bedeutet wie: wenn exists den Wert true annimmt, oder?
khrismuc hat geschrieben: while(c<=6) { // platten durchzählen
if (platesymbol[c]==0) { // platte hat noch kein symbol
while(symbolused[s]) { // ein unbenutztes raussuchen
s=Random(5)+1;
}
SetPlate(c, s); // auf die platte damit
}
c++; // nächste platte
}
}
In der Annahme, dass ich mit obiger Vermutung richtig liege: "while(symbolused[s]" würde dann so viel bedeuten wie: wenn symbolused[s] schon true ist, dann muss ein s rausgesucht werden, für das symbolused[s] noch false ist. Wo wird aber bestimmt, dass symbolused[s] true wird? Sobald ein s verwendet wird, müsste das doch noch passieren, oder? Oder muss man das nicht noch extra hinschreiben?
Danke, Adventuretreff! <3
Wintermute
Adventure-Gott
Adventure-Gott
Beiträge: 3360
Registriert: 27.02.2004, 20:49

Beitrag von Wintermute »

DieFüchsin hat geschrieben:Ich nehme mal an, dass "if(exists)" so viel bedeutet wie: wenn exists den Wert true annimmt, oder?
Richtig!
Und das gilt eigentlich für alle IF-Abfragen, auch wenn dies am Anfang nicht ganz offensichtlich ist.
Wenn du z.B. den Befehl hast IF (a=b), dann wird der IF-Teil dann ausgeführt, wenn der Inhalt der Klammer wahr, also TRUE ist. Für den IF-Befehl ist es vollkommen egal, ob innerhalb der Klammer eine Variable, ein Vergleich irgendewas Anderes steht, das Ergebnis muß aber ein Boolscher Wert sein.


Um noch einmal ganz kurz zu den Feldern und der Anzahl der Elemente zurückzukommen (und das beantwortet auch deine 2. Frage. :wink: )
Ich habe mir jetzt den Skript von khrismuc mal genauer angeschaut (was ich vorher nicht gemacht habe):

So wie er es programmiert hat, müssen die Felder ein Element mehr deklariert werden (also [10] statt [9]). Für das Feld platesymbol ist es egal, aber in symbolused wird das erste Element [0] als ein Dummy-Element benutzt, daß immer auf TRUE steht (wird ganz am Anfang der Routine gesetzt).
Die Schleife

Code: Alles auswählen

        while(symbolused[s]) {  // ein unbenutztes raussuchen
          s=Random(5)+1;
sucht zufällig nach einer noch unbenutzten Platte zwischen 1 und 6. Wie du schon richtig erkannt hast, sind am Anfang eigentlich alle Platten noch unbenutzt, ABER s hat hier noch den Wert 0, d.h. es zeigt auf keine richtige Platte, sondern auf den Dummy-Index [0], der immer TRUE ist, also wird die Schleife auf jeden Fall ausgeführt.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

DieFüchsin hat geschrieben:Wo wird aber bestimmt, dass symbolused[s] true wird? Sobald ein s verwendet wird, müsste das doch noch passieren, oder? Oder muss man das nicht noch extra hinschreiben?
Doch, muss man, Du hast völlig recht.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4407
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

@ wintermute: ich glaube, du verwechselst da was, symbolused sucht nicht nach einer platte, sondern zeigt, ob ein symbol schon benutzt wurde, oder nicht und weil 0 ja ein Dummy ist, wird es nie verwendet werden, weil immer angezeigt wird, dass es schon benutzt wurde.

@ khrismuc: ich schreibs dann so, oder?:

while(c<=6) { // platten durchzählen
if (platesymbol[c]==0) { // platte hat noch kein symbol
while(symbolused[s]) { // ein unbenutztes raussuchen
s=Random(5)+1;
}
SetPlate(c, s); // auf die platte damit
symbolused[s]=true
}
c++; // nächste platte
}
}
Danke, Adventuretreff! <3
Antworten