wie könnte ich diesen Java Code kürzer/besser machen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du könntest die eingebauten String-Methoden (String#repeat, String#valueOf, String#contains, String#toCharArray, String#indexOf usw.) verwenden, anstatt das jedesmal per for-Schleife zu lösen.

Und anstatt lives = lives - 1; kann man lives--; oder lives-=1; schreiben.

public static void main(String[] args) {
    final Scanner scanner = new Scanner(System.in);
    final String[] words = new String[]{"computer", "mouse", "screen", "display", "language"};

    String notUsed = "abcdefghijklmnopqrstuvwxyz";
    String randomWord = words[(int) (Math.random() * words.length)];
    char[] letters = ".".repeat(randomWord.length()).toCharArray();
    int lives = 3;
    
    System.out.println("Starting game");
    System.out.println("The word has " + randomWord.length() + " letters.");

    while (lives > 0) {
        System.out.println("Lives: " + "♥".repeat(lives));
        System.out.println("Input: ");

        char letter = scanner.nextLine().charAt(0);

        boolean isGuessCorrect = false;
        for (int i = 0; i < randomWord.length(); i++) {
            if (randomWord.charAt(i) == letter) {
                letters[i] = letter;
                isGuessCorrect = true;
            }
        }
        
        if (!isGuessCorrect) lives--;

        notUsed = notUsed.replace(letter, '.');

        System.out.println("Word: " + String.valueOf(letters));
        System.out.println("Not used " + notUsed);
        System.out.println("----------------------------------");

        // Guessed all letters right
        if (!String.valueOf(letters).contains(".")) {
            System.out.println("You won!");
            break;
        }
    }
    if (lives == 0) {
        System.out.println("You lost! The word was: " + randomWord);
    }
    System.out.println("Exiting game");
}
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
leKAzz203 
Fragesteller
 21.05.2022, 15:44

für was steht eigentlich das final in der zweiten zeile ?

0
MrAmazing2  21.05.2022, 15:58
@leKAzz203

final bedeutet „Wird nie geändert“.

Wobei „ändern“ in dem Fall ausschließlich eine Neu-Zuweisung per = meint.

int a = 0;
a = 2; //Hier wird a geändert. Also nicht final.

-

final int a = 0;
//…
// a wird nirgens mehr geändert, daher ist es Final

Prinzipiell wird das Array letters auch nie „geändert“ (sondern nur die Variablen IM Array) und könnte daher auch ein final haben, und das randomWord könnte bei der jetzigen Implementierung auch final sein, aber da habe ich es weggelassen, da ich die Variablen in deinem Code aufteilen wollte zu:

  • “Immer gleich“ (-> Final)

(Der Scanner und die Wörter)

  • „Wird verändert“

(Alles was beim Neustart des Spiels resettet werden müsste. Leben, Zufallswort, … . Eventuell willst man das Spiel ja mal dementsprechend weitern)

Du kannst die final‘s auch weglassen, ein final ist fast nie notwendig. Nur ich benutze sie gerne, um zu markieren, welche Werte ich ändere und welche statisch sind.

0
MrAmazing2  21.05.2022, 16:03
@MrAmazing2

Wenn du in Richtung OOP gehst und eine Klasse für das Spiel erstellst wäre anstatt (bzw. zusätzlich zu) final ein „static“ angebracht.

Sind dann Statische Attribute der Klasse die für jedes Objekt gleich sind.

0
leKAzz203 
Fragesteller
 21.05.2022, 15:49

  char[] letters = ".".repeat(randomWord.length()).toCharArray();

und was macht das repeat ?

0
MrAmazing2  21.05.2022, 16:00
@leKAzz203

Den Punkt entsprechend oft wiederholen.

".".repeat(5) würde beispielsweise "….." ausgeben.

1
leKAzz203 
Fragesteller
 21.05.2022, 16:12
@MrAmazing2

Alles klar, danke! Du bist wirklich einer der wenigen Java-User auf GuteFrage die einen immer schnell & freundlich weiterhelfen!

1

Das Problem, was du hast, ist nicht die länge des Codes, sondern dass du OOP noch nicht verstanden hast. Java ist eine Objekt orientierte Sprache und das solltest du auch nutzen. Alles in die main zu schreiben ist der falsche weg. Verwende Klassen und Methoden. Lagere Code aus und vermeide redundanzen

um den kürzer zu machen kannst du var benutzen statt den typen zu deklarieren

außerdem würde ich wenn möglich lists statt arrays benutzen, weil lists im gegensatz zu arrays zusätzliche nützliche methoden haben