Solitär

Status
Nicht offen für weitere Antworten.

norroy

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

Illuvatar

Top Contributor
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! :D
 

The_S

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

norroy

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

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

Code:
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
Code:
//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

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

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

SlaterB

Gast
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

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

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

norroy

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

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


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

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

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

Aktives Mitglied
Mein "Programm" sieht momentan so aus:
Code:
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...
Code:
		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

Bekanntes Mitglied
Code:
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:
Code:
String a = "";
if(s.equals("m"))
    a="bla";
 

norroy

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

norroy

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

Code:
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben