[C] einmalige Zahlengenerierung

  • C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [C] einmalige Zahlengenerierung

    Ich habe einen Array, der X/Y Koordinaten von Map-Objekten enthält.

    GML-Quellcode

    1. int wildgrass[laenge2][2]={
    2. {176, -80},//path1
    3. {176, -96},
    4. {176, -112},
    5. }


    mit zwei For-Schleifen frage ich die jeweilige Position meines Players im gegensatz zu den Positionen in diesem Array ab:

    GML-Quellcode

    1. int grassarray[2]={x,y};
    2. int grassarraygefunden=0;
    3. int xix;
    4. for (xix=0; xix<laenge2 && grassarraygefunden==0; xix++){
    5. int grassarraygleich=1;
    6. int xjx;
    7. for (xjx=0; xjx<2 && grassarraygleich==1;xjx++){
    8. if(grassarray[xjx]!=wildgrass[xix][xjx]){grassarraygleich=0;}
    9. }
    10. if (once5==0){ if (grassarraygleich==1){grassarraygefunden=1; r = rand() % 10 + 1; once5=1; }else{grassarraygefunden=0; once5=0;}//inbattle=0; //wenn man grass berührt wird eine zahl generier
    11. }
    12. }
    13. for (xix=0; xix<laenge2 && grassarraygefunden==0; xix++){
    14. int grassarraygleich=1;
    15. int xjx;
    16. for (xjx=0; xjx<2 && grassarraygleich==1;xjx++){
    17. if(grassarray[xjx]!=wildgrass[xix][xjx]){once5=0;}
    18. }
    19. }
    Alles anzeigen

    Ein paar variablen sind mehr oder weniger nutzlos, die sind lediglich aus Verzweiflung reingewandert.
    Es soll eben nur ein Wert generiert werden, wenn ich an einer solchen koordinate bin, wenn ich an keiner bin, kein Wert.
    Bis jetzt funktioniert es tadellos, sobald ich aber auf einer koordinate stehen bleibe, wird weiter generiert. Ich habe leider eine Denkblockade und eigene Fehler sind immer am schwersten zu finden...

    lg, domis4
  • Ich hab jetzt nicht wirklich verstanden, was dein Problem ist aber für einen ersten Versuch: Mit break kannst du auch aus for-Schleifen ausbrechen, wenn du den ersten Treffer erzielt hast.
    Und soweit ich das sehe, versuchst du mit once5 irgendwelche Mehrfachgenerierungen zu vermeiden; an deiner Stelle würde ich da mal genau verfolgen, wann dieser Wert wie gesetzt wird und wann er abgefragt wird.

    Die Fehlersuche würde sich übrigens als deutlich angenehmer gestalten, wenn du den Code mal etwas leserlicher formatieren würdest, mit einer Bedingung oder einer Anweisung pro Zeile.
  • ich weiß, Always code as if the person who will maintain your code is a maniac serial killer that knows where you live^^

    Es geht darum, dass die Zahlen anstatt einfach generiert werden, mehrfach generiert werden. Sprich:
    Ich berühre eine Stelle, in diesem Moment soll eine Zahl generiert werden. aber nur eine. Nun ist es so, dass ich ein 16x16 Raster habe und mehrere solcher Stellen nebeneinander sind. Das Problem an bisher ist, dass beim betreten solcher Stellen eine Zahl generiert wird, jedoch wiederholt(en) sich die Schleife(n). deshalb habe ich versucht einen Wert zu setzen, der sich beim berühren verändert, danach aber wieder 0 wird. Der Wert sollte kontrollieren, dass nur eine Generiert wird (in dem Fall once)

    EDIT: ein wenig ordentlicher:
    pastebin.com/g6kGuMW7

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von domis4 ()

  • Ehm.. irgendwie hast du dieses Zitat ziemlich gut befolgt... ._.
    Selbst nach groben Umschreiben zu GML ist das zeug ziemlich schwierig zu kapieren.

    Aber glaube ich hab den Denkfehler gefunden (sofern ich überhaupt richtig verstehe was der Code da tut :D ).
    Du benuzst ja die Variable "once5" um festzuhalten ob bereits eine Zufallszahl generiert wurde. Du hast dort aber ja zwei for-schleifen und mehrere Koordinaten in dem Aray die du überprüfen willst.
    D.h. wenn wir annehmen dass der player bereits an der Stelle der ersten koordinate ist, dann wird once5 auf true gesetzt und es folgt der nächste durchlauf in der for-Schleife. Dann ist der Spieler aber gewiss nicht auch dort (kann ja nicht an zwei Orten sein) und aufgrund diesen codes:

    GML-Quellcode

    1. if (grassarraygleich==1)
    2. {
    3. //...
    4. ] else
    5. {
    6. grassarraygefunden=0;
    7. once5=0; // <-----
    8. }

    wird dann once5 wieder auf Null gesetzt.
    Folglich wird im nächsten Schritt des Spiels wenn die for-Schleife von vorne anfängt erneut eine neue Zahl generiert da once5 zurückgesetzt wurde.

    Hoffe du verstehst was ich meine.

    Mein Lösungsvorschlag wäre statt einer boolschen Variable wie once5 in deinem Fall, in einer Variable die Position des Spielers abhängig vom array zu speichern.
    Also wenn eine Position des Spielers mit den werten im array übereinstimmt, setzst du einfach in_array_x auf den gefundenen ersten Index des arrays und in_array_y auf den gefundenen zweiten index des arrays. Dann kannst du damit einfach durch eine If-Abfrage dafür sorgen dass der Punkt auf dem der Player schon steht, übersprungen wird. Dadurch würde auch nicht die ganze Zeit eine neue Zahl generiert.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Ich weiß ja nicht was genau der Kontext ist, aber es gibt doch nichts einfacheres als zu verhindern, dass ein Codestück ausgeführt wird, so lange sich nichts getan hat. Gib mal konkretere Infos dazu, was im Spiel eigentlich vor sich geht, in welcher Spielsituation der Code was verursachen soll etc.. Schon wenn man ein Problem genauer schildert, kommt man oft auf die Lösung, die sich letztendlich womöglich sogar als banal entpuppt.

    Edit: Dang, das ist ja im Unterforum "andere Programmiersprachen". Ka wie ich hier gelandet bin. Naa, da halt ich mich lieber raus. :P
  • @F4LL0UT Zum Glück ist das Grundprinzip der meisten Sprachen die hier erwähnt werden das gleiche.. von daher kannst du dich ruhig beteiligen, lol :)

    @domis4
    Ich glaube dass du eher mich falsch verstanden hast (zumindest entnehme ich das deiner Argumentation..)
    Bringt es dir was wenn ich dir nen code in GML schreibe?... Nen C compiler oder syntax-checker hab ich leider nicht.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

  • So...
    Hoffe die Mühe war nicht umsonst :D
    Wenn doch, erklär bitte mal so akurat wie es nur irgendwie geht wie die Bedingungen in deinem Spiel sind und was genau der Code bewirken soll (wobei ich glaube dass ich letzteres verstanden habe).

    GML-Quellcode

    1. // "create-event" (bzw. dein Initialisierungs-Skript) :
    2. on_which_point = -1;
    3. wildgrass_array[0,0] = 176;
    4. wildgrass_array[0,1] = -80;
    5. wildgrass_array[1,0] = 176;
    6. wildgrass_array[1,0] = -96;
    7. wildgrass_array[2,0] = 176;
    8. wildgrass_array[2,0] = -112;
    9. laenge = 3; // anzahl der Punkte im Array zum abfragen
    10. // "step event" (bzw. wo auch immer dein bisheriger Code stand) :
    11. position_array[0] = x; // Die Koordinaten des Spielers werden in das Array übertragen (um mit deinem code übereinzustimmen
    12. position_array[1] = y; // falls das nciht gewünscht ist, ersetze einfach den links stehenden Teil durch "x" bzw. "y".
    13. var a;
    14. for (a = 0; a < laenge; a += 1) // durch das array loop'en...
    15. {
    16. if !on_which_point = a; // ..aber nur wenn wir nicht schon wissen dass sich der player auf dem abzufragenden Punkt befindet (hier wird verhindert dass jeden step eine neue Zahl generiert wird)
    17. {
    18. if position_array[0] == wildgrass_array[a,0] // überprüfe ob die x-coordinate des players mit der x-Komponente des Punktes aus dem wildgrass_array übereinstimmt. "a" ist eben die Nummer des Punktes.
    19. if position_array[1] == wildgrass_array[a,1] // Das selbe für die y-Komponente.
    20. {
    21. r = random(100) mod 10 + 1; // hier wird deine zufallszahl generiert
    22. on_which_point = a; // der Index des Punktes welcher als übereinstimmend befunden wurde, wird der on_which_point Variable zugeordnet
    23. }
    24. }
    25. a += 1;
    26. }
    Alles anzeigen

    Habs so gut auskomentiert wie möglich.

    EDIT:
    GML in C zu übersetzen dürfte ich wohl hinbekommen. Um die Leserlichkeit ists dann aber geschehen.
    Denke mal die meisten Leute hier werden zustimmen das GML meist leserlicher (oder gleich leserlich) ist wie C... Also wieso solls beim Umwandeln nicht mehr leserlich sein?

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()