Mensch ärgere dich nicht

Faighter

Mitglied
Hallo zusammen,
ich brauch mal wieder eure Hilfe bzw. Verbesserungsvorschläge.

Das folgende Programm soll das Spiel Mensch ärgere dich nicht in vereinfachter Form durchführen.

Dies funktioniert auch perfekt. Allerdings ist das Programm noch nicht gerade perfekt.

So wird z.B. wenn Spieler 1 sich bereits ein Feld größer als 44 (oder auf dem Feld 44) befindet immer noch für Spieler 2 gewürfelt und gezogen, was ich schon versucht habe mit einer while schleife zu verhindern, was leider nicht funktionierte.

Java:
/**
 * 
 */

/**
 * @author Faighter
 *
 */
import java.util.*;
public class maedn {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int spieler1 = 0,spieler2 = 0,wuerfel= 0,wuerfel1 = 0,feld1,feld2;
		Random zufall;
		zufall = new Random();
		System.out.println("Willkommen");
		System.out.println("Dieses Spiel startet automatisch !");
		
			while(spieler1 < 44 && spieler2 <44){
			wuerfel= 1+zufall.nextInt(6);
			System.out.println("Spieler 1 hat eine " +wuerfel+  " gewürfelt");
			feld1 = spieler1;
			spieler1=spieler1+wuerfel;
			System.out.println("Spieler 1 war auf Feld "+feld1+ " und befindet sich nun auf Feld: "+spieler1);
			if (spieler1 == spieler2){
				spieler2 = 0;
			}
			
			//while(spieler1 < 44){
			wuerfel1 = 1+zufall.nextInt(6);
			System.out.println("Spieler 2 hat eine " +wuerfel1+  " gewürfelt");
			feld2 = spieler2;
			spieler2=spieler2+wuerfel1;
			System.out.println("Spieler 2 war auf Feld "+feld2+ " und befindet sich nun auf Feld: "+spieler2);
			if(spieler2 == spieler1){
				spieler1 = 0;
			} 
			//}
			if(spieler1 >= 44){
				System.out.print("Spieler 1 hat gewonnen");
			}else if(spieler2 >= 44){
				System.out.print("Spieler 2 hat gewonnen");	
			}
		
		}
		
	}

}

Außerdem wollte ich das Programm noch um folgende Funktionen erweitern:
  • Das Programm soll nur nachdem betätigen der Taste S starten (mit String)
  • Das Spiel soll nur beendet werden wenn genau das Feld 44 erreicht wird, alles was drüber geht soll ignoriert werden.

Leider habe ich momentan keine Ahnung wie ich den "Fehler" beheben und die Erweiterungen umsetzen soll bzw. meine bisherigen Versuche haben nicht funktioniert.

Ich hoffe ihr könnt mir helfen.

Solltet ihr noch weitere Verbesserungsvorschläge haben könnt ihr diese hier selbstverständlich auch einbringen.

mfg
 

Taggert

Mitglied
Na ja,

ich würde das Ganze Ding zwar anders machen, aber von Deinem Code ausgehend, musst Du ja nur einmal prüfen, ob der Spieler mit dem nächsten Zug genau auf die 44 kommen kann. Vom Gedankengang her also: ist spielerX auf einem feld zwischen Pos 38 und 43, dann kannst Du schauen, ob die Position + Würfelanzahl = 44 gibt, ansonsten muss er warten.

Ist doch gar nicht so schwer.

Dein Fehler liegt übrigens in der Bedingung der While-Schleife. Damit diese Abbricht müssen ja beide ins Ziel gekommen sein.

Ich hoffe ich konnte Dir helfen
 

Faighter

Mitglied
Danke, ich weiß selber nicht wie ich da nicht draufkommen konnte, habs inzwischen gelöst und noch nen bisschen erweitert.
Ich werde das erweiterte Programm gerne hier reinstellen sobald ich es fertig habe.

Dew Weiteren wurde ich von meinem Nebensitzer gefragt wo der Fehler in seinem Programm liegt. Allerdings finde ich ihn aber leider selber nicht, da er eher selten auftritt und meiner Meinung nach das Programm eigentlich keinen Fehler haben sollte.

Der Fehler tritt immer auf wenn Spieler2 rausgeworfen bzw. wieder auf Feld 0 gesetzt wurde und bisher nur wenn Spieler 1 auf einem Feld >30 landet.(kann auch sein das der Fehler auch auftritt wen Spieler1 auf einem Feld unter 30 steht)

Ich hofffe ihr könnt mir weiterhelfen.

Java:
  import java.util.*;
  public class maedn_v2_d {

  // Anfang Attribute
  // Ende Attribute


  // Anfang Methoden
  public static void main (String[] args) {
  Random zufall=new Random();
  Scanner tastatur;
  tastatur = new Scanner (System.in);
  int x, m, feld1, feld2, wuerfeln1, wuerfeln2, wuerfel1, wuerfel2, ueber1, ueber2;

  System.out.println("INFO");
  System.out.println("Fuer einen Wuerfelwurf die 0 druecken !");
  System.out.println("Spieler 1 kann das Spiel beenden, indem er statt 0 die 1 drueckt.");
  System.out.println("");
  feld1 = 0;
  feld2 = 0;
  x = 3;
  while (feld1<044 && feld2<44)   {
    x = 0;
    wuerfeln1 = 1;
    x = 3;
    System.out.println("Spieler 1");

    while (wuerfeln1 !=0) {
      wuerfeln1 = tastatur.nextInt();
      if (wuerfeln1 == 0) {
         wuerfeln1 = 0; }
      else {
         if (wuerfeln1 == 1) {
            wuerfeln1 = 0;
            x = 5;
            feld1 = 44;
            System.out.println("Sie haben das Spiel abgebrochen !"); }}}
            
    while (x != 5) {
      x = 5;
      m = 5;
      wuerfel1 = 1+zufall.nextInt(6);
      System.out.println("Gewuerfelte Zahl: " +wuerfel1);
      ueber1 = feld1 +wuerfel1;
      if (ueber1 > 44) {
         System.out.println("Sie haben Feld 44 ueberschritten, dieser Wurf wird nicht gewertet !");  }
      else {
         feld1 = feld1 + wuerfel1; }
      System.out.println("Sie stehen auf Feld Nr. " +feld1);
      if (feld1 == feld2) {
         feld2 = 0;
         System.out.println("Spieler 2 wurde auf Feld 0 zurueckgeschmissen !"); }
      System.out.println("");
      if (feld1 == 44) {
         System.out.println("Spieler 1 hat das Spiel gewonnen !!!"); }
      System.out.println("");
      while (feld1 < 44 && m == 5) {
         System.out.println("Spieler 2");
         wuerfeln2 = 1;
         while (wuerfeln2 != 0) {
            wuerfeln2 = tastatur.nextInt();
            if ( wuerfeln2 == 0) {
              wuerfeln2 = 0; }}
            wuerfel2 = 1+zufall.nextInt(6);
            System.out.println("Gewuerfelte Zahl: " +wuerfel2);
            ueber2 = feld2 + wuerfel2;
            if (ueber2 > 44) {
              System.out.println("Sie haben Feld 44 ueberschritten, dieser Wurf wird nicht gewertet !"); }
            else {
            feld2 = feld2 + wuerfel2; }
            System.out.println("Sie stehen auf Feld Nr. " +feld2);
            if (feld2 == feld1) {
              feld1 = 0;
              System.out.println("Spieler 1 wurde auf Feld 0 zurueckgeschmissen !"); }
            if (feld2 == 44) {
              System.out.println("Spieler 2 hat das Spiel gewonnen !!!"); }
            System.out.println("");
            m = 3;
  // Ende Methoden
             }}}}}

PS: Ich habe noch ne Frage an euch. Wie kann mann es am besten realisieren, dass das Programm erst Startet wenn die Taste S gedrückt wurde (ohne eingabe von S) Mit robot ?
 

Haave

Top Contributor
PS: Ich habe noch ne Frage an euch. Wie kann mann es am besten realisieren, dass das Programm erst Startet wenn die Taste S gedrückt wurde (ohne eingabe von S) Mit robot ?
Zumindest für Programme mit grafischer Oberfläche kann man da einen KeyListener benutzen. Bin aber nicht sicher, ob das bei reinen Konsolenprogrammen auch geht, da ich nicht wüsste, wer / welches Objekt mit dem KeyListener ausgestattet werden sollte (bei Swing z.B. wäre es ein JFrame).

Hab hier grad was gefunden, wo sich jemand einen eigenen KeyListener für die Konsole gebaut hat - vielleicht hilft dir das weiter: Java: Keylistener auf Konsolenebene / crusy.net
 

Faighter

Mitglied
Das hilft mir leider nicht weiter, dass dafür benötigte Package JLine verweigert auf meinem PC (Win7x64) leider komplett den Dienst, sprich dein Vorschlag funktioniert leider nicht.

Gibt es noch andere Möglichkeiten dies umzusetzten ?

Wenn das nicht möglich sein sollte, könntet ihr mir bitte sagen wie ich mein Programm am leichtesten auf eine grafische Oberfläche bringen könnte ? Würde dafür eigentlich JFrame reichen ?

Es handelt sich dabei um dieses Programm

Java:
import java.util.*;
public class maedn2 {

  // Anfang Attribute
  // Ende Attribute


  /**
   * @param args
   */

  // Anfang Methoden
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    int spieler1 = 0,spieler2 = 0,wuerfel= 0,wuerfel1 = 0,feld1,feld2;
    String x = "_";
    String y = "_";
    Random zufall;
    zufall = new Random();
    Scanner tastatur;
    tastatur= new Scanner(System.in);
    System.out.println("Willkommen");
    System.out.println("Dieses Spiel startet NICHT automatisch !");
    System.out.println("Bitte drücken Sie die Taste S um das Programm zu starten");
    x =tastatur.nextLine();
    while(x.toLowerCase().equals("s")){
     do{
      while(spieler1 < 44 && spieler2 <44){
      wuerfel= 1+zufall.nextInt(6);
      System.out.println("Spieler 1 hat eine " +wuerfel+  " gewürfelt");
      System.out.println(" ");
      
      feld1 = spieler1;
      spieler1=spieler1+wuerfel;
      System.out.println("Spieler 1 war auf Feld "+feld1+ " und befindet sich nun auf Feld: "+spieler1);
      System.out.println(" ");
      if (spieler1 == spieler2){
        spieler2 = 0;
      }
      
      if (spieler1 < 44){
      wuerfel1 = 1+zufall.nextInt(6);
      System.out.println("Spieler 2 hat eine " +wuerfel1+  " gewürfelt");
      System.out.println(" ");
      feld2 = spieler2;
      spieler2=spieler2+wuerfel1;
      System.out.println("Spieler 2 war auf Feld "+feld2+ " und befindet sich nun auf Feld: "+spieler2);
      System.out.println(" ");
      if(spieler2 == spieler1){
        spieler1 = 0;
      } 
      }
      if(spieler1 >= 44){
        System.out.println("Spieler 1 hat gewonnen");
      }else if(spieler2 >= 44){
        System.out.println("Spieler 2 hat gewonnen");
      }
      }
      
      spieler1 = 0;
      spieler2 = 0;
      
      do{
       System.out.println("Wollen sie weiterspielen ? (Y|N)");
       y =tastatur.nextLine();
      } while(!(y.toLowerCase().equals("y") || y.toLowerCase().equals("n")));

      if(y.toLowerCase().equals("n")) {
        System.exit(0);
      }

     }while(y.toLowerCase().equals("y"));
    } 
  }
  // Ende Methoden

}

Ich erwarte nicht das ihr mir das Programm anpasst, es soll nur als Grundlage für eure Überlegungen dienen.

PS. Das Problem meines Kumpels konnte ich inzwischen lösen. Es war in einer if Bedingung eine 0 wo sie nicht hingehörte.

mfg
 

Ähnliche Java Themen


Oben