Ich brauche Hilfe beim Scripten, hab mich verrannt!
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
Ich brauche Hilfe beim Scripten, hab mich verrannt!
Ich versuche zwar, meine Scripts selbst zu entwickeln (wenn sicher auch sehr unprofessionell) aber jetzt habe ich mich in zu viele ifs und elses und variablen verheddert und komm auf keine Lösung. Könnte mir ein Programmiererfahrener ein bisschen unter die Arme greifen?
Ich habe: einen sechseckigen Raum mit sechs Bodenplatten, die jeweils eine von sechs Türen öffnen. Anhand der Symbole auf den Bodenplatten soll man herausfinden, durch welche Tür man als nächstes muss.
Geht man durch eine Tür, wird der Raum resettet und die Bilder auf den Bodenplatten neu verteilt. Ist man durch die richtige Tür gegangen, zählt eine Globale Variable (next) einen wert hoch, ansonsten wird sie 0.
Ich bin das ganze so angegangen: Ich habe eine Variable (wahl) dafür verwendet, die Bodenplatte auszuwählen, die das nächste richtige Bild bekommt (vorausgesetzt, next ist nicht 0)
danach wollte ich irgendwie die übrigen Bilder auf die Bodenplatten verteilen, wobei ich insgesamt 9 Bilder zur Auswahl hatte - eines schon verwendet wurde, also noch 8 bilder für 5 Bodenplatten zur Auswahl stehen.
Ist next 0 sollen die 9 Bilder auf die 6 Bodenplatten verteilt werden, ohne dass es eine neue "richtige" Platte gibt.
Mein momentanes Script poste ich, wenn ich wieder mein Laptop dabei hab, das schonmal vorweg, ich hoffe, ich hab mich verständlich ausgedrückt und dass mir jemand helfen kann.
Ich habe: einen sechseckigen Raum mit sechs Bodenplatten, die jeweils eine von sechs Türen öffnen. Anhand der Symbole auf den Bodenplatten soll man herausfinden, durch welche Tür man als nächstes muss.
Geht man durch eine Tür, wird der Raum resettet und die Bilder auf den Bodenplatten neu verteilt. Ist man durch die richtige Tür gegangen, zählt eine Globale Variable (next) einen wert hoch, ansonsten wird sie 0.
Ich bin das ganze so angegangen: Ich habe eine Variable (wahl) dafür verwendet, die Bodenplatte auszuwählen, die das nächste richtige Bild bekommt (vorausgesetzt, next ist nicht 0)
danach wollte ich irgendwie die übrigen Bilder auf die Bodenplatten verteilen, wobei ich insgesamt 9 Bilder zur Auswahl hatte - eines schon verwendet wurde, also noch 8 bilder für 5 Bodenplatten zur Auswahl stehen.
Ist next 0 sollen die 9 Bilder auf die 6 Bodenplatten verteilt werden, ohne dass es eine neue "richtige" Platte gibt.
Mein momentanes Script poste ich, wenn ich wieder mein Laptop dabei hab, das schonmal vorweg, ich hoffe, ich hab mich verständlich ausgedrückt und dass mir jemand helfen kann.
Danke, Adventuretreff! <3
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Ich helf Dir gerne, allerdings ist mir der genaue Ablauf noch etwas unklar.
Wenn ich Dich richtig verstehe, muss der Spieler in einer bestimmten Reihenfolge nacheinander auf sechs Bodenplatten treten, wobei sich jeweils eine der Türen öffnet.
Wenn man durch eine Tür geht, landet man in einem anderen Raum, oder?
Und wenn man in den Sechseckigen zurückgeht, haben sich die übrigen Bodenplatten neu verteilt?
Warum wechseln noch nicht absolvierte Bodenplatten die Position, wenn es nur auf die Reihenfolge der Symbole ankommt?
Oder rede ich Stuss?
Versuch, das Rätsel als Designer zu beschreiben, nicht als Programmierer.
Wenn ich Dich richtig verstehe, muss der Spieler in einer bestimmten Reihenfolge nacheinander auf sechs Bodenplatten treten, wobei sich jeweils eine der Türen öffnet.
Wenn man durch eine Tür geht, landet man in einem anderen Raum, oder?
Und wenn man in den Sechseckigen zurückgeht, haben sich die übrigen Bodenplatten neu verteilt?
Warum wechseln noch nicht absolvierte Bodenplatten die Position, wenn es nur auf die Reihenfolge der Symbole ankommt?
Oder rede ich Stuss?
Versuch, das Rätsel als Designer zu beschreiben, nicht als Programmierer.
Use gopher repellent on funny little man
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
Also man startet in einem sechseckigen Raum (Nr1), in welchem die Bodenplatten festgelegt sind, also auch die "richtige".
Egal durch welche Tür man nun geht, kommt man in einen neuen sechseckigen Raum (Nr2).
Ging man durch die richtige bekommt eine zufällige Bodenplatte das neue richtige Bild, alle anderen Platten zufällig eins der anderen 8 Platten.
Ging man durch die falsche, bekommen alle Platten zufällig eines der neun Bilder zugeteilt.
Geht man nun durch eine Tür, gelangt man wieder in den selben Raum (Nr2). Und das Spiel mit der verteilung geht von vorn los.
Man ist zwar Programmtechnisch im selben Raum, aber für den Spieler ist es ein anderer.
Geht man 9x durch die richtige Tür (die dank zufälliger verteilung ja immer woanders ist), kommt man in einen anderen Raum (Nr3), der nur Ein- und Ausgang hat.
Es soll quasi wie bei MI1 sein, wo man in dem Affenkopflabyrinth rumirrt.
Es gibt kein festgesetztes Labyrinth sondern jeder Raum wird jedesmal neu erstellt: das ganze Labyrinth findet nur in Raum Nr2 statt.
Meine Bodenplatten sind natürlich Objects und die Türen werden durch Betreten von Regions ausgelöst. (also auch entschieden, ob die Tür die richtige oder falsche ist)
Egal durch welche Tür man nun geht, kommt man in einen neuen sechseckigen Raum (Nr2).
Ging man durch die richtige bekommt eine zufällige Bodenplatte das neue richtige Bild, alle anderen Platten zufällig eins der anderen 8 Platten.
Ging man durch die falsche, bekommen alle Platten zufällig eines der neun Bilder zugeteilt.
Geht man nun durch eine Tür, gelangt man wieder in den selben Raum (Nr2). Und das Spiel mit der verteilung geht von vorn los.
Man ist zwar Programmtechnisch im selben Raum, aber für den Spieler ist es ein anderer.
Geht man 9x durch die richtige Tür (die dank zufälliger verteilung ja immer woanders ist), kommt man in einen anderen Raum (Nr3), der nur Ein- und Ausgang hat.
Es soll quasi wie bei MI1 sein, wo man in dem Affenkopflabyrinth rumirrt.
Es gibt kein festgesetztes Labyrinth sondern jeder Raum wird jedesmal neu erstellt: das ganze Labyrinth findet nur in Raum Nr2 statt.
Meine Bodenplatten sind natürlich Objects und die Türen werden durch Betreten von Regions ausgelöst. (also auch entschieden, ob die Tür die richtige oder falsche ist)
Danke, Adventuretreff! <3
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Ok, langsam versteh ich, aber sind es jetzt 6 Bodenplatten oder 9?
Und es sind 6 Türen, oder? In jeder Wand eine, denk ich mal.
Wenn man 9x durch die richtige Tür muss, woran merkt man nach der sechsten Tür, dass man noch auf dem richtigen Weg ist?
Sind auf den Türen auch Symbole?
Wenn der Spieler irgendwann durch die falsche Tür geht, muss er ja anscheinend wieder von vorne anfangen, muss er sich denn merken, wo die Türen des richtigen Wegs sind? Ne, die sind ja zufällig, also für mich hört sich das Rätsel sehr frustrierend und unfair an...
Schick mir doch mal einen Screenshot per PM, das macht die Sache viel einfacher.
Und es sind 6 Türen, oder? In jeder Wand eine, denk ich mal.
Wenn man 9x durch die richtige Tür muss, woran merkt man nach der sechsten Tür, dass man noch auf dem richtigen Weg ist?
Sind auf den Türen auch Symbole?
Wenn der Spieler irgendwann durch die falsche Tür geht, muss er ja anscheinend wieder von vorne anfangen, muss er sich denn merken, wo die Türen des richtigen Wegs sind? Ne, die sind ja zufällig, also für mich hört sich das Rätsel sehr frustrierend und unfair an...
Schick mir doch mal einen Screenshot per PM, das macht die Sache viel einfacher.
Use gopher repellent on funny little man
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Danke für die PM, sorry für den Doppelpost
Als erstes würde ich für jede der sechs Platten eine View einrichten, dann jeweils den ersten Loop mit den Ansichten der neun Symbole füllen.
Außerdem sollten die Plattenobjekte der Einfachheit halber die IDs 1-6 haben.
Jetzt kannst Du z.B. mit SetPlates(2, true); erzwingen, dass Nr.2 dabei ist, oder mit SetPlates(4, false) erzwingen, dass Nr.4 nicht dabei ist.
Und GetPlayerSymbol() liefert die Nr. des Symbols zurück, auf dessen Platte der Spieler steht, oder 0, wenn er auf keiner Platte steht.
Hoffentlich hilft Dir das erstmal weiter.
Als erstes würde ich für jede der sechs Platten eine View einrichten, dann jeweils den ersten Loop mit den Ansichten der neun Symbole füllen.
Außerdem sollten die Plattenobjekte der Einfachheit halber die IDs 1-6 haben.
Code: Alles auswählen
// room script
function SetPlate(int plate, int symbol) { // plate 1-6, symbol 1-9
abs=10; // wenn views der platten z.B.: 11-16
object[plate].SetView(plate+abs, 0, symbol-1); // Platten sind objects 1-6
}
bool symbolused[10];
int platesymbol[7];
function SetPlates(int symbol, bool exists) {
// symbol: das, das auf jeden fall dabei ist (wenn exists==true),
bzw. nicht dabei sein darf (wenn exists==false)
int c; // while counter
symbolused[0]=true;
c=1;
while(c<=9) { // arrays auf null setzen
symbolused[c]=false;
if (c<=6) platesymbol[c]=0;
c++;
}
if (exists) { // symbol MUSS dabei sein
int r=Random(5)+1; // MUSS-symbol auf irgendeine platte
platesymbol[r]=symbol;
SetPlate(r, symbol);
c=1;
int s=0; // zu vergebendes symbol
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
}
}
else { // symbol DARF NICHT dabei sein
symbolused[symbol]=true; // symbol aus der auswahl rausnehmen
c=1;
int s=0; // zu vergebendes symbol
while(c<=6) { // platten durchzählen
while(symbolused[s]) { // ein unbenutztes raussuchen
s=Random(5)+1;
}
SetPlate(c, s); // auf die platte damit
c++; // nächste platte
}
}
}
function GetPlayerSymbol() {
Object*plate=Object.GetAtScreenXY(player.x, player.y);
if (plate!=null) {
int plid=plate.ID;
if (plid>=1 && plid<=6) return platesymbol[plid];
}
return 0;
}
Und GetPlayerSymbol() liefert die Nr. des Symbols zurück, auf dessen Platte der Spieler steht, oder 0, wenn er auf keiner Platte steht.
Hoffentlich hilft Dir das erstmal weiter.
Use gopher repellent on funny little man
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
so, hab mich mal reingefuzzelt, hab aber noch ein paar fragen:
function SetPlate(int plate, int symbol) { // plate 1-6, symbol 1-9
--> abs=10; // wenn views der platten z.B.: 11-16 bei mir sind die views 229 - 234, muss ich also abs==228 schreiben?
object[plate].SetView(plate+abs, 0, symbol-1); // Platten sind objects 1-6
--> Jetzt kannst Du z.B. mit SetPlates(2, true); erzwingen, dass Nr.2 dabei ist, oder mit SetPlates(4, false) erzwingen, dass Nr.4 nicht dabei ist.
ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
falls ich mich bezüglich der "richtigen" Symbole falsch ausgedrückt haben sollte: geht man durch die "falsche" Tür, darf im nächsten Raum JEDES Symbol vorhanden sein, es führt dann nur nirgendwo mehr hin (nur in einen neuen sinnlosen Raum oder zurück in den Startraum)
function SetPlate(int plate, int symbol) { // plate 1-6, symbol 1-9
--> abs=10; // wenn views der platten z.B.: 11-16 bei mir sind die views 229 - 234, muss ich also abs==228 schreiben?
object[plate].SetView(plate+abs, 0, symbol-1); // Platten sind objects 1-6
--> Jetzt kannst Du z.B. mit SetPlates(2, true); erzwingen, dass Nr.2 dabei ist, oder mit SetPlates(4, false) erzwingen, dass Nr.4 nicht dabei ist.
ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
falls ich mich bezüglich der "richtigen" Symbole falsch ausgedrückt haben sollte: geht man durch die "falsche" Tür, darf im nächsten Raum JEDES Symbol vorhanden sein, es führt dann nur nirgendwo mehr hin (nur in einen neuen sinnlosen Raum oder zurück in den Startraum)
Danke, Adventuretreff! <3
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Genau, bzw. abs = 228DieFüchsin hat geschrieben:bei mir sind die views 229 - 234, muss ich also abs==228 schreiben?
Ich dachte, dass es auch Situationen gibt, in denen ein bestimmtes Symbol nicht dabei sein darf.DieFüchsin hat geschrieben:ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
Use gopher repellent on funny little man
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
Ich dachte, dass es auch Situationen gibt, in denen ein bestimmtes Symbol nicht dabei sein darf.[/quote]DieFüchsin hat geschrieben:ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
also wenn zb "merkur" als richtiges symbol schon verteilt wurde, darf es natürlich bei der zufälligen verteilung nicht nochmal verteilt werden
ansonsten dürfen aber alle symbole dabei sein
ändert sich denn jetzt was am script oder geht es noch genauso?
Danke, Adventuretreff! <3
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
so nützt mir das leider nichts...
ich meinte, wenn ich ein Symbol als MUSS deklariere, darf dieses ja nicht nochmal verteilt werden. ich bin von meinem ansatz ausgegangen, erst zu definieren, was hinmuss und das dann gleich zu setzen und dann die restlichen hinzumachen.
wahrscheinlich hast du das einfacher gelöst (hab soweit aber noch nicht verstanden, wie), könntest du kurz zusammenfassen, wie dein script funktioniert?
ich meinte, wenn ich ein Symbol als MUSS deklariere, darf dieses ja nicht nochmal verteilt werden. ich bin von meinem ansatz ausgegangen, erst zu definieren, was hinmuss und das dann gleich zu setzen und dann die restlichen hinzumachen.
wahrscheinlich hast du das einfacher gelöst (hab soweit aber noch nicht verstanden, wie), könntest du kurz zusammenfassen, wie dein script funktioniert?
Danke, Adventuretreff! <3
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Anscheinend, ja, sorry.
Also in meinem letzten post hab ich ja erklärt, was die Funktion bewirkt. Um den restlichen Ablauf muss man sich selbst kümmern, die Funktion verteilt lediglich die Symbole.
Ich nehme mal an, dass die Türen sich automatisch öffnen, sobald man ein Symbol betritt, und dass immer nur eine Tür offen ist. Also ich trete auf Symbol 2 -> Tür 2 geht auf. Ich trete auf Symbol 5 -> Tür 2 geht wieder zu, Tür 5 geht auf.
Und wenn ich durch eine offene Tür gehe, komme ich automatisch in den nächsten Raum.
In die repeatedly_execute des Raumes müsste dann etwa folgendes:Wobei "letztes" eine globale Variable ist, die mir das zuletzt betretene Symbol angibt.
Eine andere gl. V. (next) zeigt an, welcher Planet als nächstes betreten werden muss, sie zählt mit. Ist anfangs 1, da Merkur als erstes drankommt.
Spieler betritt den Raum:
Spieler tritt durch eine Tür:
Stimmt noch nicht so ganz, muss jetzt weg, werds mir später nochmal anschauen.
Also in meinem letzten post hab ich ja erklärt, was die Funktion bewirkt. Um den restlichen Ablauf muss man sich selbst kümmern, die Funktion verteilt lediglich die Symbole.
Ich nehme mal an, dass die Türen sich automatisch öffnen, sobald man ein Symbol betritt, und dass immer nur eine Tür offen ist. Also ich trete auf Symbol 2 -> Tür 2 geht auf. Ich trete auf Symbol 5 -> Tür 2 geht wieder zu, Tür 5 geht auf.
Und wenn ich durch eine offene Tür gehe, komme ich automatisch in den nächsten Raum.
In die repeatedly_execute des Raumes müsste dann etwa folgendes:
Code: Alles auswählen
int a=GetPlayerSymbol();
if (a>0) letztes=a;
Eine andere gl. V. (next) zeigt an, welcher Planet als nächstes betreten werden muss, sie zählt mit. Ist anfangs 1, da Merkur als erstes drankommt.
Spieler betritt den Raum:
Code: Alles auswählen
if (next==letztes+1) // Spieler hats richtig gemacht
SetPlates(next, true);
else { // Pech gehabt
SetPlates(next, false); // richtiges nicht dabei
if (Random(1)==1) letztes=next-1; // 50:50, ob der nächste Raum das richtige enthalten wird
}
Code: Alles auswählen
if (letztes==next) { // richtige Tür
next++;
if (next<10) player.ChangeRoom(2, x, y);
else player.ChangeRoom(r, x, y); // geschafft
Use gopher repellent on funny little man