# Schachbrett mit for- oder while-Schleife



## justice (9. Mai 2009)

Hallo zusammen,

ich muss für die Uni ein Java-Programm erstellen und komme einfach nicht weiter. Vielleicht könnt ihr mir ja helfen.

Ich soll mittels for- oder while-Schleifen ein "Schachbrett" erstellen, welches folgendermaßen aussehen soll:

```
|O|O|L|O|O|O|O|O|
|O|O|O|O|O|O|O|O|
|O|O|O|O|B|O|O|O|
|O|O|O|O|O|O|O|O|
|K|O|O|O|O|O|T|O|
|O|O|O|O|O|O|O|O|
|O|O|O|B|O|O|O|O|
|O|O|O|O|O|O|O|O|
```


Das Schachbrett bekomme ich hin, allerdings habe ich keine Ahnung, wie ich die "Schachfiguren" in das Brett bekomme.

Mein Code sieht bis jetzt so aus:


```
public class Chess {
	
	public static void main (String[] args) {
		String o = "|O";
		String l = "|L";
		String b = "|B";
		String k = "|K";
		String t = "|T";
		
		for (int i = 1; i <= 8; i++) {
			for (int j = 1; j <= 8; j++)
				System.out.print(o);
				System.out.print("|");
			System.out.println();
		}
		
	}
}
```


Vielen Dank für eure Hilfe!


----------



## Marco13 (9. Mai 2009)

Wah.  nein, nicht einfach so ausgeben. Das kann nicht das Ziel der Übung sein. (Und stell dir mal vor, nächste Woche soll ein Schachbrett mit einer anderen Konstellation ausgegeben werden - dann darfst du alles nochmal machen).

Ich einfachsten Fall würde man das in einen 2D-Array packen, aber eine Klasse wäre sauberer und flexibler. Überleg' dir mal, wie eine Klasse "Board" aussehen könnte, die man z.B. so verwenden könnte:

```
Board board = new Board(8,8);
board.set(0,2, 'L');
board.set(2,4, 'B');
...
board.print(); // Gibt das aktuelle Brett aus
```


----------



## Lexi (9. Mai 2009)

Sollen die Figuren immer an der gleichen Stelle bleiben ? Also musst du nur einmal dieses Schachbrett, wie du es gepostet hast, ausgeben ?

Edit: Ein nein auf meine Frage, hätte einen Vorschlag zu Tage gefördert, der soähnlich ist, wie der von Marco.^^


----------



## justice (9. Mai 2009)

Lexi hat gesagt.:


> Sollen die Figuren immer an der gleichen Stelle bleiben ? Also musst du nur einmal dieses Schachbrett, wie du es gepostet hast, ausgeben ?



Ja, das Schachbrett muss nur einmal in dieser Konstellation ausgegeben werden.
Die von Marco13 angesprochene Variante kenne ich noch gar nicht, lerne Java erst seit einem Monat.

Aber danke schon mal euch beiden!


----------



## Lexi (9. Mai 2009)

Der Ansatz von Marco ist objekt orientiert. Daraus resultieren viele Vorteile, wie z.B. die von ihm angesprochene Flexibilität, die es erlaubt später ohne großen Aufwand den Code zu verändern. 

Da Java eine objekt orientierte Sprache ist, ist dies generell gesehen der bessere Weg.
Wenn du jetzt aber nur einmal so eine, sagen wir "statische" Ausgabe haben möchtest, kann man das auch noch anders machen.

Du fragst einfach ab ob i und j gerade die Position repräsentieren, an der z.B. ein "L" stehen soll, wenn das der Fall ist printest du "L" aus, ansonsten machst du dein Standartprogramm ( "|O" ).

Das ist ein sehr unschöner Ansatz. Sobald du in die OO Programmierung einsteigst wirst du sehen wie viele Vorteile du daraus ziehen kannst. Wäre bestimmt interessant, wenn du diese Aufgabe in ein oder zwei Monaten nochmal bearbeiten würdest.


----------



## justice (9. Mai 2009)

Lexi hat gesagt.:


