# Solitär



## norroy (10. Dez 2007)

Hey Jungs

Hat jemand von euch zufällig ein Solitär, das mit EINFACHSTEN Mitteln programmiert ist? Die Spieloberfläche sollte lediglich ein entsprechend gefülltes Array sein, es sind also keine Grafiken vonnöten.
Ich bin eben sogar für das zu dumm, aber ihr Pros könnt das bestimmt... :autsch: 
Greez & Hoffnung auf baldige Antwort


----------



## Quaxli (10. Dez 2007)

Auch Einschmeicheln hilft nicht bei Hausaufgaben


----------



## Guest (10. Dez 2007)

Du lenkst vom Thema ab


----------



## norroy (10. Dez 2007)

ehm.. hehe... vergessen einzuloggen....


----------



## Illuvatar (10. Dez 2007)

Na gut... nehmen wir das mal als wahr an... dann bist du dumm und wir sind Pros... nur, das bedeutet, dass du hier noch was zu lernen hast. Dafür eignet sich ganz gut... öhm, sagen wir... ein 

Solitär!


----------



## The_S (11. Dez 2007)

Wenn du nichts selber machen willst, kannst du dir auch immer noch jemanden suchen, den du für die Arbeit bezahlst.


----------



## norroy (11. Dez 2007)

Nun gut, ich sehe, ich muss das ganze anderst angehen. Deshalb werde ich mein Kernproblem zum Programm anderst formulieren. Das Spiel sieht momentan so aus, dass ich das Array ("Spielefeld") automatisch mit den gebrauchten Zeichen ausgeben kann. Das Spiel funktioniert gemäss lehrerlicher Vorgabe nun so, dass der Spieler seine Aktuelle Position mit Koordinaten und die Koordinaten des Punktes, auf den er gerne gehen würde per Keyboard eingibt (ein Beispiel exemplarischer Natur: e5 c5). Kann mir jemand sagen, wie das Programm erkennen kann, welches Zeichen was darstellt, ohne das man alles einzeln eingeben muss? Und hat auch jemand konstruktive Ideen, wie das Programm prüfen könnte, ob der Zug überhaupt möglich ist?
Danke im Voraus.


----------



## ARadauer (12. Dez 2007)

reden wir über das kartenspiel oder das "steinchen hüpft über steinchen und steinchen ist weg bis ein steinchen in der mitte übrig bleibt" spiel?

also steinchen spiel vermut ich mal, mal einfach 5x5 spielfeld
array in array

0 is leer 8 is steinchen


```
int[][] a= {{0,0,8,0,0},{0,8,8,8,0},{8,8,0,8,8},{0,8,8,8,0},{0,0,8,0,0}};
```

dann mal das zeichen von e5 c5, also e und c in zahlen umwandeln

```
//du darfst auch was machen ;-)
```
zb
if(a[4][5[] == 8) steinchen ist gesetzt also:

schaun ob auf e5 was ist 
schaun ob auf c5 nichts ist
schaun ob dazwischen (d5) was ist

wenn alle drei ok, dann:
e5 auf 0 setzen
c5 auf 8 setezen
und d5 auf 0 setzen

eh ganz einfach, hört sich auch lustig an, vielleicht programmier ich das heute noch. ;-)


----------



## ARadauer (12. Dez 2007)

> Kann mir jemand sagen, wie das Programm erkennen kann, welches Zeichen was darstellt, ohne das man alles einzeln eingeben muss?


 asso, genau das was ich nicht geschrieben habe ;-)

ja so halt ungefähr, sowas is eh lustig.

```
int[][] a= {{0,0,8,0,0},{0,8,8,8,0},{8,8,0,8,8},{0,8,8,8,0},{0,0,8,0,0}};
			String text = "C4";
			text = text.toUpperCase();
			int x = Character.getNumericValue(text.charAt(0))-9;
			int y = Integer.parseInt(text.substring(1, 2));
			if(a[x-1][y-1]==8){
				System.out.println(x+"|"+y+" Steinchen");
			}else{
				System.out.println(x+"|"+y+" kein Steinchen");
			}
```


 aber ich werds heute nicht mehr ausprogrammieren, werd jetzt nach hause fahren und meine wohnung streichen


