wie könnte ich diesen Java Code kürzer/besser machen?
Hangman in Java
Wie könnte man so einen Code kürzer machen ?
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");
}
}
3 Antworten
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");
}
Den Punkt entsprechend oft wiederholen.
".".repeat(5) würde beispielsweise "….." ausgeben.
Alles klar, danke! Du bist wirklich einer der wenigen Java-User auf GuteFrage die einen immer schnell & freundlich weiterhelfen!
für was steht eigentlich das final in der zweiten zeile ?
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.
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.
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
char[] letters = ".".repeat(randomWord.length()).toCharArray();
und was macht das repeat ?