Compiler-Fehler Komische Ausgabe meines Programms

LordScrat

Mitglied
Hallo erstmal ich bin noch nicht so lange am Coden und auch nicht sonderlich gut in Java (Programmieren generell: Anfänger Niveau würde ich sagen) und als mir langweilig war hab ich mir gedacht einen Tic Tac Toe Code zu schreiben. Es funktionieren so ziemlich alle Fälle die ich versucht habe, außer eben einer (der ist auch unten angeführt). Ich weiß wirklich nicht weshalb das ist, ich bin die (ich weiß unnötig lange) if-Bedingung schon doppelt und dreifach durchgegangen aber bin nicht auf den Wurm gekommen :/ Ich hoffe ihr könnt mir helfen und möglicherweise könnte mir auch jemand eine elegantere Lösung zur checkWin() Methode zu sagen, statt der vielen, überlangen ifs. Ach ja, die Zahlen bei den Gewinner ausgaben (z.B.: Der Gewinner ist Spieler x4) habe ich reingetan um auf das Problem zu kommen, also bitte ignorieren 🙂 Vielen Dank schonmal im Vorraus für jede Antwort und seit bitte nicht zu Grob zu mir ich bin erst Anfänger >.<

Java:
/**
 * Simulation des Spieles Tic Tac Toe
 * Datum der letzten Bearbeitung: 1.03.2015
 * Author: ******
 */


import java.util.Scanner;
public class TicTacToe {

	public static void main(String[] args) {
		
		char[][] arr=new char[3][3];		//Spielfeld
		int[] pos=new int[2];				//1...Zeile, 2...Spalte
		int countTurn=1;				//Zug counter
		boolean game=true;				//Bedingung damit die Schleife rennt
		
		fillArrFirstTime(arr);			//Füllt das Array zum ersten Mal mit "-"
		
		while(game==true){				
			printField(arr);					//Gibt das Array aus
			pos=inputPos(pos, arr);					//In dieser Methode gibt der Spieler ein wo er sein Zeichen Setzen will
			arr=fillPosInArr(pos, arr, countTurn);		//In dieser Methode wird das Zeichen tatsächlich ins Spielfeld eingefügt
			if(countTurn>=5){						//Es ist erst möglich ab dem 5. Zug zu gewinnen. Dieses if ist nicht notwendig und dient eher zur Orientierung
				game=checkWin(arr, countTurn);		//In dieser Methode wird überprüft ob der Spieler der dran ist 3 in einer Zeile, und damit gewonnen hat
			}
			countTurn++;						
		}
			
	}
	public static char[][] fillArrFirstTime(char[][] arr){
		for(int i=0; i<arr.length; i++){			
			for(int j=0; j<arr[i].length; j++){
				arr[i][j]='-';					//Füllen der Stelle x, y (in dem Fall i, j) mit "-". Dies wird nur am Anfang des Programms gemacht
			}
		}
		return arr;
	}
	public static void printField(char[][] arr){
		int count=1;					//Hilfe zur Gestaltung der Ausgabe
		System.out.println("  1 2 3");
		for(char[] i: arr){			//foreach-Schleifen zur Ausgabe von Arrays
			System.out.printf("%d ", count);
			count++;
			for(char j: i){
				System.out.printf("%s ", j);
			}
			System.out.println();
		}
	}
	public static int[] inputPos(int[] pos, char[][] arr){
		Scanner s=new Scanner(System.in);
		
		System.out.println("Geben Sie Ihre gewählte Zeile ein! ");
		pos[0]=s.nextInt()-1;				//-1 wegen der Index Abfrage bei Arrays
		
		System.out.println("Geben Sie Ihre gewählte Spalte ein! ");
		pos[1]=s.nextInt()-1;				//-1 wegen der Index Abfrage bei Arrays
		
		if(pos[0]>2||pos[1]>2||pos[0]<0||pos[1]<0||arr[pos[0]][pos[1]]=='x'||arr[pos[0]][pos[1]]=='o'){		//Überprüfen ob der eingegebene Wert zu groß/klein oder die Position schon beschrieben ist
			System.out.println("Falsche Eingabe");
			inputPos(pos, arr);					//Rekursion zur Neueingabe
		}
		return pos;
	}
	public static char[][] fillPosInArr(int[] pos, char[][] arr, int count){
		arr[pos[0]][pos[1]]=count%2==0?'o':'x';		//Bedingunsoperator zur Überprüfung welcher Spieler dran ist
		return arr;
	}
	public static boolean checkWin(char[][] arr, int count){
		if(count==9){				//Man kann nicht mehr als 9 Züge spielen
			printField(arr);
			System.out.println("Unentschieden");
			return false;
		}else{
			if((arr[0][0]==arr[0][1]&&arr[0][0]==arr[0][2])||(arr[1][0]==arr[1][1]&&arr[1][0]==arr[1][2])||(arr[2][0]==arr[2][1]&&arr[2][0]==arr[2][2])){	//Überprüfen aller Zeilen auf Gleichheit
				if(count%2==0){
					printField(arr);
					System.out.println("Der Gewinner ist Spieler o1");
				}else{
					printField(arr);
					System.out.println("Der Gewinner ist Spieler x2");				
				}
				return false;
			}else if((arr[0][0]==arr[1][0]&&arr[0][0]==arr[2][0])||(arr[0][1]==arr[1][1]&&arr[0][1]==arr[2][1])||(arr[0][2]==arr[1][2]&&arr[0][2]==arr[2][2])){		//Überprüfen aller Spalten auf Gleichheit
				if(count%2==0){
					printField(arr);
					System.out.println("Der Gewinner ist Spieler o3");
				}else{
					printField(arr);
					System.out.println("Der Gewinner ist Spieler x4");		
				}
				return false;
			}else if((arr[0][0]==arr[1][1]&&arr[0][0]==arr[2][2])||(arr[0][2]==arr[1][1]&&arr[0][2]==arr[2][0])){		//Überprüfen aller Diagonalen auf Gleichheit
				if(count%2==0){
					printField(arr);
					System.out.println("Der Gewinner ist Spieler o5");
				}else{
					printField(arr);
					System.out.println("Der Gewinner ist Spieler x6");				
				}
				return false;
			}else{
				return true;
			}
		}
	}
}

