Vereinfachung dieses Programms

  • Themenstarter Themenstarter Destiny1985
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

Destiny1985

Gast
Ich habe mal zur Übung ein Schere-Stein-Papier Speil gebastelt. Zum Code, den ihr etwas weiter unten findet, folgende Frage:

Die Ausgabe der Zwischenstände erfolgt ja nach jeder Runde. Also hab ich den Code in jeder Möglichkeit, die die switch-Abfrage bietet, mit drin. Das sind aber jedesmal 4 Zeilen, bei 9 Möglichkeiten also 36 Zeilen Quelltext nur dafür...das ist ein bißchen viel. Bin beim Lernen gerade beim Thema Felder. Weiss also noch nicht wie ich das anders lösen kann. Meines wissens nach müsste es aber doch gehen diesen Code auszulagern und dann zb über ne Zeile wie
Code:
Zwischenstand();
oder ähnlich aufzurufen ? Kann mit jemand erklären und zeigen wie ich so etwas lösen kann ?
Hier der komplette Quelltext:
Code:
import Prog1Tools.IOTools;

public class SchereSteinPapier2
{
  public static void main(String[] args)
  {
    int zufallsWert = 0;
    final short schere = 1;
    final short stein  = 2;
    final short papier = 3;
    boolean ende = false;
    int zaehlerNiederlage = 0;
    int zaehlerSieg = 0;
    int zaehlerUnentschieden = 0;
    
    while (!ende)
    {
      System.out.println("\n[1] - Schere");
      System.out.println("[2] - Stein");
      System.out.println("[3] - Papier");
      System.out.println("\n[4] - Programm beenden");
      System.out.print("\nSie waehlen: ");

      int auswahl = IOTools.readInteger();

      int zufallsZahl = (int)(3 * Math.random() + 1);

      switch ( auswahl )
      {
        case 1 :
        {
          if (zufallsZahl == 1)
          {
            System.out.println("\n=== Schere trifft auf Schere ===");
            zaehlerUnentschieden += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 2)
          {
            System.out.println("\n--- Schere verliert gegen Stein ---");
            zaehlerNiederlage += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 3)
          {
            System.out.println("\n+++ Schere gewinnt gegen Papier +++");
            zaehlerSieg += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          break;
        }
        case 2 :
        {
          if (zufallsZahl == 1)
          {
            System.out.println("\n+++ Stein gewinnt gegen Schere +++");
            zaehlerSieg += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 2)
          {
            System.out.println("\n=== Stein trifft auf Stein ===");
            zaehlerUnentschieden += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 3)
          {
            System.out.println("\n--- Stein verliert gegen Papier ---");
            zaehlerNiederlage += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          break;
        }
        case 3 :
        {
          if (zufallsZahl == 1)
          {
            System.out.println("\n--- Papier verliert gegen Schere ---");
            zaehlerNiederlage += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 2)
          {
            System.out.println("\n+++ Papier gewinnt gegen Stein +++");
            zaehlerSieg += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          if (zufallsZahl == 3)
          {
            System.out.println("\n=== Papier trifft auf Papier ===");
            zaehlerUnentschieden += 1;
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
          }
          break;
        }
        case 4 :
        {
          System.out.println("\n=+- Programmende -+=");
          System.out.println("\nSie beenden das Spiel mit");
          System.out.println();
          System.out.println(zaehlerSieg + " Siegen");
          System.out.println(zaehlerUnentschieden + " Unentschieden und");
          System.out.println(zaehlerNiederlage + " Niederlagen");
          ende = true;
          break;
        }
        default :
        {
          System.out.println("\nEingabefehler! 1 - 4 sind moegliche Eingaben");
          break;
        }
      }
    }
  }
}
 
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;


public class SchereSteinPapier2
{
    private boolean ende = false;

    private int zaehlerNiederlage = 0;

    private int zaehlerSieg = 0;

    private int zaehlerUnentschieden = 0;

    private Map gameStates;

    public SchereSteinPapier2()
    {
        this.initGameStates();
        this.startGame();
    }

    private void initGameStates()
    {
        this.gameStates = new HashMap();
        this.gameStates.put(new GameState(1, 1), "\n=== Schere trifft auf Schere ===");
        this.gameStates.put(new GameState(1, 2), "\n--- Schere verliert gegen Stein ---");
        this.gameStates.put(new GameState(1, 3), "\n+++ Schere gewinnt gegen Papier +++");

        this.gameStates.put(new GameState(2, 1), "\n+++ Stein gewinnt gegen Schere +++");
        this.gameStates.put(new GameState(2, 2), "\n=== Stein trifft auf Stein ===");
        this.gameStates.put(new GameState(2, 3), "\n--- Stein verliert gegen Papier ---");

        this.gameStates.put(new GameState(3, 1), "\n--- Papier verliert gegen Schere ---");
        this.gameStates.put(new GameState(3, 2), "\n+++ Papier gewinnt gegen Stein +++");
        this.gameStates.put(new GameState(3, 3), "\n=== Papier trifft auf Papier ===");

    }

    private void checkResult(int computer, int human)
    {
        Object ret = this.gameStates.get(new GameState(computer, human));
        if (ret == null)
        {
            System.out.println("Error: Unknown Gamestate comp: " + computer + " human " + human);
        }
        else
        {
            System.out.println(ret);
        }
    }

    private void startGame()
    {

        while (!ende)
        {
            System.out.println("\n[1] - Schere");
            System.out.println("[2] - Stein");
            System.out.println("[3] - Papier");
            System.out.println("\n[4] - Programm beenden");
            System.out.print("\nSie waehlen: ");

            int auswahl = readInteger();

            int zufallsZahl = (int) (3 * Math.random() + 1);

            if ((auswahl > 0) && (auswahl < 5))
            {
                this.checkResult(zufallsZahl, auswahl);
                System.out.println("\nAktueller Stand:");
                System.out.print("\nSiege: " + zaehlerSieg);
                System.out.print("   Unentschieden: " + zaehlerUnentschieden);
                System.out.println("   Niederlagen: " + zaehlerNiederlage);
            }
            else if (auswahl == 4)
            {
                System.out.println("\n=+- Programmende -+=");
                System.out.println("\nSie beenden das Spiel mit");
                System.out.println();
                System.out.println(zaehlerSieg + " Siegen");
                System.out.println(zaehlerUnentschieden + " Unentschieden und");
                System.out.println(zaehlerNiederlage + " Niederlagen");
                ende = true;
            }
            else System.out.println("\nEingabefehler! 1 - 4 sind moegliche Eingaben");
        }
    }

    private int readInteger()
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try
        {
            return Integer.parseInt(br.readLine());
        }
        catch (NumberFormatException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return -1;
    }

    public static void main(String[] args)
    {
        new SchereSteinPapier2();
    }
}


class GameState
{
    private int computer, human;

    public GameState(int computer, int human)
    {
        this.computer = computer;
        this.human = human;
    }

    public boolean equals(Object obj)
    {
        if (obj instanceof GameState)
        {
            GameState g = ((GameState) obj);
            if ((g.getComputer() == this.getComputer()) && (g.getHuman() == this.getHuman()))
            {
                return true;
            }
        }
        return false;
    }

    public int getComputer()
    {
        return this.computer;
    }

    public int getHuman()
    {
        return this.human;
    }
    
    public int hashCode()
    {
        String s = this.computer +"" + this.human;
        return Integer.parseInt( s );
    }
}
 
thx für die lösung, glaub dir auch gerne das das so funktioniert...aber kapier die hälfte von dem code nicht, da ich soweit noch nicht bin *g*

es ging mir darum anhand meines Quelltextes aufzuzeigen, wie man dieses sich immer wiederholende auslagern kann...

mfg
 
du brauchst z.b. den code
Code:
            System.out.println("\nAktueller Stand:");
            System.out.print("\nSiege: " + zaehlerSieg);
            System.out.print("   Unentschieden: " + zaehlerUnentschieden);
            System.out.println("   Niederlagen: " + zaehlerNiederlage);
schonmal nicht in jeder switch abfrage reinhauen... es würde reichen einmal am Ende das zu tun.

Ansonsten ist foobars Ansatz schon zu empfehlen -> eigene Klasse 😉

edit: ui - WoW Zocker :applaus:
 
thx für die lösung, glaub dir auch gerne das das so funktioniert...aber kapier die hälfte von dem code nicht, da ich soweit noch nicht bin *g*
Was verstehst du denn nicht?

es ging mir darum anhand meines Quelltextes aufzuzeigen, wie man dieses sich immer wiederholende auslagern kann...
Ich habe mich schon bemüht so wenig wie möglich zu verändern.
 
ja eigene klasse...ok sowas schwebte mir auch vor nur kann ich noch keine eigenen klassen schreiben ^^ und das mieste von foobars code kenne ich noch nicht, kann demzufolge nicht damit umgehen und demzufolge versteh ich es nicht 😉

World of Warcraft ist der Hammer 🙂 Spiele gerade Final Beta und freu mich riiiiesig auf die Release-Version...btw: suche noch eine Gilde *smile*

Also es wäre nett wenn man in dem Stil, in dem mein Prog geschrieben ist, mir mal jemand so eine Klasse schreiben könnte und mir kurz erklärt, wie ich die händeln kann 🙂

lg
 
ja eigene klasse...ok sowas schwebte mir auch vor nur kann ich noch keine eigenen klassen schreiben
Na dann wirds aber Zeit 🙂

World of Warcraft ist der Hammer icon_smile.gif Spiele gerade Final Beta und freu mich riiiiesig auf die Release-Version...btw: suche noch eine Gilde *smile*
Weniger spielen und mehr programmieren, dann klappts auch mit den eigenen Klassen ;-)

Lies dir das Kapitel durch, dann wirst du keine Probleme mehr haben.
 
aber ist der begriff klasse hier nicht falsch ?

klassen sind doch so selbstdefinierte Datentypen...über was wir reden sind methoden oder ?

mfg
 
Hab mal gerad ganz schnell das allergröbste kommentiert....hab leider keine zeit für mehr.

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;


public class SchereSteinPapier2
{
	private boolean ende = false;
	private int zaehlerNiederlage = 0;
   private int zaehlerSieg = 0;
   private int zaehlerUnentschieden = 0;
   private Map gameStates;

	/*
	* Konstruktor der Klasse SchereSteinPapier2
	*/
   public SchereSteinPapier2()
   {
       this.initGameStates();
       this.startGame();
   }

	/*
	* Hier wird die HashMap mit Werten "gefüttert", achte dabei auf den
	* Einsatz von new GameState(..)
	*/
    private void initGameStates()
    {
        this.gameStates = new HashMap();
        this.gameStates.put(new GameState(1, 1), "\n=== Schere trifft auf Schere ===");
        this.gameStates.put(new GameState(1, 2), "\n--- Schere verliert gegen Stein ---");
        this.gameStates.put(new GameState(1, 3), "\n+++ Schere gewinnt gegen Papier +++");

        this.gameStates.put(new GameState(2, 1), "\n+++ Stein gewinnt gegen Schere +++");
        this.gameStates.put(new GameState(2, 2), "\n=== Stein trifft auf Stein ===");
        this.gameStates.put(new GameState(2, 3), "\n--- Stein verliert gegen Papier ---");

        this.gameStates.put(new GameState(3, 1), "\n--- Papier verliert gegen Schere ---");
        this.gameStates.put(new GameState(3, 2), "\n+++ Papier gewinnt gegen Stein +++");
        this.gameStates.put(new GameState(3, 3), "\n=== Papier trifft auf Papier ===");

    }

    private void checkResult(int computer, int human)
    {
        Object ret = this.gameStates.get(new GameState(computer, human));
        if (ret == null)
        {
            System.out.println("Error: Unknown Gamestate comp: " + computer + " human " + human);
        }
        else
        {
            System.out.println(ret);
        }
    }

    private void startGame()
    {
		/*
		*  Solange der User das Programm noch nicht beendet hat (Durch Eingabe von 4...
		*/ 
		
		/*
		* Frage: Warum nicht ne do...while Schleife? Wäre doch predisziniert für solche Anwendungs
		* zwecke...
		*/
        while (!ende)
        {
            System.out.println("\n[1] - Schere");
            System.out.println("[2] - Stein");
            System.out.println("[3] - Papier");
            System.out.println("\n[4] - Programm beenden");
            System.out.print("\nSie waehlen: ");

            int auswahl = readInteger();

				/* 
				* Erzeugung einer Zufallszahl
				* Schau dir mal die Klasse random() an
				*/
            int zufallsZahl = (int) (3 * Math.random() + 1);

            if ((auswahl > 0) && (auswahl < 5))
            {
                this.checkResult(zufallsZahl, auswahl);
                System.out.println("\nAktueller Stand:");
                System.out.print("\nSiege: " + zaehlerSieg);
                System.out.print("   Unentschieden: " + zaehlerUnentschieden);
                System.out.println("   Niederlagen: " + zaehlerNiederlage);
            }
            else if (auswahl == 4)
            {
	            /*
	            * Jetzt wird nochmal ne kleine "Statistik" ausgegeben, bevor das Programm
	            * beendet wird -> ende = true führt dazu das die while() Schleife abbricht
	            */
                System.out.println("\n=+- Programmende -+=");
                System.out.println("\nSie beenden das Spiel mit");
                System.out.println();
                System.out.println(zaehlerSieg + " Siegen");
                System.out.println(zaehlerUnentschieden + " Unentschieden und");
                System.out.println(zaehlerNiederlage + " Niederlagen");
                ende = true;
            }
            else System.out.println("\nEingabefehler! 1 - 4 sind moegliche Eingaben");
        }
    }

	/* 
	* Diese Methode liest von der Standard-Eingabe etwas ein und gibt
	* den int-Wert davon zurück.
	*/
    private int readInteger()
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try
        {
            return Integer.parseInt(br.readLine());
        }
        catch (NumberFormatException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return -1;
    }

    public static void main(String[] args)
    {
        new SchereSteinPapier2();
    }
}


class GameState
{
    private int computer, human;

	/* Konstruktor der Klasse GameState.
	* Die Attribute werden mit den übergebenen Werten initialisiert.
	* Achte dabei auf den Einsatz von this.<name> = <name>
	*/
    public GameState(int computer, int human)
    {
        this.computer = computer;
        this.human = human;
    }

	/*
	* Die Methode equals wird überschrieben - diese wird automatisch von Object an alle andern
	* Klassen vererbt 
	*/
    public boolean equals(Object obj)
    {
        if (obj instanceof GameState)
        {
            GameState g = ((GameState) obj);
            if ((g.getComputer() == this.getComputer()) && (g.getHuman() == this.getHuman()))
            {
                return true;
            }
        }
        return false;
    }

	/*
	* Da computer u. human private sind, hast du von aussen keinen direkten Zugriff auf die 
	* Variablen. Deshalb müssen entsprechende get Methoden geschrieben werden.
	*/
    public int getComputer()
    {
        return this.computer;
    }

    public int getHuman()
    {
        return this.human;
    }
   
    public int hashCode()
    {
        String s = this.computer +"" + this.human;
        return Integer.parseInt( s );
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben