Erste Schritte Kontrolle Code

DerStefan871

Mitglied
Hallo zusammen,

ich lerne gerade mit dem Buch "Grundkurs Programmieren in Java".
Ursprüngliche Aufgabe - Der Spieler soll eine Zahl eingeben und das Programm soll prüfen, ob diese innerhalb der Range liegt.
Nun habe ich das Programm etwas erweitert ->
Begrüßung, Festlegung der Range durch den Spieler, Prüfung der Eingabe (ob innerhalb der Range) und dann, ob die gesuchte Zahl gefunden wurde.
Soweit funktioniert alles, nur würde ich mich freuen, wenn kurz jemand einen Blick drüber wirft, ob der Code soweit auch "sauber" ist oder ob man es hätte besser schreiben können.
Möchte nicht gleich zu Beginn "unsauberen Code" einstudieren 🙂

Java:
import static Prog1Tools.IOTools.*;
public class Ratespiel {

    public static void main(String[] args) {
           
        int oberwert, unterwert, eingabe, i, geheimeZahl, range;
        String name;
       
        System.out.println("Eingabe der Parameter");
        name = readString("\nBitte Namen eingeben: ");
        unterwert = readInteger("Eingabe des unteren Werts: ");   
        oberwert = readInteger("Eingabe des oberen Werts: ");
       
        System.out.println("\nHallo "+name+", wir berechnen nun die Zufallszahl zwischen "+unterwert+" und "+oberwert+". Bitte raten");
       
        range = (oberwert - unterwert)+1;       
        geheimeZahl = (int) (Math.random()*range)+unterwert;
                       
        i = 0;
        do {
        //Kontrolle der Eingabe
            boolean abbruch = false;
            do {
                eingabe = readInteger("\nDein Tipp: ");
                if (eingabe < unterwert ||  eingabe > oberwert)System.out.println("Außerhalb des zulässigen Bereichs. Bitte erneut eingeben");
                else {abbruch = true;}               
            } while (!abbruch);
       
            //Prüfung der Eingabe und der geheimenZahl
                        i++;
                System.out.println("\n"+i+". Versuch: "+eingabe);
            if (eingabe > geheimeZahl)
                System.out.println("Die gesuchte Zahl ist kleiner. Bitte erneut raten");
            if (eingabe < geheimeZahl)
                System.out.println("Die gesuchte Zahl ist größer. Bitte erneut raten");
        } while (eingabe != geheimeZahl);
               
        System.out.println("Glückwunsch. Die Zahl "+eingabe+" wurde beim "+i+". Versuch getroffen");
               
    }
}

VG Stefan
 
readInteger kommt woher?
Der Autoren des Buches bieten eigene Tools für das Buch an. http://www.grundkurs-java.de/index.php/software-und-infos/links-und-infos

@DerStefan871 An deiner Stelle würde ich mich gleich in die Entwickler-Bibliothek einlesen, natürlich wenn du dazu bereits in der Lage bist, denn diese Tools findest du außerhalb des Buches nirgendwo..

Die Klasse Scanner wäre hier der Kandidat für dein Vorhaben.
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
 
Das ist noch nicht sehr gut, aber etwas besser:
Java:
class RangeRaten {
    final Scanner eingabe = new Scanner(System.in);

    public static void main(String[] args) {
        int i = 0; // das muss irgendwo stehen

        RangeRaten r = new RangeRaten();
        r.ausgabe("Willkommen bei ?. Zuerst Parametereingabe bitte...");
        int
                oberwert = r.eingabeInt("Oberwert"),
                unterwert = r.eingabeInt("Unterwert");
        String
                name = r.eingabeString("Name");
        r.ausgabe("Das Spiel beginnt");
         int geheimzahl = (int) (Math.random() * (oberwert - unterwert + 1)) + unterwert;
        Integer eingabe = null; // Diese Schleife soll in einer Methode stehen!
        while (eingabe == null || eingabe != geheimzahl) {
            eingabe = r.eingabeInt("Dein Tipp bitte");
            if (eingabe < geheimzahl) {
                r.ausgabe("Die gesuchte Zahl ist größer");
            } else if (eingabe > geheimzahl) {
                r.ausgabe("Die gesuchte Zahl ist kleiner");
            } else {

            }

            i++; // das muss irgendwo stehen
        }
        r.ausgabe("Glückwunsch, Geheimzahl " + geheimzahl + " mit " + i + " Versuch(en) gefunden!!!");
    }

    void ausgabe(String nachricht) {
        System.out.println(nachricht);
    }

    String eingabeString(String nachricht) {
        System.out.print(nachricht + ": ");
        return eingabe.nextLine();
    }

    int eingabeInt(String nachricht) {
        System.out.print(nachricht + ": ");
        return eingabe.nextInt();
    }
}

@thecain Danke für en Hinweis!

@Javinner Das Buch ist in meinen Augen "grauenvoll". 🙁
 
DOCH NICHT!!!! Ich habe das Buch mit einem anderem, ähnlichen Buch verwechselt! Das Buch ist doch nicht grauenvoll!

Da ich es aber nicht habe, kann ich keine Aussage dazu treffen. 🙄
 
@tommysenf Was heißt die Logik passt nicht mehr? Die Logik (oben) war redundant.

Aber jetzt Mal im Allgemeinen, siehe bitte Post #2. Methoden sind angebracht....

Der Rest ist in Ordnung. Aber wenn du mir jetzt sagst, Methoden sind zu dem Zeitpunkt noch nicht behandelt, dann darf er auch nicht static importen, mMn....

Prüfung der Softwarequalität und Refactoring ist da teuer - zumal ich das Buch nicht kenne.
 
zumal ich das Buch nicht kenne.
An der Stelle sollte @DerStefan871 eventuell in Zukunft sich auf ein bestimmtes Kapitel beziehen, so dass man nachschauen kann, wo er gerade steckt 😉
Was die Methoden anbelangt, so haben die Vorredner recht, wenn die meinen, dass diese den Code besser machen würden. Als Beispiel einer möglichen Umsetzung:
Java:
private static boolean biggerThanRandomNumber(int randomNumber, int userInput)
{
        return userInput > randomNumber;
}

private static boolean lowerThanRandomNumber(int randomNumber, int userInput)
{
        return userInput < randomNumber;
}
Jetzt sollte man dies in die Abfrage einbauen:
Java:
do
      {
               //Dein Code
                if (biggerThanRandomNumber(randomNumber, userInput))
                {
                    //...
                } else if (lowerThanRandomNumber(randomNumber, userInput))
                {
                   //...
                } else
                {
                   //...
                }
     } while (!inGame && attempt < MAX_ATTEMPT);
 
@Javinner sehr guter tipp; ich habe mir nur Tage nach dem ich mein "Programmieren lernen mit Java" in der Post hatte die "2ten Inseln" zu Java 8 und 9 gekauft weil ich wissen wollte was es wo alles gibt ... als hobby coder nach aussen totaler overkill aber mich macht das lernen mit jeder weiteren zeile code mehr und mehr neugierig ... geile sache ...
 
Ihr seid ja spitze - danke für eure Antworten 🙂

Bin in dem Buch noch relativ am Anfang und wollte mich mit der do-Schleife auseinandersetzen. Methoden, Klassen etc. wurden noch gar nicht wirklich behandelt, kommt nun aber dran 😉
Nächstes mal liefer ich dann auch das Kapitel mit und schau mir die Eingabe mit dem Scanner-Tool an.
 
Java:
import static Prog1Tools.IOTools.*;
public class Ratespiel {

    public static void main(String[] args) {
     
        // Deklaration von Variablen möglichst erst wenn sie auch benötigt werden
        System.out.println("Eingabe der Parameter");
        String name = readString("\nBitte Namen eingeben: ");
        int unterwert = readInteger("Eingabe des unteren Werts: ");
        int oberwert = readInteger("Eingabe des oberen Werts: ");
   
        System.out.println("\nHallo "+name+", wir berechnen nun die Zufallszahl zwischen "+unterwert+" und "+oberwert+". Bitte raten");
   
        int geheimeZahl = zufallszahlImBereich(obergrenze, untergrenze);
                   
        int i = 0;
        do {
            //abbruch war ein schlechter name für die Variable, weil sie das falsche suggeriert
            boolean korrekteEingabe = false;
            do {
                eingabe = readInteger("\nDein Tipp: ");
                if (eingabe < unterwert ||  eingabe > oberwert) { 
                      System.out.println("Außerhalb des zulässigen Bereichs. Bitte erneut eingeben");
                } else { 
                      korrekteEingabe = true;
                }          
            } while (! korrekteEingabe);
 
            i++;
            System.out.println("\n"+i+". Versuch: "+eingabe);
       
            // Die Verzweigungen immer in einen Block setzen und wenn möglich else verwenden
            if (eingabe > geheimeZahl) {
                System.out.println("Die gesuchte Zahl ist kleiner. Bitte erneut raten");
            } else if (eingabe < geheimeZahl) {
                System.out.println("Die gesuchte Zahl ist größer. Bitte erneut raten");
            }
        } while (eingabe != geheimeZahl);
           
        System.out.println("Glückwunsch. Die Zahl "+eingabe+" wurde beim "+i+". Versuch getroffen");
           
    }
 
    private static int zufallszahlImBereich(int obergrenze, int untergrenze) {
        int range = (oberwert - unterwert)+1;  
        return  (int) (Math.random()*range)+unterwert;
    }
 
}
 
Zuletzt bearbeitet:
Was heißt die Logik passt nicht mehr? Die Logik (oben) war redundant.
Ich kann da keine Redundanz erkennen. Du hast aber einfach die Bereichsprüfung der Eingabe weggelassen auch der leere else Block und die Vergewaltigung der while Schleife in deiner Variante sind in meinen Augen gröbere Schnitzer als im Originalpost

biggerThanRandomNumber
An sich sind deine Ausführungen richtig, allerdings diese Funktion ein Beispiel dafür wo man es genau nicht machen sollte. Hier wird kein Mehrwert erreicht, sondern die Lesbarkeit sogar eher verschlechtert.
 
Zuletzt bearbeitet:
Ich kann da keine Redundanz erkennen.
Wieso schreibst du dann hier? Post #14 ist genau so unnützer Ballast wie der Rest deines nachfolgenden Beitrags.

Da sind zwei unnütze geschachtelte Schleifen in einer Schleife - also, ich schmeiße die sofort raus.

Versteh mich nicht falsch, bevor man kritisiert sollte man wissen was und wen man kritisiert.

Klar?
 

Zurück
Oben