Zufallsgenerierter Wert gibt 2 Werte bei Schere, Stein, Papier aus.

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

  • Zufallsgenerierter Wert gibt 2 Werte bei Schere, Stein, Papier aus.

    Ich bin dabei, ein Schere, Stein, Papier gegen den PC Spiel zu machen.
    Ich habe jetzt zum Test die Werte von Player und Computer ausgegeben.
    Der Computer "ändert seine Meinung" jedoch oft nochmal, wenn er dran ist.. woran kann das liegen?
    EDIT: mit ändert seine Meinung meine Ich, dass er z.B. rock ausgibt und dann ohne das der Player etwas macht, auf z.B. paper wechselt.
    Code des Computers:
    Create:

    GML-Quellcode

    1. global.ComputerTurn = true;
    2. global.ComputerChoice = "none";
    3. global.ComputerResult = 0;

    Alarm[0]

    GML-Quellcode

    1. global.PlayerTurn = true;

    Draw:

    GML-Quellcode

    1. if(global.ComputerChoice == "paper")
    2. {
    3. draw_text(370, 310, "Computer chose paper");
    4. }
    5. if(global.ComputerChoice == "rock")
    6. {
    7. draw_text(370, 310, "Computer chose rock");
    8. }
    9. if(global.ComputerChoice == "scissors")
    10. {
    11. draw_text(370, 310, "Computer chose scissors");
    12. }
    Alles anzeigen

    Step:

    GML-Quellcode

    1. if(global.ComputerTurn = true)
    2. {
    3. randomize();
    4. global.ComputerResult = random(3);
    5. if(global.ComputerResult <= 3 && global.ComputerResult >= 2)
    6. {
    7. global.ComputerChoice = "scissors";
    8. }
    9. if(global.ComputerResult <= 2 && global.ComputerResult >= 1)
    10. {
    11. global.ComputerChoice = "rock";
    12. }
    13. if(global.ComputerResult <= 1 && global.ComputerResult >= 0)
    14. {
    15. global.ComputerChoice = "paper";
    16. }
    17. alarm[0] = 10;
    18. global.ComputerTurn = false;
    19. }
    Alles anzeigen

    Im Player Objekt wird ComputerTurn nach der Aktion des Players auf true gesetzt.
    Danke im Voraus.
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-
  • Versuch doch mal dein

    GML-Quellcode

    1. global.ComputerResult = random(3);


    in

    GML-Quellcode

    1. global.ComputerResult = irandom_range(1,3);


    zu ändern. Dann musst du deine if abfragen dementsprechend noch ändern.
    irandom_range() gibt ganze zahlen aus (in dem fall zw 1 und 3, also 1,2,3). Dann musst du nicht mit kleiner / größer etc arbeiten sondern abfragen mit

    GML-Quellcode

    1. if global.ComputerResult = 3
    2. {
    3. ...
    4. }

  • Hab deinen Code nun mal nicht runtergeladen. Habs aber so gelöst:

    Habe deinen Step Event in einen User Definierten Event gepackt:

    User Defined 0:

    GML-Quellcode

    1. global.ComputerResult = irandom_range(1,3);
    2. if global.ComputerResult = 3
    3. {
    4. global.ComputerChoice = "scissors";
    5. }
    6. if global.ComputerResult = 2
    7. {
    8. global.ComputerChoice = "rock";
    9. }
    10. if global.ComputerResult = 1
    11. {
    12. global.ComputerChoice = "paper";
    13. }
    14. alarm[0] = 10;
    15. global.ComputerTurn = false;
    Alles anzeigen


    Mit der Leertaste hab ich dann den Status umgeschalten und den Event ausgelöst:

    GML-Quellcode

    1. if global.ComputerTurn = true {event_perform(ev_other, event_user(0)); exit;}
    2. if global.ComputerTurn = false {global.ComputerTurn = true;}


    Den Draw Event und Create Event hab ich nicht verändert. Hat funktioniert bei mir soweit.
    Warum das ganze? Es reicht ja den Event einmal auszulösen wenn der PC am Zug ist. Darum hab ichs aus dem Step Event raus, da das ja XX mal pro sekunde den Code durchgeht. Einmal reicht ja pro zug. Darum in ein eigenes Event gepackt, das man mit event_perform(ev_other, event_user(0)) aufruft sobald der PC am Zug ist.

    Edit:
    Dein Draw Event kann man eig. in eine Zeile packen:

    GML-Quellcode

    1. draw_text(370, 310, "Computer chose " + string(global.ComputerChoice));

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

  • Kann ich das "if global.ComputerTurn = true {event_perform(ev_other, event_user(0)); exit;}"
    auch ins step event packen oder kann man das eleganter lösen?
    Ich würde das ganze in eine

    GML-Quellcode

    1. if (x == 1) {code oben und x -= 1}
    -Schleife packen, im step event.
    5-min-pixel "art" um 0 Uhr als Accountbild :sleeping: -_-


  • übrigens werden durch if var = zuweisung auch viele solche Fehler ausgelöst. War es in dem Fall nicht, aber @Atomicmaster du hast das in deinem Beispielcode so geschrieben. Dann kann der Wert auch nur den Wert der letzen Zuweisung annehmen anstatt 3 verschiedene Werte.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hallo @Lauritz Offe
    Das ist ja sehr schön, dass du auch nocjvzu alten Diskussionen etwas beitragen möchtest, aber es ging hier nur drum einen bug im code zu finden, nicht um das 'wie überhaup'.
    Abgesehen davon, ist es besser alles in einem object zu handhaben.

    PS: wenn du mal deinem post noch was hinzufügen oder ausbessetn willst, kannst du deinen beitrag auch bearbeiten anstatt drei kleine posts untereinander zu setzen. Das hält das Form wesentlich lesbarer.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)