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

Gra Hangman/wisielec - Java

Object Storage Arubacloud
0 głosów
802 wizyt
pytanie zadane 2 marca 2017 w Java przez Jedyn Obywatel (1,200 p.)
Witam. Chcę napisać grę wisielec. Niestety nie wiem czy mój tok myślenia jest prawidłowy, dodatkowo chciałbym dopytać jeszcze o parę rzeczy.
Może zacznę od tego jak to sobie w głowie ułożyłem.
1. Wczytuje podane słowo Scanner'em do stringa,

2. stringa rzutuje na chara, żeby mieć np char tab[n] = 'a', [n+1] = 'f'  i tak dalej całe zdanie. (nie mam pojęcia jak można wykonać takie rzutowanie), po czym obliczam liczbę elementów w tej tablicy.

3. Pobieram pierwszą literę, daje pętle w której przeszukam tablice charów pod kątem tej litery, jeżeli jej nie znajdę to dekrementuje zmienną proba którą zadeklarowałem wcześniej z jakąś tam liczbą prób i wracam do wczytania kolejnej litery
4.Daje warunek if(proba==0) println("Przegrałeś!") który jest sprawdzany podczas każdej próby
Czy mój pomysł na wykonanie jest mniej więcej dobry?
komentarz 3 marca 2017 przez Jedyn Obywatel (1,200 p.)
edycja 3 marca 2017 przez Jedyn

Napisałem już coś takiego. Niestety nie działa poprawnie.Tak wiem ,że mam straszny bałagan w kodzie oraz błędy logiczne, chciałem po prostu mniej więcej to przetestować a później zoptymalizować i poprawić na lepsze. Ktoś dostrzega gdzie może być błąd? Podaje 2 z 3 poprawnych znaków i wywala mi, że wygrałem.


 

protected void gra()
    {
        System.out.println("Witaj w grze Hangman! \n Posiadasz 8 prób, jeżeli 8 razy podasz złą literę lub hasło, przegrywasz! \n Hasło może składać się tylko z 1 słowa \n Podaj hasło: ");
        Scanner scan = new Scanner(System.in);
        String sentence = scan.nextLine();    
        sentence = sentence.toLowerCase();//pobrane zdanie
        int proby = 8; //liczba prob
        int trueValue = 0;
        for(int i=0; i<sentence.length() + 8; i++)
        {
            System.out.println("Podaj litere lub całe słowo: ");
            Scanner reply = new Scanner(System.in);    //odpowiedz
            String letter = reply.nextLine();
            letter = letter.toLowerCase();//litera
            int valueSign = letter.length();    //liczba znakow
            if(letter.equals(sentence)) 
            {
                System.out.println("Odgadłeś hasło gratulacje!");
                break;
            }
            else if(!(letter.equals(sentence)))
            {
                for(int k = 0; i<sentence.length(); k++)
                {
                    if(sentence.charAt(k) == letter.charAt(0))
                    {
                        if(trueValue == valueSign && proby>0) 
                            {
                            System.out.println("Gratulacje! Wygrałeś");
                            break;
                            }
                        else if(!(trueValue == valueSign) || !(proby<=0))
                        {
                        System.out.println("Znak " + sentence.charAt(k) + " znajduje się na pozycji " + k);
                        trueValue++;
                        letter = reply.nextLine();
                        }
                        
                    }
                    else System.out.println("Zle!!!");
                    
                }
                
            }
            else 
            {
            proby--;
            System.out.println("Nie trafiłeś! Tracisz życie \n zostało Ci " + proby + " prób");
            letter = reply.nextLine();
            
            
            }
        
            
            
        }
        
        
    }
}

 

komentarz 15 marca 2017 przez Jedyn Obywatel (1,200 p.)

Przysiadłem znowu do tego hangmana i mam kolejny problem tym razem logiczny. Wszystko fajnie działa, tylko problem jest ze zliczaniem błędnych odpowiedzi. Zrobiłem to w ten sposób ,że w pętli for iteruje sobie listę (char)  w której mam zapisane podane hasło przez grającego, przy czym funkcja sprawdza czy podana litera znajduje się w liście. Jeżeli tak to liczbaZnakowSlowa--, następnie porównuje kolejną literę z podaną przez użytkownika itd. 

Następnie dałem else w którym odejmuje "życia", z tym ,że pętla sprawdza pierwszy znak i leci od razu do else zamiast najpierw porównać wszystkie znaki do znaku podanego przez użytkownika. Ktoś ma pomysł jak to rozwiązać?
Kod poniżej, oraz ta nieszczęsna pętla.


 

public class Hangman {

	public void timer()
    {
        long current = System.currentTimeMillis();
        int i = 5;
        System.out.println("Wygrałeś! Następuje zamknięcie programu ...");
            while(i >= 0)
            {  
                if(System.currentTimeMillis() - current > 1000)
                {
                System.out.println(i--);
                current = System.currentTimeMillis();
                }
            }
    }
   
    public void gra()
    {
        System.out.println("Witaj w grze Hangman! \nPodaj słowo: ");
        Scanner sl = new Scanner(System.in);
        String slowo = sl.nextLine();
        slowo = slowo.toLowerCase();
        int liczbaZnakowSlowa = slowo.length();
        int proby = 8;
        char k = 0;
        k = (char)k;
        ArrayList<Character> zdanie = new ArrayList<Character>();
        
        for(int i = 0; i<liczbaZnakowSlowa; i++)
        {
            zdanie.add(slowo.charAt(i));
           
        }
        zdanie.add('0');
        while(liczbaZnakowSlowa>0)
        {
            System.out.println("Podaj litere lub całe słowo: ");
            Scanner lit = new Scanner(System.in);
            String litera = lit.nextLine();
            while(litera.equals(slowo))
            {
                System.out.println("Ukryte słowo to " +"==="+ slowo+"===");
                timer();
                System.exit(0);
            }
            for(int i =0; i<zdanie.size(); i++)
            {
                if(zdanie.get(i).equals(litera.charAt(0)))
                {
                    i++;
                    liczbaZnakowSlowa--;
                    System.out.println("Zostało do odgadnięcia "+liczbaZnakowSlowa + " liter!");
                    
                }
                else
                	{
                	proby--;
                	System.out.println("Litera nie pasuje! Masz " + proby + " żyć");
                	break;
                	 
                	}
               
            }
            while(liczbaZnakowSlowa==0)
            {
                System.out.println("Ukryte słowo to " +"==="+ slowo+"===");
                timer();
                System.exit(0);
            }
            while(proby==0)
            {
            	System.out.println("Przegrałeś! wykorzystałeś wszystkie życia :(");
            	System.exit(0);
            }
        }
        System.out.println("Gratulacje wygrałeś!");

 

 

 

 

Pętla którą chce przerobić:

for(int i =0; i<zdanie.size(); i++)
            {
                if(zdanie.get(i).equals(litera.charAt(0)))
                {
                    i++;
                    liczbaZnakowSlowa--;
                    System.out.println("Zostało do odgadnięcia "+liczbaZnakowSlowa + " liter!");
                    
                }
                else
                	{
                	proby--;
                	System.out.println("Litera nie pasuje! Masz " + proby + " żyć");
                	break;
                	 
                	}


 

1 odpowiedź

+1 głos
odpowiedź 2 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Pomysł nie jest taki zły:) Nie musisz rzutowac na talbice char. String ma metode charAt(index) która zwraca Ci pojedynczy znak.

Podobne pytania

0 głosów
1 odpowiedź 473 wizyt
pytanie zadane 31 października 2020 w C i C++ przez Iknad Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 343 wizyt
pytanie zadane 13 kwietnia 2021 w Python przez qwert 100 Obywatel (1,250 p.)
0 głosów
1 odpowiedź 691 wizyt
pytanie zadane 29 października 2016 w Nasze projekty przez Neronys Bywalec (2,090 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 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!

...