Ausgabe:
  1 2 3
1 - - - 
2 - - - 
3 - - - 
Geben Sie Ihre gewählte Zeile ein! 
1
Geben Sie Ihre gewählte Spalte ein! 
1
  1 2 3
1 x - - 
2 - - - 
3 - - - 
Geben Sie Ihre gewählte Zeile ein! 
2
Geben Sie Ihre gewählte Spalte ein! 
1
  1 2 3
1 x - - 
2 o - - 
3 - - - 
Geben Sie Ihre gewählte Zeile ein! 
1
Geben Sie Ihre gewählte Spalte ein! 
2
  1 2 3
1 x x - 
2 o - - 
3 - - - 
Geben Sie Ihre gewählte Zeile ein! 
2
Geben Sie Ihre gewählte Spalte ein! 
2
  1 2 3
1 x x - 
2 o o - 
3 - - - 
Geben Sie Ihre gewählte Zeile ein! 
3
Geben Sie Ihre gewählte Spalte ein! 
1
  1 2 3
1 x x - 
2 o o - 
3 x - - 
Der Gewinner ist Spieler x4
 
Nimms mir nicht übel, aber das ist mir zu kompliziert gemacht um das durchzugehen.
Aber wenn jemand anders das machen will würde es sicherlich helfen wenn du
erwähnen würdest was das Problem ist.
 
Dein Problem ist die checkWin Methode. Du prüfst ob die reihen zeigen und diagonalen gleich sind. Sind sie bei dir auch , den laut der Methode ist auch "- - -" eine Gleichheit und somit ein Gewinn.

Es tritt aber erst ab Runde 5 auf, da du oben ne Sperre eingebaut hast, bei der der Gewinn erst ab Runde 5 geprüft wird.

LG
Ocean15
 
Du hast schon recht, ich hab mich etwas schlecht ausgedrückt. Ich dachte die Aussage: "Es funktionieren so ziemlich alle Fälle die ich versucht habe, außer eben einer (der ist auch unten angeführt)" genüge, da ich davon ausging man sehe sich den Code bis ganz unten an. Naja egal trotzdem danke für deine Antwort hab die Lösung schon 🙂
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben