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
 
S

SlaterB

Gast
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
 

xehpuk

Top Contributor
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.
 

CEric

Aktives Mitglied
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!
 
S

SlaterB

Gast
für toString() musst du statt direkt auszugeben einfach die TeilStrings in einem großen String zusammensammeln,
\n für Zeilenumbruch, wie gesagt wurde
 

CEric

Aktives Mitglied
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!
 
S

SlaterB

Gast
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
 

CEric

Aktives Mitglied
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:

timbeau

Gesperrter Benutzer
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) ...
 

timbeau

Gesperrter Benutzer
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
 

CEric

Aktives Mitglied
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!
 

timbeau

Gesperrter Benutzer
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...
 

CEric

Aktives Mitglied
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)
 
G

gman

Gast
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).
 

CEric

Aktives Mitglied
Vielen Dank, das war die Lösung des Problems, jetzt muss ich nur noch i-wie den String in die richtige Form bringen!
MfG
 

CEric

Aktives Mitglied
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!
 
S

SlaterB

Gast
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:

CEric

Aktives Mitglied
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
 
S

SlaterB

Gast
habe ich das nicht umfassend beantwortet?
es gibt auch print() statt println(), falls unbekannt
 

CEric

Aktives Mitglied
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
 

Neue Themen


Oben