• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - Hangman

Object Storage Arubacloud
0 głosów
234 wizyt
pytanie zadane 22 kwietnia 2022 w Java przez mewtwo Użytkownik (830 p.)

Macie może jakieś rady do mojego kody, aby mógł go ulepszyć. 

Dodatkowo mam pytanie jak zabrać się za wyrazy ze spacjami np. Battlefield 4. Nie jestem jakimś zaawansowanym użytkownikiem, więc trzymajmy się podstaw przy propozycjach. Z góry dziękuje za odpowiedź. 

Jeżeli macie jakieś rady dotyczące programowania (wyraźniejszy kod, etc...), piszcie śmiało.

 

Kod (Mojego autorstwa): 

import java.util.Random;
import java.util.Scanner;
import java.io.Console;

public class Hangman {

    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);

        // Wybór pomiędzy własnym słowem a gotowymi kategoriami
        System.out.println();
        System.out.print("\n----------------------------------------");
        System.out.print("\nDostępne akcje: ");
        System.out.print("\n1. Losowa gotowa kategoria");
        System.out.print("\n2. Własny wyraz (min. dwie osoby, dla lepszej zabawy)");
        System.out.print("\n----------------------------------------");
        System.out.print("\nPodaj swój wybór (1 / 2): ");
        int choice = scanner.nextInt();

        if (choice == 1){
            randomCategory();
        } else if (choice == 2){
            ownCategory();
        } else {
            System.out.print("\nBłędnie wprowadzone dane.");
        }

        scanner.close();
    }

    private static void randomCategory(){
        Scanner scanner = new Scanner(System.in);

        // Cięcie ciągu znaku zwróconego z metody availableCategory() na dwie części, (1) - słowo, (2) - kategorie, 
        String word_category = availableCategory();
        String w_cat [] = word_category.split("-");
        String randomWord = w_cat[0];
        String subject = w_cat[1];
        
        // Deklarowanie listy typu char, a następnie wyświetlenie słowa do zgadnięcia za pomocą "_"
        char letters [] = new char [randomWord.length()];
        for (int i = 0; i < letters.length; i++){
            letters[i] = '_';
        }   

        System.out.print("\nWyraz ma: " + letters.length + " liter");
        System.out.print("\nSłowa mogą zawierać polskie oraz specialne znaki !!");

        int lives = 3;
        while (lives > 0){

            System.out.println();
            System.out.print("\n----------------------------------------");
            System.out.print("\nKategoria: " + subject);
            // Drukowanie dostępnych żyć przy pomocy pętli for
            System.out.print("\nPozostałe życia: ");
            for (int i = 0; i < lives; i++){
                System.out.print("X");
            }
            // Użytkowni podaje litere, a następnie program bierzę pod uwagę tylko to jest na 0 indexie 
            // (np: Użytkownik wprowadzi: ab, będziemy brali pod uwage tylko a), czyli nie można wpisywać całych słów 
            System.out.print("\nPodaj litere: ");
            String input = scanner.nextLine();
            char letter = input.charAt(0);

            boolean isGuessCorrect = false;
            boolean isGameFinished = true;

            for (int i = 0; i < randomWord.length(); i++){
                char j = randomWord.charAt(i);

                if (j == letter){
                    letters[i] = j;
                    isGuessCorrect = true;
                }
            }

            if (!isGuessCorrect){
                lives--;
            }

            System.out.print("\nSłowo: ");
            for (int i = 0; i < letters.length; i++){

                if (letters[i] == '_'){
                    isGameFinished = false;
                }

                System.out.print(letters[i]);
            }

            System.out.print("\n----------------------------------------");
            if (isGameFinished){
                System.out.println("\nGratulacje wygrałeś !!");
                break;
            }

            if (lives == 0){
                System.out.println("\nPrzegrałeś !! Słowo to: " + randomWord);
            }
        }

        scanner.close();
    }

    private static void ownCategory(){
        Scanner scanner = new Scanner(System.in);
        Console console = System.console();

        System.out.println();
        System.out.print("----------------------------------------");
        System.out.print("\nPodaj kategorie (np. Miasto, Imię  etc...): ");
        String category = scanner.nextLine();
        System.out.print("UWAGA !! Słowo, które wpisujesz nie będzie dla ciebie widoczne");
        System.out.print("\nPodaj słowo (małymi literami): ");
        char word [] = console.readPassword();
        
        String wordCopy = "";
        for (int i = 0; i < word.length; i++){
            wordCopy += word[i];
        }

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

        // Deklarowanie listy typu char, a następnie wyświetlenie słowa do zgadnięcia za pomocą "_"
        char letters [] = new char [wordCopy.length()];
        for (int i = 0; i < letters.length; i++){
           letters[i] = '_';
        }

        System.out.println();
        System.out.print("\nWyraz ma: " + letters.length + " liter");
        System.out.print("\nSłowa mogą zawierać polskie oraz specialne znaki !!");

        int lives = 4;
        while (lives > 0){

            System.out.println();
            System.out.print("\n----------------------------------------");
            System.out.print("\nKategoria: " + category);

            // Drukowanie dostępnych żyć przy pomocy pętli for
            System.out.print("\nPozostałe życia: ");
            for (int i = 0; i < lives; i++){
                System.out.print("X");
            }

            // Użytkowni podaje litere, a następnie program bierzę pod uwagę tylko to co jest na 0 indexie 
            // (np: Użytkownik wprowadzi: ab, będziemy brali pod uwage tylko a), czyli nie można wpisywać całych słów
            System.out.print("\nPodaj litere: ");
            String input = scanner.nextLine();
            char letter = input.charAt(0);

            boolean isGuessCorrect = false;
            boolean isGameFinished = true;

            for (int i = 0; i < wordCopy.length(); i++){
                char j = wordCopy.charAt(i);

                if (j == letter){
                    letters[i] = j;
                    isGuessCorrect = true;
                }
            }

            if (!isGuessCorrect){
                lives--;
            }

            System.out.print("\nSłowo: ");
            for (int i = 0; i < letters.length; i++){

                if (letters[i] == '_'){
                    isGameFinished = false;
                }

                System.out.print(letters[i]);
            }

            System.out.print("\n----------------------------------------");
            if (isGameFinished){
                System.out.println("\nGratulacje wygrałeś !!");
                break;
            }

            if (lives == 0){
                System.out.println("\nPrzegrałeś !! Słowo to: " + wordCopy);
            }
        }

        scanner.close();
    }

    private static String availableCategory(){
        Random random = new Random();

        // Dostępne kategorie 
        String Countries [] = {"francja", "hiszpania", "holandia", "polska", "norwegia", "niemcy"};
        String Cities [] = {"warszawa", "moskwa", "paryż", "berlin", "lisbona", "madryt"};
        String musicGenre [] = {"jazz", "rock", "rege", "rap", "hiphop", "techno"};
        String IT [] = {"klawiatura", "monitor", "myszka", "słuchawki", "touchpad", "procesor"};
        String programingLanguages [] = {"java", "c++", "c#", "javascript", "python", "html"};
        String Names [] = {"mariusz", "marek", "krystian", "ania", "martyna", "paweł"};

        //losowanie kategorii
        int randomCategory = random.nextInt(5); 
        int index;
        String randomWord = "";
        String subject = "";
        
        switch (randomCategory){

            case 0: index = random.nextInt(Countries.length);               randomWord = Countries[index];              break;
            case 1: index = random.nextInt(Cities.length);                  randomWord = Cities[index];                 break;
            case 2: index = random.nextInt(musicGenre.length);              randomWord = musicGenre[index];             break;
            case 3: index = random.nextInt(IT.length);                      randomWord = IT[index];                     break;
            case 4: index = random.nextInt(programingLanguages.length);     randomWord = programingLanguages[index];    break;
            case 5: index = random.nextInt(Names.length);                   randomWord = Names[index];                  break;
        }

        switch (randomCategory){

            case 0: subject = "Państwa";                 break;
            case 1: subject = "Miasta";                  break;
            case 2: subject = "Gatunki muzyczne";        break;
            case 3: subject = "Akcesorja IT";            break;
            case 4: subject = "Języki programowania";    break;
            case 5: subject = "Imiona ";                 break;
        }

        return randomWord + "-" + subject;
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 22 kwietnia 2022 przez Wiciorny Ekspert (270,170 p.)
wybrane 23 kwietnia 2022 przez mewtwo
 
Najlepsza

1. Rozdzielić kod na logiczne klasy z krótszymi metodami, bo takiego czegoś nie da się czytać, tym bardziej analizować. Chyba, że komuś zapłacisz za poświęcony czas.

!ZMIENNE NIE pisze się z dużej litery e.g  String Countries, Cities etc

2.nie trzymać wszystkiego w metodach statycznych, utworzyć odpowiednie klasy opakowujące - niekoniecznie statyczne pola, ale agregujące  zmienne za pośrednictwem konstruktora np. a sam obiekt będzie dostępny ( cykl życia - stan ) w trakcie trwania gry, rundy etc. 

3. Wydzielić to do osobnej klasy j/w wspominałem,> skorzystać może ze wzorców np. fasady, chociaż bardziej może pełnomocnika. https://pl.wikipedia.org/wiki/Pe%C5%82nomocnik_(wzorzec_projektowy)

   // Wybór pomiędzy własnym słowem a gotowymi kategoriami
        System.out.println();
        System.out.print("\n----------------------------------------");
        System.out.print("\nDostępne akcje: ");
        System.out.print("\n1. Losowa gotowa kategoria");
        System.out.print("\n2. Własny wyraz (min. dwie osoby, dla lepszej zabawy)");
        System.out.print("\n----------------------------------------");
        System.out.print("\nPodaj swój wybór (1 / 2): ");
        int choice = scanner.nextInt();
 
        if (choice == 1){
            randomCategory();
        } else if (choice == 2){
            ownCategory();
        } else {
            System.out.print("\nBłędnie wprowadzone dane.");
        }
 
        scanner.close();

4. nie trzymać stałych 'zmiennych'  wewnątrz metody, to nie jest miejsce na to 
 

     Random random = new Random();
 
        // Dostępne kategorie 
        String Countries [] = {"francja", "hiszpania", "holandia", "polska", "norwegia", "niemcy"};
        String Cities [] = {"warszawa", "moskwa", "paryż", "berlin", "lisbona", "madryt"};
        String musicGenre [] = {"jazz", "rock", "rege", "rap", "hiphop", "techno"};
        String IT [] = {"klawiatura", "monitor", "myszka", "słuchawki", "touchpad", "procesor"};
        String programingLanguages [] = {"java", "c++", "c#", "javascript", "python", "html"};
        String Names [] = {"mariusz", "marek", "krystian", "ania", "martyna", "paweł"};
 
        //losowanie kategorii
        int randomCategory = random.nextInt(5); 
        int index;
        String randomWord = "";
        String subject = "";
         
        switch (randomCategory){
 
            case 0: index = random.nextInt(Countries.length);               randomWord = Countries[index];              break;
            case 1: index = random.nextInt(Cities.length);                  randomWord = Cities[index];                 break;
            case 2: index = random.nextInt(musicGenre.length);              randomWord = musicGenre[index];             break;
            case 3: index = random.nextInt(IT.length);                      randomWord = IT[index];                     break;
            case 4: index = random.nextInt(programingLanguages.length);     randomWord = programingLanguages[index];    break;
            case 5: index = random.nextInt(Names.length);                   randomWord = Names[index];                  break;
        }
 
        switch (randomCategory){
 
            case 0: subject = "Państwa";                 break;
            case 1: subject = "Miasta";                  break;
            case 2: subject = "Gatunki muzyczne";        break;
            case 3: subject = "Akcesorja IT";            break;
            case 4: subject = "Języki programowania";    break;
            case 5: subject = "Imiona ";                 break;
        }
 
      

skorzystać z klasy i utworzyć pola/.stałe, skorzystać może ze wzroca strategii do wybrania odpowiedniej ścieżki postępowania

Tego jest masa i kod jest widać ;świeżo pisany.  Nie wiem co masz na myśli 'ulepszyć' ale w najmniejszym stopniu nie jest wyraźny i czytelny. 
Po ogarnięciu podstaw w programowaniu szczególnie nacisk NA OBIEKTOWE programowanie, wtedy można myśleć o optymalizacji, trzymania rzeczy niezmiennych etc. https://javastart.pl/baza-wiedzy/programowanie-obiektowe

Dodatkowo instrukcja switch - powinna posiadać CASE -> DEFAULTOWY według dobrej praktyki. 
Wszelkie 'pętle for' w których wykonujesz ;monolityczne i lub konkretnie te same operacje w celu pozyskania tej samej informacji, polecam skorzystać z nauczenia się czym są STREAMY w javie i jakie mają możliwości jeśłi chodzi o funkcje WYŻSZEGO RZĘDU https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html skorzystać z API i dostepnych metod. 

Podobne pytania

0 głosów
1 odpowiedź 804 wizyt
pytanie zadane 2 marca 2017 w Java przez Jedyn Obywatel (1,200 p.)
0 głosów
1 odpowiedź 475 wizyt
pytanie zadane 31 października 2020 w C i C++ przez Iknad Nowicjusz (220 p.)
+1 głos
2 odpowiedzi 816 wizyt
pytanie zadane 19 czerwca 2019 w Python przez Ventre90 Obywatel (1,170 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...