4 Gewinnt Gewinnerkennung

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

  • 4 Gewinnt Gewinnerkennung

    Hallo,

    Ich programmiere grade ein 4 Gewinnt mit game maker studio 2. Das Spielfeld hab ich als 2d array gespeichert. Noch wichtig: Wenn man einen Stein einwirft, fällt er wie beim richtigen 4 gewinnt nach unten:) Auch wichtig: Mein Objekt oFeld hat 3 Subimages: 0 für unbesetzt, 1 für Spieler eins und 2 für Spieler zwei. Um zu überprüfen, ob ein Feld besetzt ist, nutze ich also if image_index != 0 :) Mein Problem ist das erkennen des Programms, wenn ein Spieler gewonnen hat. Nach links und rechts hab ich es schon hinbekommen, an der diagonalen Erkennung halt ich mich aber schon seit Ewigkeiten auf:( Wäre nett, wenn mir da jemand helfen könnte;) Hier mein Code für die Gewinnerkennung Horizontal und Vertikal, damit ihr mein Vorgehen besser nachvollziehen könnt:

    Horizontal:

    GML-Quellcode

    1. //Gewinnerkennung Horizontal
    2. countHorizontal = 0;
    3. for ( ab = 0; ab < 7; ab++ ) {
    4. if ( feldObjekte[ab,steinY].image_index != 0 and
    5. feldObjekte[ab,steinY].image_index == steinTurn ) {
    6. countHorizontal++;
    7. }
    8. else {
    9. countHorizontal = 0;
    10. }
    11. if ( countHorizontal >= 4 ) {
    12. if ( steinTurn == 1 ) show_message("Spieler eins hat gewonnen!");
    13. else if ( steinTurn == 2 ) show_message("Spieler zwei hat gewonnen!");
    14. room_goto(6);
    15. }
    16. }
    Alles anzeigen

    Vertikal:

    GML-Quellcode

    1. //Gewinnerkennung Vertikal
    2. countVertikal = 0;
    3. for ( c = 0; c < 5; c++ ) {
    4. if ( feldObjekte[pointerPos,c].image_index != 0 and feldObjekte[pointerPos,c].image_index == steinTurn ) {
    5. countVertikal++;
    6. }
    7. else {
    8. countVertikal = 0;
    9. }
    10. if ( countVertikal >= 4 ) {
    11. if ( steinTurn == 1 ) show_message("Spieler Eins hat gewonnen! Beachte, dass das Spiel bisher nur Vertikale Spielzüge überprüft. Horizontale werden als nächstes Folgen! ( Und natürlich auch schönere Textboxen und Konfettianimationen )");
    12. else if ( steinTurn == 2 ) show_message("Spieler zwei hat gewonnen! Beachte, dass das Spiel bisher nur Vertikale Spielzüge überprüft. Horizontale werden als nächstes Folgen! ( Und natürlich auch schönere Textboxen und Konfettianimationen )");
    13. room_goto(6);
    14. }
    15. }
    Alles anzeigen
    Sorry für die schlechte Einrückung des Codes!

    Jetzt kennt ihr mein Problem, hoffentlich kann mir jemand weiterhelfen :D
  • Bin jetzt auch noch nicht so lange bei GM, daher wäre es interessant zu wissen, ob man in GMS,
    Fehler abfangen und darauf reagieren kann, denn ich nehme mal an, wenn man auf ein nicht
    existentes Feld zugreift, wird GMS abstürzen?!?

    Daher hier noch eine Lösung von mir(sofern ich keinen Fehler gemacht habe, da ich es in Notepad
    geschrieben habe):


    Quellcode

    1. // Diagonal von links nach rechts
    2. var coins = 0
    3. var test, fields
    4. for (test = 0; test < 3; test++) // Test 1 von links nach rechts
    5. for (fields = 0; fields < 6 - test; fields++)
    6. if (playfield[0 + test + fields, 0 + fields] == player_1) {
    7. coins++
    8. if (coins == 4) {
    9. win_player_1 = true
    10. exit
    11. }
    12. } else { coins = 0 }
    13. for (test = 0; test < 3; test++) // Test 2 von links nach rechts
    14. for (felder = 0; felder < 6 - test; felder++)
    15. if (playfield[0 + felder, 0 + felder + test + 1] == pl1) {
    16. coins++
    17. if (coins == 4) {
    18. win_player_1 = true
    19. exit
    20. }
    21. } else { coins = 0 }
    22. // Diagonal von rechts nach links
    23. coins = 0
    24. for (test = 0; test < 3; test++) // Test 1 von rechts nach links
    25. for (fields = 0; fields < 6 - test; fields++)
    26. if (playfield[0 + test + fields, 0 - fields + 6] == player_1) {
    27. coins++
    28. if (coins == 4) {
    29. win_player_1 = true
    30. exit
    31. }
    32. } else { coins = 0 }
    33. for (test = 0; test < 3; test++) // Test 2 von rechts nach links
    34. for (fields = 0; fields < 6 - test; fields++)
    35. if (playfield[0 + fields, 0 - fields - test + 5] == player_1) {
    36. coins++
    37. if (coins == 4) {
    38. win_player_1 = true
    39. exit
    40. }
    41. } else { coins = 0 }
    Alles anzeigen



    Quellcode

    1. // Horizontal
    2. for ( var ver = 0; ver < 6; ver++) {
    3. coins = 0
    4. for (var hor = 0; hor < 7; hor++) {
    5. if (playfield[ver, hor] = player_1) {
    6. coins++
    7. if (coins == 4) {
    8. win_player_1 = true
    9. exit
    10. }
    11. } else { coins = 0 }
    12. }
    13. }
    14. // Vertikal
    15. for (hor = 0; hor < 7; hor++) {
    16. coins = 0
    17. for (ver = 5; ver >= 0; ver--) {
    18. if (playfield[ver, hor] = player_1) {
    19. coins++
    20. if (coins == 4) {
    21. win_player_1 = true
    22. exit
    23. }
    24. } else { coins = 0 }
    25. }
    26. }
    Alles anzeigen


    Hab auch noch eine Lösung für Horizontal und Vertikal gemacht, falls Dich ein anderer Ansatz dazu
    interessiert. Ich habe ein normales "Vier gewinnt" Feld angenommen, also 7x6 und Horizontal muss
    nur geprüft werden, wenn man Steine in der Mitte hat, also die Felder von 0,3 - 5,3, denn ohne die
    kann man keine vier Steine zusammen bekommen.

    Sieht kompliziert aus, ist es wahrscheinlich auch, aber vielleicht spendiert einer der Profis, noch
    eine bessere Lösung dazu.


    Miradur