Skip to content

Zgadywanie liczb przez komputer – JAVA

Druga część zadania z liczbami. Tym razem zgadywanie liczb przez komputer w Javie.

W pierwszym zadaniu komputer „pomyślał” liczbę, a użytkownik miał ją zgadnąć. Tym razem odwracamy sytuację. Użytkownik wybiera liczbę, a komputer próbuje ją zgadnąć. Oczywiście, są tu dwa warunki, o których trzeba pamiętać:

  • limit – z jakiego zakresu użytkownik wybiera liczbę. My założyliśmy przedział od 1 do 1000;
  • po każdym strzale komputera, użytkownik musi mu podpowiedzieć, czy pomyślana liczba jest mniejsza czy większa, a gdy ją trafi musi o tym powiedzieć

Zgadywanie liczb przez użytkownika

Zgadywanie liczb przez komputer

Jak powinien wyglądać, cały proces?

  1. Najpierw prosimy użytkownika, aby pomyślał liczbę od 1 do 1000
  2. Ustalamy wzór, na podstawie którego, komputer będzie typował liczbę
  3. Komputer przekazuje swój strzał i czeka na odpowiedź użytkownika
  4. Jeśli liczba jest za mała lub za duża, zmieniamy zakres z jakiego komputer ma trafiać liczbę. Komputer ponawia strzał
  5. Proces powtarza się do momentu wybrania właściwej liczby.

Ja najpierw przygotowałem program, w której użytkownik wpisywał liczbę w konsolę, a komputer ją porównywał ze swoimi strzałami. To było robocze rozwiązanie, które nie spełniało założeń biznesowych. Właściwy kod, rozpoczynamy od dwóch komunikatów i ustalenia dolnej granicy przedziału i górnej:

    public static void main(String[] args) {
        int minBound = 1;
        int maxBound = 1000;
        System.out.println("Pomyśl liczbę od 1 do 1000. Nie oszukuj!");
        System.out.println("Spróbuje teraz ją zgadnąć w 10 ruchach! Jeśli liczba jest za duża - napisz Mniej, a jeśli za mała to Więcej. Jeśli trafię napisz Ok!");
        guessNum(minBound, maxBound);
    }

W ostatniej linii przekazujemy do metody liczby z zakresu.

    static int guessNum(int min, int max) {
        int guessNum;
        int count = 0;
        Scanner scan = new Scanner(System.in);
        for (; ; ) {
            guessNum = ((max - min) / 2) + min;
            count++;
            System.out.println("Mój typ to: " + guessNum);
            String str = scan.nextLine();
            if (str.equals("Ok!" )) {
                System.out.println("Dobra robota! Zgadłem za " + count + " razem! " + guessNum + " to Twoja liczba!");
                break;
            } else if (str.equals("Mniej")){
                System.out.println("Hmm... wymyśliłem za dużą liczbę");
                max = guessNum;
            } else if (str.equals("Więcej")) {
                System.out.println("Hmm... wymyśliłam za małą liczbę.");
                min = guessNum;
            }
        }
        return guessNum;
    }

Najpierw deklarujemy dwie wartości – jedna będzie odpowiadać za liczbę, którą zgadujemy, a druga za podliczanie, w ilu ruchach komputer trafi (int count). Następnie tworzymy nieskończoną pętlę, która rozpoczyna się zainicjowaniem wzoru:

guessNum = ((max – min) / 2) + min;

Dla pierwszego trafienia byłoby to więc guessNum = ((1000-1)/2) + 1, czyli guessNum = 500. Użytkownik musi wtedy określić, czy liczba jest za mała, za duża czy to ta przez niego wymyślona. Jeśli wartość wpisana w konsolę równa się „Mniej” to maksymalny zakres przyjmuje wartość wskazanej przez komputer liczby. Jeśli wartość wpisana w konsolę równa się „Więcej” to zmienia się minimalny zakres liczby.

W związku z tym, że cały czas jesteśmy w pętli, to do momentu, gdy użytkownik nie wpiszę „Ok” proces będzie się powtarzał. Gdy komputer trafi liczbę i użytkownik to potwierdzi, to pętla zostanie zakończona.

Co można tu jeszcze poprawić?

W tej chwili, za każdym razem, gdy zostanie wykonana pętla, to zwiększa się liczba trafień. Jeśli użytkownik będzie poprawnie wpisywał komunikaty, to nie ma problemu, ale jeśli zrobi w nich błąd (np. brak polskiego znaku) to liczba trafień się zwiększy, ale komputer nie dostanie podpowiedzi.

Published inJAVA