Java. Rusz głową! - ćwiczenie zgadywanka

1

Cześć,
Mój pierwszy post tutaj więc wybaczcie błędy, będę starał się poprawiać.
Zacząłem naukę Javy z książki Java! Rusz głową!
Jest w niej ćwiczenie polegające na napisaniu gry - zgadywanki, str. 71/72 jeżeli ktoś ma taką książkę.
Od razu napiszę, że widziałem już tutaj podobny temat ale niestety przedstawione tam rozwiązania nie chcą działać u mnie. Kopiuje, zapisuje i błąd.
Wrzucę kod przepisany z książki (a dokładniej pobrany z servera Helionu).
Proszę o pomoc w znalezieniu przyczyny 'czemu nie działa' :) i najlepiej krótki komentarz dlaczego tak. Próbuję już trochę czasu do tego dojść i nic, a nie chcę iść dalej nie rozumiejąc czegoś.
W tym momencie pojawia mi się błąd:
screenshot-20211130001626.png

class Zgadywanka {
    Gracz p1;
    Gracz p2;
    Gracz p3;

    public void rozpocznijGre() {
        p1 = new Gracz();
        p2 = new Gracz();
        p3 = new Gracz();

        int typp1 = 0;
        int typp2 = 0;
        int typp3 = 0;

        boolean p1odgadl = false;
        boolean p2odgadl = false;
        boolean p3odgadl = false;

        int liczbaOdgadywana = (int) (Math.random() * 10);
        System.out.println("Myślę o liczbie z zakresu od 0 do 9...");

        while (true) {
            System.out.println("Należy wytypować liczbę : " + liczbaOdgadywana);

            p1.zgaduj();
            p2.zgaduj();
            p3.zgaduj();

            typp1 = p1.liczba;
            System.out.println("Gracz pierwszy wytypował liczbę : " + typp1);

            typp2 = p2.liczba;
            System.out.println("Gracz drugi wytypował liczbę: " + typp2);

            typp3 = p3.liczba;
            System.out.println("Gracz trzeci wytypował liczbę : " + typp3);

            if (typp1 == liczbaOdgadywana) {
                p1odgadl = true;
            }
            if (typp2 == liczbaOdgadywana) {
                p2odgadl = true;
            }
            if (typp1 == liczbaOdgadywana) {
                p3odgadl = true;
            }
            if (p1odgadl || p2odgadl || p3odgadl) {

                System.out.println("Mamy zwycięzce");
                System.out.println("Czy gracz pierwszy wytypował poprawnie? " + p1odgadl);
                System.out.println("Czy gracz drugi wytypował poprawnie? " + p2odgadl);
                System.out.println("Czy gracz trzeci wytypował poprawnie? " + p3odgadl);
                System.out.println("Koniec gry ");
                break;

            } else {
            }
        }
    }
}
class Gracz {
    int liczba =0 ;

    public void  zgaduj() {
    liczba= (int) (Math.random() *10);
    System.out.println("Typuję liczbę: " + liczba);
}
 }   

        class StarterGry{
            public static void main(String[] args) {
                Zgadywanka gra = new Zgadywanka();
                gra.rozpocznijGre();
 }
}
1

u mnie dziala
screenshot-20211130002138.png

0

Daj public przed class StarterGry i będzie działać

0

@0xmarcin: zrobiłem:

public class StarterGry{
	public static void main(String[] args) {
	Zgadywanka gra = new Zgadywanka();
	gra.rozpocznijGre();
 }
}

i niestety dalej:
screenshot-20211130102602.png

0
public class Zgadywanka {
    Gracz p1;
    Gracz p2;
    Gracz p3;

    public void rozpocznijGre() {
        p1 = new Gracz();
        p2 = new Gracz();
        p3 = new Gracz();

        int typp1 = 0;
        int typp2 = 0;
        int typp3 = 0;

        boolean p1odgadl = false;
        boolean p2odgadl = false;
        boolean p3odgadl = false;

        int liczbaOdgadywana = (int) (Math.random() * 10);
        System.out.println("Myślę o liczbie z zakresu od 0 do 9...");

        while (true) {
            System.out.println("Należy wytypować liczbę : " + liczbaOdgadywana);

            p1.zgaduj();
            p2.zgaduj();
            p3.zgaduj();

            typp1 = p1.liczba;
            System.out.println("Gracz pierwszy wytypował liczbę : " + typp1);

            typp2 = p2.liczba;
            System.out.println("Gracz drugi wytypował liczbę: " + typp2);

            typp3 = p3.liczba;
            System.out.println("Gracz trzeci wytypował liczbę : " + typp3);

            if (typp1 == liczbaOdgadywana) {
                p1odgadl = true;
            }
            if (typp2 == liczbaOdgadywana) {
                p2odgadl = true;
            }
            if (typp1 == liczbaOdgadywana) {
                p3odgadl = true;
            }
            if (p1odgadl || p2odgadl || p3odgadl) {

                System.out.println("Mamy zwycięzce");
                System.out.println("Czy gracz pierwszy wytypował poprawnie? " + p1odgadl);
                System.out.println("Czy gracz drugi wytypował poprawnie? " + p2odgadl);
                System.out.println("Czy gracz trzeci wytypował poprawnie? " + p3odgadl);
                System.out.println("Koniec gry ");
                break;

            } else {
                System.out.println("Gracze będą musieli spróbować jeszcze raz.");
            }
        }
    }
}


class Gracz {
    int liczba = 0;

    public void  zgaduj() {
        liczba = (int) (Math.random() * 10);
        System.out.println("Typuję liczbę: " + liczba);
    }
}

class StarterGry {
    public static void main(String[] args) {
        Zgadywanka gra = new Zgadywanka();
        gra.rozpocznijGre();
    }
}

Teraz powinno być ok :)

1

Nie zauważyłem że korzystasz z nowej opcji Javy czyli uruchamiania plików .java bez kompilacji. Cała funkcjonalność opisana jest w https://openjdk.java.net/jeps/330

screenshot-20211130110741.png

Czyli gdy odpalasz plik Foo.java to Java oczekuje że pierwsza klasa zdefiniowana w tym pliku będzie posiadała metodę main. Czyli w twoim przypadku albo przesuwasz klasę StarterGry na początek pliku albo przenosisz main do klasy Zgadywanka.

Sama metoda main musi być public i static.

Sprawdzone na szybko na moim systemie (JDK 11):

mc@MacBook-Pro elf-viewer % java test.java
works!
mc@MacBook-Pro elf-viewer % cat test.java           
class Test {
        public static void main(String[] args) { System.out.println("works!"); }
}

class Other { }
class OtherOther { }
class OtherOtherOther { }
0

Ok, dziękuję za pomoc, zadziałało.
Wczoraj też wstawiałem cały człon z 'main' na początek kodu ale widocznie coś jeszcze było nie tak. Może właśnie tego 'public' przed klasą Zgadywanka brakowało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1