----------



## norroy (12. Dez 2007)

Nun soweit so gut. Was mir aber immer noch nicht klar ist, wie man die Buchstaben der Koordinaten in eine Zahl umwandelt. 
Gibts dafür eine Methode? 
Oder eine if-Schleife? Zum Beispiel:

if(eingebenerbuchstabe==c){
eingebenerbuchstabe=5;
}

Bitte um Antworten und Merci für die letzte Hilfe  :wink:


----------



## SlaterB (12. Dez 2007)

if-Schleife gibts schonmal nicht, if-Abfrage vielleicht,

Strings kannst du mit Integer.parseInt() parsen,

wenn du einen char wie '5' hast,
dann bekannst du mit 
int zahl = char -'0'; die Zahl 5


----------



## ARadauer (13. Dez 2007)

norroy hat gesagt.:
			
		

> Nun soweit so gut. Was mir aber immer noch nicht klar ist, wie man die Buchstaben der Koordinaten in eine Zahl umwandelt.
> Gibts dafür eine Methode?



schade das mein code nicht gelesen wird  :autsch:  :autsch:  :autsch:  :autsch: 


```
int x = Character.getNumericValue('C')-9;
```


----------



## norroy (13. Dez 2007)

Es liegt nicht am lesen, das hab ich, jedoch hab ich nicht verstanden was diese Methode macht.


----------



## norroy (13. Dez 2007)

SlaterB hat gesagt.:
			
		

> Strings kannst du mit Integer.parseInt() parsen,



Besteht die Möglichkeit, das du mir was sagen willst?


----------



## norroy (13. Dez 2007)

@ ARadauer: Könntest du mir einen RIESEN Gefallen tun und mir mal Zeile für Zeile erklären was deine Codes machen? Ich versteh nähmlich kein Wort, die Hälfte der Methoden hab ich noch nie gesehn und hab so keine Ahnung was ich an ihm Ergänzen muss, um das Programm zu kompletieren.
Merci vielmals


----------



## ARadauer (14. Dez 2007)

ja freilich,
vorher, wenn du nicht weist was eine Methode macht oder für was ein objekt gut ist kannst du hier nachsehen
http://java.sun.com/javase/6/docs/api/
sieht zu beginn immer ein wenig verwirrend aus, aber wenn man die api doku eine zeit lang benutzt, findet man sich ziehmlich schnell zurecht. man weiß zwar nicht alles, aber man bekommt ein gutes gefühl dafür wo man nachsehen muss.



```
int[][] a= {{0,0,8,0,0},{0,8,8,8,0},{8,8,0,8,8},{0,8,8,8,0},{0,0,8,0,0}}; 
//baut ein zwei dimensionales array als spielfeld auf, und kann über a[x][y] angesprochen werden, erste zeile erste spalte ist [0][0], dritte zeile zweite spalte zb [4][3]
         String text = "C4"; 
//ein beispiel text, könnte eingegeben werden
         text = text.toUpperCase(); 
//das wir uns nicht mit groß und klein schreibung rum ärgern müssen, setzen wir alles auf großbuchstaben
         int x = Character.getNumericValue(text.charAt(0))-9;
//char at liefert das zeichen an der postiion 0 also C, Charcter.getNumericValue liefert den numerischen wert von C, warum jetzt minus 9, sag ich gleich
         int y = Integer.parseInt(text.substring(1, 2)); 
//Integer.parseInt wandelt text in eine zahl um, text.substring liefert einen ausschnitt eines textes

         if(a[x-1][y-1]==8){ 
//hier -1 da wir ja mit 0 im array beginnen
            System.out.println(x+"|"+y+" Steinchen"); 
         }else{ 
            System.out.println(x+"|"+y+" kein Steinchen"); 
         }
```



ok jetzt warum - 9, ich weiß nicht genau. ich hab immer angenommen, das A den an 26 Stelle der ascii tablle liegt, also hab ich mit 26 gerechnet, als ich jedoch das progiert hab:


```
String a = "ABCDEFGHIJKLMOPQRSTUVWXYZ";
		for(int i = 0; i < a.length(); i++)
			System.out.println(Character.getNumericValue(a.charAt(i)));
```
is das raus gekommen:

A 10
B 11
C 12
D 13
E 14
F 15
....

warum jetzt A 10 ist, kann vielleicht jemand anderer erklären.....


----------



## ARadauer (14. Dez 2007)

naja irgendwie doch logisch:
123456789ABC...


----------



## SlaterB (14. Dez 2007)

norroy hat gesagt.:
			
		

> SlaterB hat gesagt.:
> 
> 
> 
> ...



ich wollte sagen, dass du Strings mit Integer.parseInt() parsen kannst?


----------



## Gast (14. Dez 2007)

Vielleicht weiss er nicht was parsen ist


----------



## ARadauer (14. Dez 2007)

[quote wiki]Ein Parser [ˈpɑːɹsɚ] (engl. to parse „analysieren“ bzw. von lateinisch pars „Teil“; im Deutschen gelegentlich auch Zerteiler) ist ein Computerprogramm, das in der Computertechnik für die Zerlegung und Umwandlung einer beliebigen Eingabe in ein für die Weiterverarbeitung brauchbares Format zuständig ist.[/quote]


----------



## norroy (14. Dez 2007)

Mein "Programm" sieht momentan so aus:

```
package Solitär;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solitär {

	char [][] spielfeld=new char[10][10];
	
	void menu(){
		System.out.println("Willkommen zum Solitär");
		System.out.println("Für ein neues Spiel drücken sie 'n'");
		InputStreamReader eingabestrom = new InputStreamReader (System.in); 
	    BufferedReader eingabepuffer = new BufferedReader (eingabestrom);    
	    try {
			String eingabe=eingabepuffer.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		if(eingabe="n"){
			spielfeldFuellen();
		}
	}
	
	void spielfeldFuellen(){
		teilArrayFuellen(0,0,'-');
		teilArrayFuellen(6,0,'-');
		teilArrayFuellen(0,6,'-');
		teilArrayFuellen(6,6,'-');
		teilArrayFuellen(3,0,'0');
		teilArrayFuellen(0,3,'0');
		teilArrayFuellen(3,3,'0');
		teilArrayFuellen(6,3,'0');
		teilArrayFuellen(3,6,'0');
	}
	
	void teilArrayFuellen(int x, int y, char zeichen){
		for(int i=0;i<9;i++){
			if(x==3 && y==3 && i==4){
				spielfeld[(i/3+x)][(i%3)+y]=' ';
			}
			else{
				spielfeld[(i/3+x)][(i%3)+y]=zeichen;
			}
		}
	}
	
	void arrayAusgeben(){
		for (int i=0; i<spielfeld.length;i++){
			for (int j=0; j<spielfeld.length;j++){
				System.out.print(spielfeld[i][j] + " ");
			}
			System.out.println(" ");
		}
	}
	
	void koordinatenLesen(){
		System.out.println("Bitte geben sie die Koordinaten des Ausgangspunktes und jene der Zielkooridate ein!");
		InputStreamReader eingabestrom = new InputStreamReader (System.in); 
	    BufferedReader eingabepuffer = new BufferedReader (eingabestrom);    
		try {
			String koordinaten = eingabepuffer.readLine();
		} catch (IOException e){
			e.printStackTrace();
		}
    	int koordinatenzahl = Character.getNumericValue(koordinaten.charAt(0))-9;
    	int koordinatenbuchstabe = Integer.parseInt(koordinaten.substring(1, 2));
    	if(spielfeld[koordinatenzahl-1][koordinatenbuchstabe-1]==0){
    		[koordinatenzahl-1][koordinatenbuchstabe-1]=' ';
            System.out.println(spielfeld[koordinatenzahl-1][koordinatenbuchstabe-1]);
         }else{
            System.out.println("Dieser Zug ist nicht möglich");
         }
	}
	
	public static void main(String[] args) {
		Solitär prg=new Solitär();
		prg.spielfeldFuellen();
		prg.arrayAusgeben();
	}
}
```

Allerdings kann das Programm nach dieser Anweisung...

```
InputStreamReader eingabestrom = new InputStreamReader (System.in); 
	    BufferedReader eingabepuffer = new BufferedReader (eingabestrom);    
	    try {
			String eingabe=eingabepuffer.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		if(eingabe="n"){
			spielfeldFuellen();
		}
```

...den String "eingabe" nicht mehr erkennen (Fehlermeldung: eingabe cannot be resolved). Das gleiche ein paar Zeile weiter unten mit dem String koordinaten. Kann mir jemand erklären wiso das so ist?


----------



## Schnitter (14. Dez 2007)

Löst zwar nicht dein Problem, aber da steht
if(eingabe="n")

sollte
if(eingabe == "n" ) heißen?


----------



## Wildcard (14. Dez 2007)

Auch das würde nicht funktionieren.
eingabe.equals("n")


----------



## Schnitter (14. Dez 2007)

```
package test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   char [][] spielfeld=new char[10][10];
   
   void menu(){
      System.out.println("Willkommen zum Solitär");
      System.out.println("Für ein neues Spiel drücken sie 'n'");
      String eingabe = "";
      InputStreamReader eingabestrom = new InputStreamReader (System.in);
       BufferedReader eingabepuffer = new BufferedReader (eingabestrom);   
       try {
         eingabe=eingabepuffer.readLine();
      } catch (IOException e) {
         e.printStackTrace();
      }
      if(eingabe.equals("n")){
         spielfeldFuellen();
      }
   }
   
   void spielfeldFuellen(){
      teilArrayFuellen(0,0,'-');
      teilArrayFuellen(6,0,'-');
      teilArrayFuellen(0,6,'-');
      teilArrayFuellen(6,6,'-');
      teilArrayFuellen(3,0,'0');
      teilArrayFuellen(0,3,'0');
      teilArrayFuellen(3,3,'0');
      teilArrayFuellen(6,3,'0');
      teilArrayFuellen(3,6,'0');
   }
   
   void teilArrayFuellen(int x, int y, char zeichen){
      for(int i=0;i<9;i++){
         if(x==3 && y==3 && i==4){
            spielfeld[(i/3+x)][(i%3)+y]=' ';
         }
         else{
            spielfeld[(i/3+x)][(i%3)+y]=zeichen;
         }
      }
   }
   
   void arrayAusgeben(){
      for (int i=0; i<spielfeld.length;i++){
         for (int j=0; j<spielfeld.length;j++){
            System.out.print(spielfeld[i][j] + " ");
         }
         System.out.println(" ");
      }
   }
   
   void koordinatenLesen(){
      System.out.println("Bitte geben sie die Koordinaten des Ausgangspunktes und jene der Zielkooridate ein!");
      InputStreamReader eingabestrom = new InputStreamReader (System.in);
       BufferedReader eingabepuffer = new BufferedReader (eingabestrom);   
       String koordinaten = "";
      try {
         koordinaten = eingabepuffer.readLine();
      } catch (IOException e){
         e.printStackTrace();
      }
       int koordinatenzahl = Character.getNumericValue(koordinaten.charAt(0))-9;
       int koordinatenbuchstabe = Integer.parseInt(koordinaten.substring(1, 2));
       if(spielfeld[koordinatenzahl-1][koordinatenbuchstabe-1]==0){
          spielfeld[koordinatenzahl-1][koordinatenbuchstabe-1]=' ';
            System.out.println(spielfeld[koordinatenzahl-1][koordinatenbuchstabe-1]);
         }else{
            System.out.println("Dieser Zug ist nicht möglich");
         }
   }
   
   public static void main(String[] args) {
      Main m = new Main();
      m.spielfeldFuellen();
      m.arrayAusgeben();
   }
}
```
So klappts bei mir.
Was für ne IDE benutzt du eigentlich?
Da waren Fehler drin, die mir Eclipse und Netbeans sofort anzeigen...

Aber ich hab' keine Ahnung, wie das weiter funktionieren soll. So klappts bisher...

Tipp:
In If-Abfragen deklarierte Variablen werden _Nicht immer_ deklariert. Deshalb musst du schreiben:

```
String a = "";
if(s.equals("m"))
    a="bla";
```


----------



## norroy (14. Dez 2007)

Ich benutze Eclipse, die Fehler wurden mir zwar angezeigt, jedoch wusste ich nicht, wie sie zu beheben waren


----------



## norroy (15. Dez 2007)

Nur noch zur Info: Das Programm funzt nun und sieht so aus:


```
package Solitär;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solitär {

	char [][] spielfeld=new char[12][12];
	
	void menu(){
		System.out.println("Willkommen zum Solitär");
		System.out.println("Zum Spiel beenden drücken sie 'q'");
		spielfeldFuellen();
		int isok = 1;
		while(isok == 1){
			arrayAusgeben();
			isok = koordinatenLesen();
		}
	}
	
	void spielfeldFuellen(){
		teilArrayFuellen(0,0,'-');
		teilArrayFuellen(6,0,'-');
		teilArrayFuellen(0,6,'-');
		teilArrayFuellen(6,6,'-');
		teilArrayFuellen(3,0,'0');
		teilArrayFuellen(0,3,'0');
		teilArrayFuellen(3,3,'0');
		teilArrayFuellen(6,3,'0');
		teilArrayFuellen(3,6,'0');
		
		spielfeld[10][0]='1';
		spielfeld[10][1]='2';
		spielfeld[10][2]='3';
		spielfeld[10][3]='4';
		spielfeld[10][4]='5';
		spielfeld[10][5]='6';
		spielfeld[10][6]='7';
		spielfeld[10][7]='8';
		spielfeld[10][8]='9';
		
		spielfeld[0][11]='A';
		spielfeld[1][11]='B';
		spielfeld[2][11]='C';
		spielfeld[3][11]='D';
		spielfeld[4][11]='E';
		spielfeld[5][11]='F';
		spielfeld[6][11]='F';
		spielfeld[7][11]='G';
		spielfeld[8][11]='H';
	}
	
	void teilArrayFuellen(int x, int y, char zeichen){
		for(int i=0;i<9;i++){
			if(x==3 && y==3 && i==4){
				spielfeld[(i/3+x)][(i%3)+y]=' ';
			}
			else{
				spielfeld[(i/3+x)][(i%3)+y]=zeichen;
			}
		}
	}
	
	void arrayAusgeben(){
		for (int i=0; i<spielfeld.length;i++){
			for (int j=0; j<spielfeld.length;j++){
				System.out.print(spielfeld[i][j] + " ");
			}
			System.out.println(" ");
		}
	}
	
	int koordinatenLesen(){
		System.out.println("Bitte geben sie die Koordinaten des Ausgangspunktes und jene der Zielkooridate ein!");
		InputStreamReader eingabestrom = new InputStreamReader (System.in); 
	    BufferedReader eingabepuffer = new BufferedReader (eingabestrom);    
	    String koordinaten="";
		try {
		koordinaten = eingabepuffer.readLine();
		} catch (IOException e){
			e.printStackTrace();
		}
		if (koordinaten.equals("q")) {
			return 0;
		}
		else  {
    	int origx = Character.getNumericValue(koordinaten.charAt(0))-9 -1;
    	int origy = Integer.parseInt(koordinaten.substring(1,2))-1;
    	int zielx = Character.getNumericValue(koordinaten.charAt(3))-9-1;
    	int ziely = Integer.parseInt(koordinaten.substring(4,5))-1;
   		int mittex=(origx + zielx)/2;
   	  	int mittey=(origy + ziely)/2;
		    	
    	
 		int ido = 1;
		if (spielfeld[origx][origy]==' '){
			ido = 0;
		}
 		if (spielfeld[zielx][ziely]=='0'){
			ido = 0;
		}
 		if (spielfeld[mittex][mittey]==' '){
			ido = 0;
		}
		if(ido==1){
			spielfeld[origx][origy]=' ';
   			spielfeld[mittex][mittey]=' ';
   			spielfeld[zielx][ziely]='0';	
     	}
    	else{
    		System.out.println("Dieser Zug ist nicht möglich");
    	}
		return 1;
		}

 	}
	
	public static void main(String[] args) {
		Solitär prg=new Solitär();
		prg.menu();
	}
}
```

Herzlichen Dank für euere Unterstützung


----------