> Du fragst einfach ab ob i und j gerade die Position repräsentieren, an der z.B. ein "L" stehen soll, wenn das der Fall ist printest du "L" aus, ansonsten machst du dein Standartprogramm ( "|O" ).



Genau diesen Tipp habe ich schon erhalten, jedoch weiß ich nicht wirklich, wie ich das umsetzen soll. Also wie ich abfragen kann, an welcher Stelle was steht.

Dass das eine sehr unschöne Weise ist, wurde uns schon im Vorfeld gesagt, wir sollen dadurch wohl erstmal einige Basics lernen.


----------



## Lexi (9. Mai 2009)

Abfragen tust du das mit einer normalen if - Abfrage.
Wenn dort i == 1 && j == 3 ist, dann printe ein "L" aus.
Wenn das nicht der Fall ist ( else ), dann printe ein "|O" aus.


----------



## Marco13 (10. Mai 2009)

Hmmm... irgendwie erschließt sich mir der didaktische Sinn hier nicht ganz. 

```
for (int i=0; i<1; i++)
{
    System.out.println("|O|O|L|O|O|O|O|O|");
    System.out.println("|O|O|O|O|O|O|O|O|");
    System.out.println("|O|O|O|O|B|O|O|O|");
    System.out.println("|O|O|O|O|O|O|O|O|");
    System.out.println("|K|O|O|O|O|O|T|O|");
    System.out.println("|O|O|O|O|O|O|O|O|");
    System.out.println("|O|O|O|B|O|O|O|O|");
    System.out.println("|O|O|O|O|O|O|O|O|");
}
```
Aber vielleicht muss er das ja garnicht.


----------



## justice (10. Mai 2009)

Marco13 hat gesagt.:


> Hmmm... irgendwie erschließt sich mir der didaktische Sinn hier nicht ganz.
> 
> ```
> for (int i=0; i<1; i++)
> ...



Das wäre natürlich die einfachste Lösung, aber gerade so sollen wir es _nicht_ machen. Frag mich bitte nicht nach dem Sinn...

Eine Frage noch: Muss ich die if-Schleife in der for-Schleife verschachteln? Das Ergebnis sieht immer noch nicht so aus, wie es sollte.


----------



## Lexi (10. Mai 2009)

Ich weiß nicht, ob man das unbedingt verschachteln nennt. Die if-Abfrage muss in dem Body der inneren for-Schleife stehen.
Du willst ja jedesmal bevor du was ausgibst prüfen ob jetzt ein "|L" o.ä. ausgegeben werden soll, anstatt einem "|O".


```
for( ... ){
	if( ... ){
		doSomething();
	}
}
```


----------



## ARadauer (10. Mai 2009)

mach dir ein zweidimensionales array das das brett darstellt und gib es aus....



> Frag mich bitte nicht nach dem Sinn...


das du den einfachen umgang mit arrays und schleifen lernst...


----------



## ARadauer (10. Mai 2009)

was genau studierst du?
falls das entwickeln von software ein zentraler bestandteil deines studiums ist, würd ich mir das beispiel nochmal ansehen und veruchen es alleine zu lösen... da das verstehen der grundlagen zu beginn sehr sehr wichtig ist...

falls du irgend ein mediendesigner oder physiker bist, die java nur so nebenbei haben, kannst es ruhig sagen, kann dir gern morgen eine lösung posten...


----------



## Ark (10. Mai 2009)

ARadauer hat gesagt.:


> falls du irgend ein mediendesigner oder physiker bist, die java nur so nebenbei haben, kannst es ruhig sagen, kann dir gern morgen eine lösung posten...


Alle Achtung, ab sofort studieren alle Neuankömmlinge Physik oder Mediendesign; auch DevX. 

Ark


----------



## justice (10. Mai 2009)

ARadauer hat gesagt.:


> was genau studierst du?



Ich studiere Medienwissenschaften, Java ist aber schon ein zentraler Bestandteil meines Studiums, daher möchte ich es auch gern selbst verstehen und lösen.

Ist habe es jetzt mit folgendem Code versucht:


```
public class Chess {
	
	public static void main (String[] args) {
		String o = "|O";
		String l = "|L";
		String b = "|B";
		String k = "|K";
		String t = "|T";
		
		for (int i = 1; i <= 8; i++) {
			
			for (int j = 1; j <= 8; j++) {
				
				if (i == 1 && j == 3) {
					System.out.print(l);
				}
				
				if (i == 3 && j == 5) {
					System.out.print(b);
				}
				
				if (i == 5 && j == 1) {
					System.out.print(k);
				}
				
				if (i == 5 && j == 7) {
					System.out.print(t);
				}
				
				if (i == 7 && j == 4) {
					System.out.print(b);
				}
				
				if (i <= 8 && j == 8) {
					System.out.print("|");
					System.out.println();
				}
				
				else {
					System.out.print(o);
				}
			}
		}
		
	}
}
```


Allerdings gibt mir Eclipse jetzt folgendes aus:


```
|O|O|L|O|O|O|O|O|
|O|O|O|O|O|O|O|
|O|O|O|O|B|O|O|O|
|O|O|O|O|O|O|O|
|K|O|O|O|O|O|O|T|O|
|O|O|O|O|O|O|O|
|O|O|O|B|O|O|O|O|
|O|O|O|O|O|O|O|
```


Was mache ich falsch und ist mein Lösungsansatz überhaupt zu gebrauchen?


----------



## Illuvatar (10. Mai 2009)

Ich glaube, du meinst das richtige - es ist nur noch nicht ganz richtig aufgeschrieben 

Was du sagen willst, ist zum Beispiel (gekürzt): "Wenn i=1 und j=3, dann L, oder wenn* i=3 und j=5, dann B, ansonsten O. Danach ein Trennstrich, falls das Zeilenende erreicht ist."

Was du sagst ist: "Wenn i=1 und j=3, dann L. Wenn i=3 und j=5, dann B. Danach, falls das Zeilenende erreicht ist, ein Trennstrich, ansonsten O"

*das nennt sich "else if"!


----------



## justice (10. Mai 2009)

Vielen Dank, das war der entscheidende Tipp 
Habe es jetzt mit diesem Code hinbekommen:


```
public class Chess {
	
	public static void main (String[] args) {
		String o = "|O";
		String l = "|L";
		String b = "|B";
		String k = "|K";
		String t = "|T";
		
		for (int i = 1; i <= 8; i++) {
			
			for (int j = 1; j <= 8; j++) {
				
				if (i == 1 && j == 3) {
					System.out.print(l);
				}
				
				else if (i == 3 && j == 5) {
					System.out.print(b);
				}
				
				else if (i == 5 && j == 1) {
					System.out.print(k);
				}
				
				else if (i == 5 && j == 7) {
					System.out.print(t);
				}
				
				else if (i == 7 && j == 4) {
					System.out.print(b);
				}
				
				else {
					System.out.print(o);
				}
				
				if (i <= 8 && j == 8) {
					System.out.print("|");
					System.out.println();
				}
				
			}
		}
		
	}
}
```

Kann ich die beiden if-Abfragen, bei denen String b ausgegeben werden soll noch zusammenfassen? Entschuldigt bitte meine dummen Fragen, ich stehe was Java angeht wirklich noch ganz am Anfang 

Euch allen vielen, vielen Dank für eure Hilfe und eure Geduld!!


----------



## Illuvatar (10. Mai 2009)

justice hat gesagt.:


> Kann ich die beiden if-Abfragen, bei denen String b ausgegeben werden soll noch zusammenfassen?



Ja, kannst du. Ähnlich wie das && - den "und"-operator, gibt es auch das || ("oder").
Also in etwa so:

```
else if ((i == 3 && j == 5) || (i == 7 && j == 4)) {
   System.out.print(b);
}
```


----------



## justice (10. Mai 2009)

Vielen Dank!!


----------



## ARadauer (11. Mai 2009)

justice hat gesagt.:


> Vielen Dank!!


ahh das muss ich mich gleich wieder ärgern... das was du da programmierst ist im grunde nix anders als das was marco zum spaß gepostet hat... ich zeig dir mal wie ich die aufgabenstellung verstanden habe bzw wie ich mir das vorstelle und dann sagst du mir was flexibler und sinnvoller ist....


```
package chess;

public class Chess {
   
  public static String OFFEN = "O";
  public static String LAEUFER = "L";
  public static String BAUER = "B";
  public static String KOENIG = "K";
  public static String TURM = "T";
   
   String[][] board;
   
   public Chess(){
      board = new String[8][8];
      for(int i = 0; i<board.length; i++){
         for(int j = 0; j<board[i].length; j++){
            board[j][i] = OFFEN;
         }
      }
   }
   
   public void setFigur(int x, int y, String figur){
      //Überprüfung ob am Feld einbauen...
      board[y][x] = figur;
   }

   public String getFigur(int x, int y){
      //Überprüfung ob am Feld einbauen...
      return board[y][x];
   }
   
   public void ausgabe(){
      for(int i = 0; i<board.length; i++){
         for(int j = 0; j<board[i].length; j++){
           System.out.print("|"+board[i][j]);
         }
         System.out.println("|");
      }
     
   }
}
```


```
package chess;

public class ChessTest {

   public static void main(String[] args) {
      Chess chess = new Chess();
      chess.setFigur(2, 0, Chess.LAEUFER);
      chess.setFigur(4, 2, Chess.BAUER);
      chess.setFigur(0, 4, Chess.KOENIG);
      chess.setFigur(6, 4, Chess.TURM);
      chess.setFigur(4, 6, Chess.BAUER);
      chess.ausgabe();
   }
}
```


----------



## justice (11. Mai 2009)

ARadauer hat gesagt.:


> ahh das muss ich mich gleich wieder ärgern... das was du da programmierst ist im grunde nix anders als das was marco zum spaß gepostet hat... ich zeig dir mal wie ich die aufgabenstellung verstanden habe bzw wie ich mir das vorstelle und dann sagst du mir was flexibler und sinnvoller ist....



Flexibler und sinnvoller ist sicherlich deine Variante, allerdings sind wir noch nicht auf dem Wissensstand, das auch so zu lösen. Laut Aufgabenstellung sollten wir auch sämtlichen Code direkt in die main-Methode schreiben. Ansonsten gebe ich dir natürlich Recht, das Ergebnis ist im Prinzip genauso unflexibel wie die Lösung mit den acht Strings.


----------



## ARadauer (11. Mai 2009)

> Aufgabenstellung sollten wir auch sämtlichen Code direkt in die main-Methode schreiben


Medienwissenschafts Lektoren und Montag Morgen haben etwas gemeinsam.... ;-) ich mag sie nicht...


----------



## ARadauer (11. Mai 2009)

aber im grunde ist es ja egal....
kann man ja so auch machen


```
package chess;

public class ChessTest {

   public static String OFFEN = "O";
   public static String LAEUFER = "L";
   public static String BAUER = "B";
   public static String KOENIG = "K";
   public static String TURM = "T";

   public static void main(String[] args) {

      //Brett initialiseren
      String[][] board = new String[8][8];
      for(int i = 0; i<board.length; i++){
         for(int j = 0; j<board[i].length; j++){
            board[j][i] = OFFEN;
         }
      }

      //Figuren setzen
      board[2][0] = Chess.LAEUFER;
      board[4][2] = Chess.BAUER;
      board[0][4] = Chess.KOENIG;
      board[6][4] = Chess.TURM;
      board[4][6] = Chess.BAUER;

      //Ausgeben
      for(int i = 0; i< board.length; i++)
         for(int j = 0; j<board[i].length; j++){
            System.out.print("|"+board[i][j]);
         }
      System.out.println("|");
   }

}
```
mir ist wichtig, dass du den sinn dahinter verstehts... das array stellt das Brett da, man kann es erzeugen, manipuliteren, darstellen..


----------



## justice (11. Mai 2009)

Den Sinn dahinter habe ich jetzt auch verstanden - glaube ich zumindest 
Echt super, wie ihr euch hier bemüht, vielen Dank!


----------

