TicTacToe

Strim

Mitglied
Hi

Ich bin gerade dabei TicTacToe zu implementieren. Bin jetzt schon soweit, dass man abwechselnd X bzw O auf das Spielfeld setzen kann. Es ist allerdings noch so, dass wenn der nächste Spieler dran ist, die Markierung des vorherigen Spielers verschwindet, da das Spielfeld eben neu geladen wird.
Ich komme gerade nicht drauf, wie ich erreichen kann, dass von Spieler zu Spieler die Kreuze bzw Kreise auf dem Spielfeld gespeichert bleiben. Freue mich über Tipps und Anregungen.

Hier der bisherige Code, testet selbst:
Java:
package tictactoe;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class tictactoe {
	
	char[][] spielfeld = new char[3][3];
	/**x-Koordinate für Felder */
	int x=-1;
	/**y-Koordinate für Felder */
	int y=-1;
	/**bestimmt, wann Spiel vorbei ist*/
	boolean SpielzuEnde=false;
	/**bestimmt wer an der Reihe ist*/
	public boolean Spieler1=true;
	
	int i;
	int j;
	
	
	public static void main(String[] args){
		tictactoe test = new tictactoe();
		
		
		test.Anzeige();
		test.SpielSchleife();
		
		
	}
	
	/**zur Anzeige des Spielfelds*/
	
	public void Anzeige(){
		
		
		

		System.out.print(" "+ " 1"+" 2"+" 3"+ '\n');
		for (i=0; i<= 2; i++){
			System.out.print(i+1);
			for (j=0; j <=2; j++){
			spielfeld[i][j] = '-';
			System.out.print('|');
			
			
			Ankreuzen();
			
			
			
			System.out.print(spielfeld [i][j]);
		
			
			
			
			}
			System.out.print('|');
			System.out.print('\n');
			
	}	
	}
	
	/**gibt x-Koordinate zurück und überprüft Eingabe auf Gültigkeit
	 * */
	public int Eingabe (){
		
		if (Spieler1==true){
			System.out.println("Spieler 1 ist dran.");
		}else{
			System.out.println("Spieler 2 ist dran.");
		}
		
		
		System.out.println("Erste Koordinate eingeben:");
		this.x = readInt();
		
		if(x==1 | x==2 | x==3){
			
			return x;
			
		}else{
			Anzeige();
			System.out.println("Eingabe ungültig");
			
			return Eingabe();
		}
		
	}
	
	/**gibt y-Koordinate zurück und überprüft Eingabe auf Gültigkeit*/
	public int Eingabe2() {
		System.out.println("Zweite Koordinate eingeben:");
		this.y = readInt();

		if (y == 1 | y == 2 | y == 3) {

			return y;

		} else {
			Anzeige();
			System.out.println("Eingabe ungültig");
			
			return Eingabe2();
			
			
		}
		
		
	}
	
	/**
	 * Spieler1 setzt X, Spieler2 setzt O
	 * 
	 * Funktionsweise des Kreuzesetzens:
	 * Schleife zur Spielfelderstellung wird durchlaufen und wenn die Stelle
	 * x/y erreicht wird, wird das X bzw das O gesetzt.
	 */
	
	public void Ankreuzen(){
		
		
		if(this.Spieler1==true){		
		if(i==this.x & j==this.y){
			spielfeld[this.x][this.y]='X';
		}
		}else{
			if(i==this.x & j==this.y){
				spielfeld[this.x][this.y]='O';
			}
			
		}
		
	}
	
	public void Spielplan(){
		this.x = Eingabe()-1;
		this.y = Eingabe2()-1;
		System.out.print("Gewähltes Feld: " + (x+1) + "/" + (y+1) +"\n");
		
		
		Anzeige();
		
		
			
		}
	
	
	
	public void SpielSchleife(){
		
		while (SpielzuEnde==false){
			Spielplan();


			if(this.Spieler1==true){
				this.Spieler1=false;
			}else{
				this.Spieler1=true;
			}
			
						
			
		}
			
	}
		
		
		
		
	
	
	

private BufferedReader console =   new BufferedReader( new InputStreamReader( System.in ) ); 
	
	/**
	 * Gibt die nächste Eingabezeile als String zurück.
	 */
	public String readLine() {
		try {
			return console.readLine();
		} catch (IOException e) {
			return "\n";
		}
	}

	/**
	 * Gibt die nächste Eingabezeile als int-Wert zurück. Es werden
	 * nur die ersten Ziffer inklusive Vorzeichen berücksichtigt.
	 */
	public int readInt() {
    		return parseInt(readLine());
	}

	/**
	 * Wandelt <code>zahl</code> in einen int-Wert.
	 */
	public int parseInt(String zahl) {
		try {
			return Integer.parseInt(zahl);
		} catch (NumberFormatException e) {
			return 0;
		}	
	
	}
	
	
}

:toll:
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
Dein Fehler ist, dass du in der Anzeige Methode das Spielfeld veränderst. Die Anzeige Methode sollte das Feld nur anzeigen und nichts! verändern.
Verändern kannst du in "Spielplan". Da brauchst du auch keine Schleife für.

Java:
public void Spielplan(){
        this.x = Eingabe()-1;
        this.y = Eingabe2()-1;
        System.out.print("Gewähltes Feld: " + (x+1) + "/" + (y+1) +"\n");
        if(this.Spieler1) spielfeld[this.x][this.y] = 'X';
        else spielfeld[this.x][this.y] = 'O';
        Anzeige();
        }

Das ist allerdings immer noch schlechter Programmierstil. Du verwendest überall globale Variablen. Versuchs mal mit lokalen Variablen und übergib Argumente an die Methoden.
 

Strim

Mitglied
Okay, hab das jetzt mal alles geändert und Anzeige() wirklich nur für die Anzeige des Spielfelds gemacht, weil wurde wie du gesagt hast richtig unübersichtlich mit der Zeit.

Aber ne Frage:
In Anzeige() wird ja durch die Schleife das Spielfeld immer wieder neu "gezeichnet"... Wie erreiche ich dann, ein Kreuz bzw Kreis reinzusetzen indem ich ausserhalb der Anzeige() etwas anwende????:L



Stehe etwas auf dem Schlauch, freue mich über Hilfe!
 

DrZoidberg

Top Contributor
Ich hab das jetzt mal etwas abgeändert. Übrigens schreibt man Klassenname gewöhnlich gross und Methodennamen klein.

Java:
package tictactoe;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
 
public class Tictactoe {
    char[][] spielfeld = new char[3][3];
    char spieler = 'X';
    boolean spielzuEnde = false;
    
    public static void main(String[] args){
        Tictactoe test = new Tictactoe();
        
        test.spielSchleife();
    }
    
    /**zur Anzeige des Spielfelds*/
    
    public void anzeige(){
        System.out.println("  1 2 3");
        for (int i=0; i<= 2; i++){
            System.out.print(i+1);
            for (int j=0; j <=2; j++){
                System.out.print("|" + spielfeld[i][j]);
            }
            System.out.println('|');
        }
    }
    
    /**gibt x und y-Koordinate zurück und überprüft Eingabe auf Gültigkeit
     * */
    public int[] eingabe(){
        if (spieler == 'X'){
            System.out.println("Spieler 1 ist dran.");
        }else{
            System.out.println("Spieler 2 ist dran.");
        }

        System.out.print("Erste Koordinate eingeben: ");
        int x = readInt()-1;
        System.out.print("Zweite Koordinate eingeben: ");
        int y = readInt()-1;
        
        if(x < 0 || x > 2 || y < 0 || y > 2 || spielfeld[y][x]!='-'){
            System.out.println("Eingabe ungültig");
            anzeige();
            return eingabe();
        }else{
            return new int[] {x, y};
        }
        
    }
    
    public void spielplan(){
        anzeige();
        int[] pos = eingabe();
        int x = pos[0];
        int y = pos[1];
        System.out.print("Gewähltes Feld: " + (x+1) + "/" + (y+1) +"\n");
        spielfeld[y][x] = spieler;
    }

    public void spielSchleife(){
        for(int i=0; i<=2; i++) {
            for(int j=0; j<=2; j++) {
                spielfeld[i][j] = '-';
            }
        }
        while (spielzuEnde==false){
            spielplan();
            
            if(spieler == 'X') {
                spieler = 'O';
            } else {
                spieler = 'X';
            }
        }
    }
 
private BufferedReader console =   new BufferedReader( new InputStreamReader( System.in ) ); 
    
    /**
     * Gibt die nächste Eingabezeile als String zurück.
     */
    public String readLine() {
        try {
            return console.readLine();
        } catch (IOException e) {
            return "\n";
        }
    }
 
    /**
     * Gibt die nächste Eingabezeile als int-Wert zurück. Es werden
     * nur die ersten Ziffer inklusive Vorzeichen berücksichtigt.
     */
    public int readInt() {
            return parseInt(readLine());
    }
 
    /**
     * Wandelt <code>zahl</code> in einen int-Wert.
     */
    public int parseInt(String zahl) {
        try {
            return Integer.parseInt(zahl);
        } catch (NumberFormatException e) {
            return 0;
        }   
    
    }
}
 

Strim

Mitglied
Hey
danke, das hat mir echt geholfen.
Dass ich die Lücken in der Methode Anzeige direkt mit "-" gefüllt habe hat mir Probleme gemacht.:bloed:
Jetzt kanns weitergehen, danke für deine Mühe!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
TicTacToe Java Basics - Anfänger-Themen 6
C TicTacToe Java Basics - Anfänger-Themen 2
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
P TicTacToe Problem mit Win Methode Java Basics - Anfänger-Themen 4
Z TicTacToe mit Array Java Basics - Anfänger-Themen 6
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
I TicTacToe blöde KI Java Basics - Anfänger-Themen 2
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
C Problem TicTacToe Java Basics - Anfänger-Themen 6
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben