Wie könnte man diesen Code kürzer machen ?

asasasasas

Mitglied
Hangman
Java:
public class hangiman {
    public static void main(String[] args) {
        System.out.println("Starting game");

        String notUsed = "abcdefghijklmnopqrstuvwxyz";

        String[] words = new String[]{"computer", "mouse", "screen", "display", "language"};

        String randomWord = words[(int) (Math.random() * words.length)];

        System.out.println("The word has " + randomWord.length() + " letters.");

        char[] letters = new char[randomWord.length()];

        Arrays.fill(letters, '.');
        int lives = 3;

        Scanner scanner = new Scanner(System.in);

        while (lives > 0) {
            System.out.print("Lives: ");

            for (int i = 0; i < lives; i++) {
                System.out.print("♥");
            }
            System.out.println();

            System.out.println("Input: ");

            String input = scanner.nextLine();

            char letter = input.charAt(0);


            boolean isGuessCorrect = false;
            for (int i = 0; i < randomWord.length(); i++) {
                char l = randomWord.charAt(i);

                if (l == letter) {
                    letters[i] = l;
                    isGuessCorrect = true;
                }
            }
            if (!isGuessCorrect) {
                lives = lives - 1;
            }
            boolean isGameFinished = true;

            System.out.print("Word: ");


            for (char c : letters) {
                if (c == '.') {
                    isGameFinished = false;
                }
                System.out.print(c);
            }
            System.out.println();

            notUsed = notUsed.replace(letter, '.');
            System.out.println("Not used " + notUsed);

            System.out.println("----------------------------------");

            if (isGameFinished) {
                System.out.println("You won!");
                break;
            }
        }
        if (lives == 0) {
            System.out.println("You lost! The word was: " + randomWord);
        }
        System.out.println("Exiting game");
    }
}
 

Arrive5784

Aktives Mitglied
Sorry, bin nicht gut im Kreativ sein, aber so wäre es sauberer:

Java:
import java.util.Random;
import java.util.Scanner;

public class Hangiman {
    private static final String[] words = {"eins", "zwei", "drei"};
    private final Random ran = new Random();
    private String toGuess;
    private StringBuilder toGuessHidden;
    private int lives;

    public void newGame() {
        toGuess = words[ran.nextInt(words.length)];
        toGuessHidden = new StringBuilder(repeatChar('.', toGuess.length()));
        lives = 3;
        boolean won = false;
        while (lives > 0 && !toGuess.contentEquals(toGuessHidden)) {
            won = guess();
        }
        if (won) {
            System.out.println("You won. :)");
        } else {
            System.out.println("You lost. :(");
        }
        System.out.println("The word was: " + toGuess);
        System.out.println("Lives: " + repeatChar('♥', lives));
    }

    public boolean guess() {
        if (lives > 0) {
            System.out.println("Live: " + repeatChar('♥', lives));
            System.out.println("Word: " + toGuessHidden);
            System.out.println("Please insert the char you want:");
            char ch = new Scanner(System.in).nextLine().charAt(0);
            int c = 0;
            for (int i = 0; i < toGuess.length(); i++) {
                if (toGuessHidden.charAt(i) == '.' && toGuess.charAt(i) == ch) {
                    c++;
                    toGuessHidden.setCharAt(i, ch);
                }
            }
            if (c == 0) {
                System.out.println("Sorry, You haven't guessed the character.");
                lives--;
                return false;
            } else {
                System.out.println("Wow, You have guessed the character " + c + " times. =)");
                return true;
            }
        } else {
            System.out.println("I'm sorry, the game is over.");
            return false;
        }
    }

    public String repeatChar(char ch, int times) {
        return new String(new char[times]).replace('\0', ch);
    }

    public static void main(String[] args) {
        Hangiman hangiman = new Hangiman();
        hangiman.newGame();
    }
}

Und weniger Zeilen. =)
 

KonradN

Super-Moderator
Mitarbeiter
Diese Strukturierung geht schon in die richtige Richtung und die kann man noch deutlich weiter treiben und weiter umstrukturieren.

So eine if else Struktur, wie in guess() gefällt mir in der Regel nicht. Das if kann man umdrehen und als reine Abbruchbedingung führen, also ein:
Java:
if (lives == 0) {
    System.out.println("I'm sorry, the game is over.");
    return false;
}

Das reduziert die Einrücktiefe und ist besser lesbar (in meinen Augen), weil das Pattern immer gleich ist mit
1. Abbruchbedingungen
2. eigentliches doing.

Die Lesbarkeit wird auch oft besser, wenn Bedingungen formuliert werden. if (!hasLivesLeft()) oder so.

Dann arbeite ich gerne noch mehr mit Instanzvariablen. Denkbar ist also ein state oder gameState vom Typ GameState das ein Enum ist mit ONGOING, WON, LOST oder so. Aber das braucht man nicht zwingend. Aber man kann so Prüfungen deutlich besser über eine Methode machen. Die while Schleife wäre dann einfach etwas wie:
Java:
while (isGameOngoing()) {
    guess();
}

Wobei guess nicht selbst rät weshalb meiner Meinung nach ein besserer Name her müsste.
 

osion

Bekanntes Mitglied
Sorry, bin nicht gut im Kreativ sein, aber so wäre es sauberer:

Java:
import java.util.Random;
import java.util.Scanner;

public class Hangiman {
    private static final String[] words = {"eins", "zwei", "drei"};
    private final Random ran = new Random();
    private String toGuess;
    private StringBuilder toGuessHidden;
    private int lives;

    public void newGame() {
        toGuess = words[ran.nextInt(words.length)];
        toGuessHidden = new StringBuilder(repeatChar('.', toGuess.length()));
        lives = 3;
        boolean won = false;
        while (lives > 0 && !toGuess.contentEquals(toGuessHidden)) {
            won = guess();
        }
        if (won) {
            System.out.println("You won. :)");
        } else {
            System.out.println("You lost. :(");
        }
        System.out.println("The word was: " + toGuess);
        System.out.println("Lives: " + repeatChar('♥', lives));
    }

    public boolean guess() {
        if (lives > 0) {
            System.out.println("Live: " + repeatChar('♥', lives));
            System.out.println("Word: " + toGuessHidden);
            System.out.println("Please insert the char you want:");
            char ch = new Scanner(System.in).nextLine().charAt(0);
            int c = 0;
            for (int i = 0; i < toGuess.length(); i++) {
                if (toGuessHidden.charAt(i) == '.' && toGuess.charAt(i) == ch) {
                    c++;
                    toGuessHidden.setCharAt(i, ch);
                }
            }
            if (c == 0) {
                System.out.println("Sorry, You haven't guessed the character.");
                lives--;
                return false;
            } else {
                System.out.println("Wow, You have guessed the character " + c + " times. =)");
                return true;
            }
        } else {
            System.out.println("I'm sorry, the game is over.");
            return false;
        }
    }

    public String repeatChar(char ch, int times) {
        return new String(new char[times]).replace('\0', ch);
    }

    public static void main(String[] args) {
        Hangiman hangiman = new Hangiman();
        hangiman.newGame();
    }
}

Und weniger Zeilen. =)

Hier könnte man ein short if verwenden
Java:
        if (won) {
            System.out.println("You won. :)");
        } else {
            System.out.println("You lost. :(");
        }

Man könnte die Strings auch auslagern und hier das else weglassen.
Code:
            if (c == 0) {

                System.out.println("Sorry, You haven't guessed the character.");

                lives--;

                return false;

            } else {

                System.out.println("Wow, You have guessed the character " + c + " times. =)");

                return true;

            }

Könnte man zusammen nehmen:
Code:
       System.out.println("The word was: " + toGuess);
        System.out.println("Lives: " + repeatChar('♥', lives));

Der Code sieht sicher einiges Lesbarer aus und strukturierter, als der ursprüngliche aus.
 

Arrive5784

Aktives Mitglied
Meinst du das so?

Java:
import java.util.Random;
import java.util.Scanner;

public class Hangiman {
    private static final String[] words = {"eins", "zwei", "drei"};
    private final Random ran = new Random();
    private String toGuess;
    private StringBuilder toGuessHidden;
    private int lives;

    public void newGame() {
        toGuess = words[ran.nextInt(words.length)];
        toGuessHidden = new StringBuilder(repeatChar('.', toGuess.length()));
        lives = 3;
        while (lives > 0 && !(guess() && toGuess.contentEquals(toGuessHidden)))
            ;
        System.out.println(lives > 0 ? "You won. :)" : "You lost. :(");
        System.out.println("The word was: " + toGuess);
        calculateLives();
    }

    private boolean guess() {
        calculateLives();
        System.out.println("Word: " + toGuessHidden);
        System.out.println("Please insert the char you want:");
        char ch = new Scanner(System.in).nextLine().charAt(0);
        int c = 0;
        for (int i = 0; i < toGuess.length(); i++) {
            if (toGuessHidden.charAt(i) == '.' && toGuess.charAt(i) == ch) {
                c++;
                toGuessHidden.setCharAt(i, ch);
            }
        }
        if (c == 0) {
            System.out.println("Sorry, You haven't guessed the character.");
            lives--;
            return false;
        } else {
            System.out.println("Wow, You have guessed the character " + c + " times. =)");
            return true;
        }
    }

    private void calculateLives() {
        System.out.println("Remaining lives: " + repeatChar('♥', lives));
    }

    public String repeatChar(char ch, int times) {
        return new String(new char[times]).replace('\0', ch);
    }

    public static void main(String[] args) {
        Hangiman hangiman = new Hangiman();
        hangiman.newGame();
        hangiman.newGame();
        hangiman.newGame();
    }
}

Ich möchte zu bedenken geben: Die while-Bedingung ist nicht in einer kanonischen Normalform (schwerer zu lesen) und der Scanner wird nicht wiederverwendet (fehleranfälliger).
 

osion

Bekanntes Mitglied
Meinst du das so?

Java:
import java.util.Random;
import java.util.Scanner;

public class Hangiman {
    private static final String[] words = {"eins", "zwei", "drei"};
    private final Random ran = new Random();
    private String toGuess;
    private StringBuilder toGuessHidden;
    private int lives;

    public void newGame() {
        toGuess = words[ran.nextInt(words.length)];
        toGuessHidden = new StringBuilder(repeatChar('.', toGuess.length()));
        lives = 3;
        while (lives > 0 && !(guess() && toGuess.contentEquals(toGuessHidden)))
            ;
        System.out.println(lives > 0 ? "You won. :)" : "You lost. :(");
        System.out.println("The word was: " + toGuess);
        calculateLives();
    }

    private boolean guess() {
        calculateLives();
        System.out.println("Word: " + toGuessHidden);
        System.out.println("Please insert the char you want:");
        char ch = new Scanner(System.in).nextLine().charAt(0);
        int c = 0;
        for (int i = 0; i < toGuess.length(); i++) {
            if (toGuessHidden.charAt(i) == '.' && toGuess.charAt(i) == ch) {
                c++;
                toGuessHidden.setCharAt(i, ch);
            }
        }
        if (c == 0) {
            System.out.println("Sorry, You haven't guessed the character.");
            lives--;
            return false;
        } else {
            System.out.println("Wow, You have guessed the character " + c + " times. =)");
            return true;
        }
    }

    private void calculateLives() {
        System.out.println("Remaining lives: " + repeatChar('♥', lives));
    }

    public String repeatChar(char ch, int times) {
        return new String(new char[times]).replace('\0', ch);
    }

    public static void main(String[] args) {
        Hangiman hangiman = new Hangiman();
        hangiman.newGame();
        hangiman.newGame();
        hangiman.newGame();
    }
}

Ich möchte zu bedenken geben: Die while-Bedingung ist nicht in einer kanonischen Normalform (schwerer zu lesen) und der Scanner wird nicht wiederverwendet (fehleranfälliger).
Das mit dem System.out.println sieht besser aus.
Warum machst du char ch = new Scanner(System.in).nextLine().charAt(0);?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
B Wie könnte man mit Java diese Matheaufgabe lösen Java Basics - Anfänger-Themen 7
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
K Könnte mir jemand erläutern, was der autor damit meint? Java Basics - Anfänger-Themen 5
C Input/Output Primzahlenzerlegung -> könnte man Zahlen auch einlesen? Java Basics - Anfänger-Themen 4
M Wie könnte ein solches Programm ablaufen / aussehen? Java Basics - Anfänger-Themen 5
M Was könnte hier nicht stimmen??? Java Basics - Anfänger-Themen 9
B könnte nochmal jemand über mein Projekt schauen? Java Basics - Anfänger-Themen 4
L Ich könnte weinen. Java Basics - Anfänger-Themen 11
R Wie könnte es aussehen? (MainClass.tfLog.setText(...) ) Java Basics - Anfänger-Themen 4
C Kann mir jemand helfen was mit diesen Fehlern gemeint ist ? Java Basics - Anfänger-Themen 12
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
H Versteht jemand diesen Codewars Error? Java Basics - Anfänger-Themen 8
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
S Erste Schritte Button einen Wert zuweisen & diesen ausgeben Java Basics - Anfänger-Themen 2
G Wie kann ich diesen Wert ermitteln? Java Basics - Anfänger-Themen 4
W Wie kann man diesen Code in einen Code umwandeln, der folgendes können sollte? Java Basics - Anfänger-Themen 1
I OOP Wie kann ich diesen Code 'Objektorientiert machen' ? Java Basics - Anfänger-Themen 1
I Wie diesen Code besser schreiben? (Zeitformate) Java Basics - Anfänger-Themen 2
R weiß jemand warum Java diesen Fehler ausspuckt? "Variable might not hav been initialized" Java Basics - Anfänger-Themen 4
M Quelltext auslesen und diesen in einen String schreiben Java Basics - Anfänger-Themen 3
P Variablen Variable in if Bedingung anlegen, Wert zuweisen und diesen als Bedingung nutzen Java Basics - Anfänger-Themen 4
V Wer kann diesen Code leicht erklären Java Basics - Anfänger-Themen 8
T Wie führe ich diesen Code aus? Java Basics - Anfänger-Themen 7
Y Wie starte ich diesen Code in Eclipse? Java Basics - Anfänger-Themen 10
S System.out.println gibt diesen Wert aus: Klasse@f102d3 Java Basics - Anfänger-Themen 3
B ich hab diesen Fehler anderuernd. Java Basics - Anfänger-Themen 10
D ein File(Datei) lesen und diesen zu einem Hashmap hinfügen? Java Basics - Anfänger-Themen 5
T Wie kann ich diesen Fehler beheben? Java Basics - Anfänger-Themen 7
G Hilfe komme nicht weiter bei diesen aufgaben Java Basics - Anfänger-Themen 2
I Wie bekomme ich diesen Fehler weg? Java Basics - Anfänger-Themen 5
K Wie kann man diesen String erzeugen? Java Basics - Anfänger-Themen 4
tomzen Programm ignoriert in der Ausführung Code Java Basics - Anfänger-Themen 8
O Obfuscateter Code lässt sich nicht ausführen? Java Basics - Anfänger-Themen 7
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben