Methoden toString-Methode

CEric

Aktives Mitglied
Hi!
Ich muss ein kleines Brettspiel programmieren, das chinesiche Brettspiel Go!
Das Spielfeld hat eine Größe von 10x10 Feldern
Java:
public Spielbrett() {
		Zustand [][] Spielbrett = new Zustand [9][9];
		for(int i = 0; i < Spielbrett.length; i++){
			for(int j = 0; j < Spielbrett.length; j++){
				Spielbrett[i][j] = Zustand.LEER;
			}
In der Methode public String toString() soll nun das Spielbrett als String zurückgegeben werden, wobei für jedes Feld das Zeichen '.' für Zustand.LEER, 'O' für Zustand.WEISS, und 'X' für Zustand.SCHWARZ benutzt werden soll. Der Rückgabestring soll aus 11 Zeilen bestehen, und jede Zeile aus 23 Zeichen. Die erste Zeile und die ersten 3 Zeichen jeder weiteren Zeile für den Rahmen benutzt werden. Einzelne Zeilen werden mit Newline ('\n') getrennt.

Java:
public String toString() {
		
	}

Leider habe ich keine Ahnung, wie ich mit der toString Methode an diese Aufgabenstellung herangehen soll!

MfG
 
mit toString() hat das nur wenig zu tun, einfach System.out.println() für dieses Ergebnis wäre genauso aufwendig,
oder weißt du so gesehen schon eher worum es geht?

fange mit der Ausgabe eines einzigen Feldes an, ., X oder O, bekommst du das hin? was ist eine Schwierigkeit?
wenn du ein Feld hast, dann als nächstes zwei, bestehen nun konkrete Probleme?
usw.,

irgendwann natürlich nicht mehr alles einzeln, sondern mit Schleifen anfangen
 
Hi,

mit
Code:
new Zustand [9][9]
erzeugst du ein neun-elementiges Array von neun-elementigen Arrays (nicht zehn).
Variablen schreibt man übrigens mit kleinem Anfangsbuchstaben ("spielbrett").
Die innere for-Schleife sollte eher
Code:
Spielbrett[i].length
als Maximum nehmen.

In der
Code:
toString()
iterierst du wie schon in deinem Konstruktor mit zwei for-Schleifen über das Array und je nach Zustand konkatenierst du ein anderes Zeichen an den Ausgabestring. Optimalerweise überschreibst du dafür die
Code:
toString()
von
Code:
Zustand
. Bist du mit der inneren for-Schleife fertig, konkatenierst du noch ein Newline an und weiter gehts.
 
Hm,
das mit den beiden for-Schleifen ist mir glaube ich soweit klar, nur leider bin ich mit der Anwendung der toString-Methode nicht vertraut!
Ich kann mir nicht vorstellen, wie ich dann bei der Ausgabe z.B. eine Zeile erhalte die folgendermaßen aussieht . . . . . . . . . . (für eine leere Zeile)!
Ich iteriere ja über das Spielbrett und prüfe für jedes Feld den zustand, je nach zustand lasse ich mir dann das entsprechende Symbol (0,x,.) ausgeben, was aber genau mein Problem darstellt!
 
für toString() musst du statt direkt auszugeben einfach die TeilStrings in einem großen String zusammensammeln,
\n für Zeilenumbruch, wie gesagt wurde
 
Java:
public String toString() {
		
		for(int i=0; i<spielbrett.length;i++){
			for(int j=0; j<spielbrett.length;j++){
				if(spielbrett[i][j] = Zustand.LEER){
				return ".";
				}
			}
		}
		
		
		
	}
Das mit den einzelnen Strings ist soweit auch ganz klar, aber wie komme ich da hin, ich dachte ungefähr an eine solche for-schleife, wobei diese noch nicht funktioniert!
Mein größtes Problem betseht darin, dass ich jede Position auf meinem Brett auf den zustand prüfe und mir dann irgendwie dsas entsprechende zeichen zurückgeben lassen muss, wobei ich nicht weiß wie das funktionieren soll!
 
ich habe vom Zusammenfügen von Strings gesprochen, dazu hast du ja gar nichts,
sagen dir diese Worte nichts?

du hast jetzt ne dicke Doppelschleife, aber noch nicht einmal für ein Feld alle Möglichkeiten,
woran man zuerst arbeitet ist natürlich Ansichtssache,
aber spätestens jetzt könntest du dich ja mal hierzu wenden:
fange mit der Ausgabe eines einzigen Feldes an, ., X oder O, bekommst du das hin? was ist eine Schwierigkeit?
wenn du ein Feld hast, dann als nächstes zwei, bestehen nun konkrete Probleme?
usw.,

-------

> Mein größtes Problem betseht darin, dass ich jede Position auf meinem Brett auf den zustand prüfe
> und mir dann irgendwie dsas entsprechende zeichen zurückgeben lassen muss, wobei ich nicht weiß wie das funktionieren soll!

ungenau ungenau ungenau,
was spricht denn allein schon gegen drei ifs? so wie du mit einem if bisher schon einen der drei Zustände prüfst

eine Untermethode wäre ganz gut,
Java:
public String getZustand(int x, int y) {
  ..
}
-----


ein = ist übrigens eine Zuweisung, ein == ein Vergleich
 
Hm ist sicher ganz einfach, aber irgendwie zu hoch für mich!

Könntet ihr mir vielleicht sagen ob ich mit dem Rest meines Quellcodes auf der richtigen Spur bin?!

Java:
public class Spielbrett implements Cloneable{
	Zustand [][]  spielbrett;
        //neues spielbrett mit 10x10 Feldern
	public Spielbrett() {
		Zustand [][] spielbrett = new Zustand [9][9];
		
	//zu Beginn ist das Spielfeld leer, also Zustand.LEER	
	for(int i = 0; i < spielbrett.length; i++){
		for(int j = 0; j < spielbrett.length; j++){
			spielbrett[i][j] = Zustand.LEER;
		}
			
	}
	}
        /*hier soll geprüft werden ob die koordinaten x und y in der Menge o bis 9 enthalten sind und
         *somit auf dem spielbrett liegen
        */
	public Zustand getFeld(int x, int y) {
		int [] Feld={0,1,2,3,4,5,6,7,8,9};
		
		if ( Arrays.asList(Feld).contains(x & y)){
			return spielbrett[x][y];
			
		}
		else throw new IllegalArgumentException("x und y nicht enthalten!");
		
	}
	
        //liegen x und y auf dem Spielbrett, soll das feld auf zustand gesetzt werden

	public void setFeld(int x, int y, Zustand zustand) {
		if(Arrays.asList(spielbrett).contains(x & y)){
			spielbrett[x][y].getDeclaringClass();        //???
		
		}
		else throw new IllegalArgumentException("x und y nicht enthalten!");
		
	    if(zustand != Zustand.LEER){
	    	throw new IllegalArgumentException();
	    	}
	    else if(zustand != Zustand.SCHWARZ){
	    	throw new IllegalArgumentException();	    
			}
	    else if(zustand != Zustand.WEISS){
	    	throw new IllegalArgumentException();
	        }
	    else;
	
	}

Anschließend folgt das oben beschriebene Problem!

Vielen Dank
 
Zuletzt bearbeitet:
Einen String zusammenfügen ist ein Problem?

String a = "a";
String b = "b";
String c = a+b;

Wäre eine Möglichkeit. Ich glaube du wirst echt harte Probleme bekommen, wenn du GO-Programmieren sollst und bei toString scheiterst.

Ein Feld mit 10*10 Feldern sollte auch mit Länge 10 initialisiert werden. [9] bedeutet 0 - 8 = 9

Deine Koordinatenprüfung ist auch von hinten durchs Knie in den Kopf

Java:
if(x > 0 && x < 9 && y > 0 && y < 9) ...
 
Schreibe ich doch. Du liest anscheinend noch nichtmal die Beiträge korrekt. SlaterB sagt dir du sollst Strings zusammen sammeln, darauf gehst du nicht ein. Ich zeige dir wie man es machen kann.

Auch 2 weitere Tipps habe ich dir gegeben.

Für das Gesamtsystem scheinen bei dir die Grundlagen nicht vorhanden zu sein. Das ist ja als Fakt nichts schlimmes, meine Freundin kann auch kein Java, die muss aber eben auch kein Go Programmieren. Woran das liegt, dass dein Können und die zu bewältigende Aufgabe so weit auseinanderklaffen, weiß ich ja nicht.

Du kannst jetzt erstmal Strings "konkatenieren" <- "Java spezifisches Wort für zusammensetzen (concat)"

und ich würde mich mal mit Junit auseinandersetzen. Dann liest du ein Spielfeld ein, testest paar Züge und die Ausgaben
 
Hab hier mal meinen Code, kann mir jemand sagen warum die toString noch gar nix zurück gibt?!

Java:
package de.jpp.minigo;

public enum Zustand {
    LEER, WEISS, SCHWARZ;       

	
	public Zustand komplement(){
	
		if(this.equals(Zustand.WEISS.komplement())){
			return Zustand.SCHWARZ;
			}
		

		else if(this.equals(Zustand.SCHWARZ.komplement())){
			
			return Zustand.WEISS;
			}
		

		else return Zustand.LEER;
			
				
		
	}

}
Java:
package de.jpp.minigo;

public class Spielbrett {

	Zustand[][] spielbrett;

	public Spielbrett() {
		Zustand[][] spielbrett = new Zustand[10][10];

		for (int x = 0; x < 10; x++) {
			for (int y = 0; y < 10; y++) {
				spielbrett[x][y] = Zustand.LEER;
			}
		}
	}

	public Zustand getFeld(int x, int y) {
		if (x < 0 || y < 0) {
			throw new IllegalArgumentException("x und y nicht enthalten!");
		} else if (x > 9 || y > 9) {
			throw new IllegalArgumentException("x und y nicht enthalten!");
		}
		return spielbrett[x][y];
	}

	public void setFeld(int x, int y, Zustand zustand) {
		if (x < 0 || y < 0 || x > 9 || y > 9) {
			throw new IllegalArgumentException("x und y nicht enthalten!");
		}

		else if (zustand != Zustand.LEER) {
			throw new IllegalArgumentException();
		} else if (zustand != Zustand.SCHWARZ) {
			throw new IllegalArgumentException();
		} else if (zustand != Zustand.WEISS) {
			throw new IllegalArgumentException();
		}

		spielbrett[x][y] = zustand;

	}

	
	public String toString() {
		String kopf = "y\\x 0 1 2 3 4 5 6 7 8 9";
		String felder = "\n1\n2\n3\n4\n5\n6\n7\n8\n9";

		for (int x = 0; x < 9; x++) {
			for (int y = 0; y < 9; y++) {
				if (spielbrett[x][y].equals(Zustand.WEISS)) {
					felder += "O" + "";

				} else if (spielbrett[x][y].equals(Zustand.SCHWARZ)) {
					felder += "X" + "";

				} else {
					felder += "." + "";
				}
			}

		}
		return kopf + felder;

	}

	public boolean equals(Object objekt) {
		Object[][] vergleich = new Zustand[10][10];

		if (spielbrett.equals(vergleich)) {
			return true;
		}
		vergleich = null;
		if (spielbrett.equals(vergleich)) {
			return false;
		} else
			return false;
	}

	public Object clone() {
		Object[][] spielbrettgeklont = new Zustand[10][10];

		for (int x = 0; x < 9; x++) {
			for (int y = 0; y < 9; y++) {
				spielbrettgeklont[x][y] = spielbrett[x][y];
			}

		}
		return spielbrettgeklont;

	}

	

	public static void main(String[] args) {

		Spielbrett spiel = new Spielbrett();
		System.out.println(spiel.toString());

	}
}

Danke!
 
Eventuell fehlt das @Override? Was passiert wenn du die Methode nicht toString sondern toMyString nennst?

Glaube aber das irgendwo was anderes nicht stimmt. Gib mal in deiner Methode den String "kopf" und "felder" aus...
 
Also wenn ich das ganze laufen lasse, dann wirft er mir ne NullPointerException und sagt mir, dass das an der Zeile
50 liegt!
Irgendetwas passt da nicht ganz mit den Zuständen oder so.

Exception in thread "main" java.lang.NullPointerException
at de.jpp.minigo.Spielbrett.toString(Spielbrett.java:50)
at de.jpp.minigo.Spielbrett.main(Spielbrett.java:97)
 
Hi,

in deinem Konstruktor initialisierst du nur die lokale Variable "spielbrett"!
Du musst die Klassenvariable mit den Werten füllen (oder einfach gesagt:
Du musst das "Zustand[][]" vor "spielbrett" im Konstruktor weglassen).
 
Meine toString Methode sieht jetzt wie folgt aus!
Java:
public String toString() {
		String kopf = "y\\x 0 1 2 3 4 5 6 7 8 9";
		String felder = "";
		int z = -1;
		for (int y = 0; y < 10; y++) {

			z++;
			felder = felder + "\n" + z + "   ";
			for (int x = 0; x < 10; x++) {
				if (spielbrett[x][y].equals(Zustand.WEISS)) {
					felder += " " + "O";

				} else if (spielbrett[x][y].equals(Zustand.SCHWARZ)) {
					felder += " " + "X";

				} else {
					felder += " " + ".";
				}
			}

		}

		return kopf + felder;

	}

Wie bekomme ich hin, dass nach der letzten Zeile, kein Zeilenumbruch mehr gemacht wird, ich also am Ende der Zeile stehen bleibe!
 
meiner Ansicht nach ist das erreicht, der Zeilenumbruch kommt ja in Zeile 8 vor den aktuellen O + X
was läßt dich anderes vermuten?

wenn du System.out.println() verwendest, landest du natürlich zwangsweise in einer neuen Zeile nach der Ausgabe

------

z ist immer == y?
 
Zuletzt bearbeitet von einem Moderator:
Das ist meine Ausgabe(leider etwas verschoben), und ich kann nach der Ausgabe noch dahin springen wo das w steht, also unter die letzte Zeile, ich möchte aber dort bleiben wo das q steht, also hinter der letzten Zeile!
y\x 0 1 2 3 4 5 6 7 8 9
0 . . . . . . . . . .
1 . . . . . . . . . .
2 . . . . . . . . . .
3 . . . . . . . . . .
4 . . . . . . . . . .
5 . . . . . . . . . .
6 . . . . . . . . . .
7 . . . . . . . . . .
8 . . . . . . . . . .
9 . . . . . . . . . .q
w
 
habe ich das nicht umfassend beantwortet?
es gibt auch print() statt println(), falls unbekannt
 
meiner Ansicht nach ist das erreicht, der Zeilenumbruch kommt ja in Zeile 8 vor den aktuellen O + X
was läßt dich anderes vermuten?

wenn du System.out.println() verwendest, landest du natürlich zwangsweise in einer neuen Zeile nach der Ausgabe

------

z ist immer == y?

Das war natürlich mal wieder ein sehr sehr einfacher Fehler, oh man! :lol:
Danke
 

Zurück
Oben