Input/Output Schlangenspiel Logikfehler

Hallo zusammen,

ich habe die Aufgabe Schlangenspiel des angehängten Aufgabenblatts bearbeitet. Mein Code dazu ist:
Java:
package blatt3_WS16;

public class Schlangenspiel_3_3 extends Spielfeld {
    static int feld0, feld1, playerNumber, wurf;

    public static void main(String[] args) {
           
            //Initialisierung.
            playerNumber=1;
        while (feld0 < 35 && feld1 < 35) {
       
            // Spieler 1:
            if (playerNumber == 1) {
                // Würfeln:
                wurf = dice();
                System.out.println("Spieler 1: Du hast " + wurf + " gewürfelt.");
                for (int i = 0; i < wurf; i++) {
                    feld1 = feld1 + 1;
                    // Leiter:
                    if (feld1 == 5 || feld1 == 10 || feld1 == 15 || feld1 == 20 || feld1 == 25) {
                        feld1 = feld1 + 3;
                    }
                    // Schlangen:
                    if (feld1 == 7 || feld1 == 14 || feld1 == 21 || feld1 == 28) {
                        feld1 = feld1 - 4;
                    }
                }
            }
            System.out.println("Spieler 1: Deine Figur befindet sich auf Position: " + feld1);

            // SpielerNr wird geändert
            playerNumber = 1 - playerNumber;

            // Spieler 0:
            if (playerNumber == 0) {
                // Würfeln:
                wurf = dice();
                System.out.println("Spieler 0: Du hast " + wurf + " gewürfelt.");
                for (int i = 0; i < wurf; i++) {
                    feld0 = feld0 + 1;
                    // Leiter:
                    if (feld0 == 5 || feld0 == 10 || feld0 == 15 || feld0 == 20 || feld0 == 25) {
                        feld0 = feld0 + 3;
                    }
                    // Schlangen:
                    if (feld0 == 7 || feld0 == 14 || feld0 == 21 || feld0 == 28) {
                        feld0 = feld0 - 4;
                    }
                }
            }
            System.out.println("Spieler 0: Deine Figur befindet sich auf Position: " + feld0);
           
            // Ausgabe Feld
            paintField(feld0, feld1);

            // Ausgabe, wer Gewinner ist:

            if (feld0 >= 35) {
                System.out.println("Der Gewinner ist: Spieler0");
            }
            if (feld1 >= 35) {
                System.out.println("Der Gewinner ist: Spieler1");
            }
        }

    }
}

Der Output auf der Konsole terminiert nicht, hier ist jedoch ein Ausschnitt vom Beginn des Konsolenoutputs:
Code:
Spieler 1: Deine Figur befindet sich auf Position: 11
Spieler 0: Du hast 3 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 12
Spieler 1: Deine Figur befindet sich auf Position: 11
Spieler 0: Deine Figur befindet sich auf Position: 12
Spieler 1: Du hast 3 gewürfelt.
Spieler 1: Deine Figur befindet sich auf Position: 10
Spieler 0: Du hast 6 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 10
Spieler 1: Deine Figur befindet sich auf Position: 10
Spieler 0: Deine Figur befindet sich auf Position: 10
Spieler 1: Du hast 3 gewürfelt.
Spieler 1: Deine Figur befindet sich auf Position: 13
Spieler 0: Du hast 6 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 12
Spieler 1: Deine Figur befindet sich auf Position: 13
Spieler 0: Deine Figur befindet sich auf Position: 12
Spieler 1: Du hast 2 gewürfelt.
Spieler 1: Deine Figur befindet sich auf Position: 11
Spieler 0: Du hast 1 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 13
Spieler 1: Deine Figur befindet sich auf Position: 11
Spieler 0: Deine Figur befindet sich auf Position: 13
Spieler 1: Du hast 5 gewürfelt.
Spieler 1: Deine Figur befindet sich auf Position: 12
Spieler 0: Du hast 4 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 13
Spieler 1: Deine Figur befindet sich auf Position: 12
Spieler 0: Deine Figur befindet sich auf Position: 13
Spieler 1: Du hast 1 gewürfelt.
Spieler 1: Deine Figur befindet sich auf Position: 13
Spieler 0: Du hast 2 gewürfelt.
Spieler 0: Deine Figur befindet sich auf Position: 11
Spieler 1: Deine Figur befindet sich auf Position: 13
Spieler 0: Deine Figur befindet sich auf Position: 11
Spieler 1: Du hast 1 gewürfelt.

Dabei verstehe ich schon die erste Zeile
Spieler 1: Deine Figur befindet sich auf Position: 11
nicht. Da ich playerNumber mit 1 initialisiere, müsste die erste if-Schleife doch aufgerufen werden und damit auch "Spieler 1: Du hast " + wurf + " gewürfelt." ausgegeben werden oder?

Vielen Dank für Eure Hilfe! Ich komme leider nicht weiter.
Liebe Grüße
 

Anhänge

  • blatt03.pdf
    145,8 KB · Aufrufe: 15
Hallo, ich würde mich sehr über eine Antwort freuen! Ich habe zwar die Lösung gegeben:

Java:
public class Leiterspiel_a extends Spielfeld {
   public static void main(String[] args){
        // Positionen der Spielsteine
        int piece1,piece2;
        // Startpositionen
        piece1 = 0;
        piece2 = 0;

        // Wer ist dran?
        int player;
        player = 1;

        // Wuerfelergebnis , Zielfeld
        int dice, field;

        while(piece1 < 35 && piece2 < 35){
           paintField(piece1,piece2);
           if(player==1){
               field = piece1;
           }
           else{
               field = piece2;
           }

           // Wuerfeln
           dice=dice();
           field = field +dice;
           write("Der Wuerfel zeigt "+dice+". Du kommst auf Feld "+field+".");

           // Schlangen- und Leiterfelder
           if(field<35){
               while(field%5==0 || field%7==0 ){
                   if (player==1)
                       paintField(field,piece2);
                   else
                       paintField(piece1,field);

                   if(field%5==0){
                       field = field + 3;
                       write("Leiterfeld! Du kommst 3 Felder vor auf Feld "+field+".");
                   }
                   if(field%7==0){
                       field = field - 4;
                       if(field<0){
                           field = 0;
                       }
                       write("Schlangenfeld! Du musst leider 4 Felder zurueck auf Feld "+field+".");
                   }
               }
           }
           // Ende des Spielzugs, naechsten Spieler auswaehlen
           if(player==1){
               piece1 = field;
               paintField(piece1,piece2);
               write("Spieler 1, du beendest deinen Zug auf Feld "+piece1+".");
               field =0;
               player = 2;
           }
           else{
               piece2 = field;
               paintField(piece1,piece2);
               write("Spieler 2, du beendest deinen Zug auf Feld "+piece2+".");
               field =0;
               player = 1;
           }
        }
        // Ende des Spiels
        if(piece1 >34){
            write("Spieler 1 gewinnt!");
        }
        else{
            write("Spieler 2 gewinnt!");
        }
    }
}

Da ich aber selber etwas lernen möchte, würde ich mich sehr freuen, wenn Ihr mir meinen Fehler zeigen könnt!

Liebe Grüße
 

ChrisianM

Mitglied
Guten Abend,

Ohne die Klasse Spielfeld ist es schwierig, den Code nachzustellen. Kannst du die Klasse auch noch posten?
Allerdings gebe ich dir Recht, ich würde als erst Output-Zeile auch "Spieler 1: Du hast " + wurf + " gewürfelt." erwarten (und das kommt auch bei mir, wenn ich wurf z. B. konstant setze und die Zeilen, die wegen fehlender Klasse Spielfeld Fehler werfen auskommentiere).

Bist du dir sicher, dass es bei dir die erste Ausgabezeile im Consolenfenster ist? Setz am besten einen Breakpoint in der Zeile
Java:
 while (feld0 < 35 && feld1 < 35) {
und starte dann mit Debug As ... statt Run As ..., dann wird der Code dort anhalten und du kannst durch drücken von F6 Zeile für Zeile durchlaufen und selbst verfolgen, was passiert.

Viele Grüße!

AnfängerHoch10
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Hallo, ich würde mich sehr über eine Antwort freuen! Ich habe zwar die Lösung gegeben:
Der Trick beim Programmieren ist es, keinen doppelten Code zu schreiben.
if(player==1){
piece1 = field;
paintField(piece1,piece2);
write("Spieler 1, du beendest deinen Zug auf Feld "+piece1+".");
field =0;
player = 2;
}
else{
piece2 = field;
paintField(piece1,piece2);
write("Spieler 2, du beendest deinen Zug auf Feld "+piece2+".");
field =0;
player = 1;
Du machst das aber, wie obiges Beispiel zeigt.
Das ganze lässt sich viel einfacher realisieren.
Mangels der Klasse Spielfeld habe ich eine eigene gebaut.
Code:
import java.util.Random;

public class SpielFeld {
    private static Random rnd = new Random(System.currentTimeMillis());
    public final static int FINAL_FIELD = 35;
    public final static String SPIELER_A = "o";
    public final static String SPIELER_B = "x";

    public int dice() {
        return rnd.nextInt(6) + 1;
    }

    public static boolean isSnakeField(int field) {
        return field % 7 == 0;
    }

    public static boolean isLadderField(int field) {
        return field % 5 == 0;
    }

    public static void paintField(int x, int y) {
        String out = "|";
        for (int i = 0; i < 36; i++) {
            if (i < 10) // leading space
                out += " ";
            String tmp = "  ";
            if (i == x)
                tmp = SPIELER_A + " ";
            if (i == y)
                tmp = " " + SPIELER_B;
            if (i == x && i == y)
                tmp = SPIELER_A + SPIELER_B;
            out += i + " " + tmp;
            tmp = " ";          
            if (i != 0 && i != 36) {
                if (isLadderField(i))
                    tmp = "=";
                if (isSnakeField(i))
                    tmp = "~";
            }
            out += " " + tmp + " |";
            if ((i + 1) % 9 == 0 && i != 0 && i != 35)
                out += "\n|";
        }
        System.out.println(out);
    }
}

Code:
public class LeiterSpiel extends SpielFeld {
    private int[] playerPos = { 0, 0 };
    private int turn = 0;

    public static void main(String[] args) {
        LeiterSpiel spiel = new LeiterSpiel();
        while (!spiel.doNextMove())
            ;
        System.out.println("\nSpieler (" + spiel.getCurrentPlayer() + ") gewinnt!!\n");
    }
    private String getCurrentPlayer() {
        return turn == 0 ? SPIELER_A : SPIELER_B;
    }
    private boolean doNextMove() {
        int dice = dice();
        playerPos[turn] += dice;
        String special = "";
        if (isLadderField(playerPos[turn])) {
            playerPos[turn] += 3;
            special = "\t\t[ladder hit!]";
        }
        if (isSnakeField(playerPos[turn])) {
            playerPos[turn] -= 4;
            special = "\t\t[snake hit!]";
        }
        if (playerPos[turn] > FINAL_FIELD)
            playerPos[turn] = FINAL_FIELD;

        System.out.print("Spieler (" + getCurrentPlayer() + "): Wuerfel zeigt: " + dice);
        System.out.println(". Du kommst auf " + playerPos[turn] + special);
        paintField(playerPos[0], playerPos[1]);
        if (playerPos[turn] == FINAL_FIELD)
            return true;
        turn = (turn + 1) % 2;
        return false;
    }
}
Schau Dir den Beispielcode an.;)
 
Vielen Dank für eure Beiträge!! Ich habe leider nicht so viel Zeit heute morgen, weswegen ich zuerst einmal die Klasse Spielfeld hochladen möchte:
Java:
import java.awt.GridLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GradientPaint;
import java.awt.RenderingHints;

public class Spielfeld extends MiniJava{
    private static class Field extends JPanel {
        private static Field Leiter(int feldnummer, int spielstein){
            return new Field(feldnummer,spielstein){
                public void paint(Graphics g) {
                    super.paint(g);
                    g.setColor(Color.GREEN);

                    g.drawLine((int)(getWidth()*0.75),3,(int)(getWidth()*0.75),(int)(getHeight()*0.78));
                    g.drawLine((int)(getWidth()*0.5) ,3,(int)(getWidth()*0.5), (int)(getHeight()*0.78));
                    for (int i=1;i<5;i++){
                        int hoehe = i*getHeight()/6;
                        g.drawLine((int)(getWidth()*0.5),hoehe,(int)(getWidth()*0.75),hoehe);
                    }
                   
                    this.paintSpielstein(g);
                }
            };
        }
        private static Field Schlange(int feldnummer, int spielstein){
            return new Field(feldnummer,spielstein){
                public void paint(Graphics g) {
                    super.paint(g);
                    g.setColor(Color.RED);

                    g.fillRoundRect((int)(getWidth()*0.6),(int)(getHeight()*0.1), 7,(int)(getHeight()*0.6),13,13 );

                    g.setColor(Color.YELLOW);
                    g.fillRoundRect((int)(getWidth()*0.6)+2,(int)(getHeight()*0.1-5), 2,(int)(getHeight()*0.1),13,13 );
                    g.fillOval((int)(getWidth()*0.6)+1,(int)(getHeight()*0.1-11)+5,4,4);

                    g.fillOval((int)(getWidth()*0.6)-2,(int)(getHeight()*0.1)+5,5,5);
                    g.fillOval((int)(getWidth()*0.6)+5,(int)(getHeight()*0.1)+5,5,5);

                    g.setColor(Color.BLACK);
                    g.fillOval((int)(getWidth()*0.6)-2,(int)(getHeight()*0.1)+5,2,2);
                    g.fillOval((int)(getWidth()*0.6)+5,(int)(getHeight()*0.1)+5,2,2);
                   
                   
                    this.paintSpielstein(g);
                }
            };
        }
        int feldnummer,spielstein; Point p;
        public Field(int feldnummer, int spielstein){
            this.feldnummer=feldnummer;
            this.spielstein=spielstein;
            p = getLocation();
        }
    public void paint(Graphics g) {
        super.paint(g);
        // Hintergrund
        g.setColor(Color.BLACK);
                g.fillRect(p.getLocation().x,p.getLocation().y,getWidth()*2,getHeight());
        // Feld
                Paint pa = ((Graphics2D)g).getPaint();
                g.setColor(Color.WHITE);
                GradientPaint gradient = new GradientPaint(0, 0, Color.WHITE, getWidth(), 0, Color.DARK_GRAY);
                ((Graphics2D)g).setPaint(gradient);
                ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

                g.fillRect(p.getLocation().x,p.getLocation().y,(int)(getWidth()*.8),(int)(getHeight()*.8));
        g.setColor(Color.BLACK);
        g.drawString(""+feldnummer,(int)(getWidth()*.1),(int)(getHeight()*.15));
       
        // Spielstein

                paintSpielstein(g);
                ((Graphics2D)g).setPaint(pa);
     }

        protected void paintSpielstein(Graphics g){
            int offset =0;
            Color c = Color.ORANGE;
            if (spielstein==1) c=Color.BLUE;

                GradientPaint gradient = new GradientPaint(0, 0, c, getWidth(), 0, Color.WHITE);
                ((Graphics2D)g).setPaint(gradient);
                ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        if (spielstein!=0){
                    g.fillOval((int)(getWidth()*.05)+offset,(int)(getHeight()*.05),(int)(getWidth()*.65)+offset,(int)(getHeight()*.7));
            if (spielstein<0) {
                        offset = 5;
                        gradient = new GradientPaint(0, 0, Color.BLUE, getWidth(), 0, Color.WHITE);
                        ((Graphics2D)g).setPaint(gradient);
                        g.fillOval((int)(getWidth()*.05)+offset,(int)(getHeight()*.05),(int)(getWidth()*.65)+offset,(int)(getHeight()*.7));
                    }
            g.setColor(Color.WHITE);
            g.setFont(g.getFont().deriveFont((float)32));
            g.drawString(""+Math.abs(spielstein),(int)(getWidth()*.3)+offset,(int)(getHeight()*.5));
        }
        }

    }
    static JFrame myFrame;
    static JPanel pan;
    public static void paintField(int playerone, int playertwo){
        if (myFrame!=null){
            pan.removeAll();
        }
        else
        {
            myFrame = new JFrame("Spielfeld");
            pan = new JPanel();
        }
        java.util.Set<Integer> s1 = new java.util.HashSet<Integer>(),s2=new java.util.HashSet<Integer>(),s3 = new java.util.HashSet<Integer>(),s4=new java.util.HashSet<Integer>();
        pan.setLayout(new GridLayout(4,9));
        for (int x = 0 ; x < 35; x ++){
            int figur = 0;
            if (x==playerone && x==playertwo)
                figur=-1;
            else
        if (x==playerone)
        figur=1;
        else
        if (x==playertwo)
        figur=2;

           
            if (x % 5 ==0 && x!=0) pan.add(Field.Leiter(x,figur));
            else
                if (x % 7 ==0 && x!=0) pan.add(Field.Schlange(x,figur));
            else
            pan.add(new Field(x,figur));
        }
        pan.add(new Field(35,0));
        myFrame.add(pan);
        myFrame.setSize(900,400);
        myFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        myFrame.setVisible(true);
    }
    public static void main(String[] args){
        paintField(0,0);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ie){};
        paintField(0,10);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ie){};
    paintField(5,10);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ie){};
        paintField(5,7);
    }
}

Eure restlichen Bemerkungen werde ich mir vermutlich heute Abend anschauen.

Liebe Grüße
 
Bist du dir sicher, dass es bei dir die erste Ausgabezeile im Consolenfenster ist? Setz am besten einen Breakpoint in der Zeile
Java:
 while (feld0 < 35 && feld1 < 35) {
und starte dann mit Debug As ... statt Run As ..., dann wird der Code dort anhalten und du kannst durch drücken von F6 Zeile für Zeile durchlaufen und selbst verfolgen, was passiert.
AnfängerHoch10

Danke für den Hinweis! Ja ich bin mir sicher, dass "Spieler 0" die erste Ausgabezeile ist, ich habe es gerade noch einmal überprüft.

Vielen Dank für den Hinweis mit dem Debug As! Diese Funktion kannte ich vorher nicht und sie ist natürlich sehr hilfreich! Dort ergab sich allerdings eine andere Ausgabe, als bei der Run As Ausgabe (siehe Bild anbei).

Wie kann es sein, dass jeweils beide kompletten if-Schleifen nach der ersten Ausführung übersprungen werden?

Vielen Dank für Eure Hilfe!

Liebe Grüße
 

Anhänge

  • Debug.JPG
    Debug.JPG
    439,5 KB · Aufrufe: 23

Javinner

Top Contributor
Tausend Dank! Studierst du gerade? Ich selbst habe endlich die
Zeit, mich mit Programmieren zu befassen und da ist gutes Lernmaterial sehr gerne gesehen.
Ich habe hier im Bereich Codeschnipsel und Projekte ein Tread geöffnet, wo ich einige Aufgaben, welche ich interessant fand, hochlade. Deine Aufgabe Die lustige Sieben lade ich gleich hoch. Wenn du Lust hast, da mitzumachen, sehr gerne.
Da geht es hauptsächlich darum, mehrere Lösungswege zum gleichen Problem auszuarbeiten.
 

Ähnliche Java Themen

Neue Themen


Oben