Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

GuessGame Head First Java primer da li sam shvatio.

[es] :: Java :: GuessGame Head First Java primer da li sam shvatio.

[ Pregleda: 1200 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

miljannet
Rakita Miljan
Crvenka

Član broj: 321026
Poruke: 56
*.adsl-a-1.sezampro.rs.



+3 Profil

icon GuessGame Head First Java primer da li sam shvatio.12.09.2015. u 20:52 - pre 104 meseci
Radim jedan primer iz knjige Head First in Java.
Cilj programa je da pokaze kako stvarno radi OOP, objasnili su sta su klase, objekti nesto malo o metodama i to je to. Napomenuli su da je ovo program koji ima u cilju da prikaze kako radi OOP i da nam mozda nece sve biti najjasnije i da ce se ostatak nejasnoca pokriti u daljim poglavljima.
Ja mislim da sam ja shvatio kako radi ceo program pa ako bih mogao da vam napisem kako to izgleda iz mog ugla da mi vi kazete da li sam u pravu ili ne.
Takodje ima jedna samo mala nejasnoca zbog koje ce mi trebati vasa pomoc.

Ovo su tri klase programa.
Svrha programa je to da imamo tri igraca kojima je cilj da pogode zadati broj.

Code:

public class GuessGame 
{
    
    // GuessGame has three instance variables for the three Player object 
    
    Player p1;
    Player p2;
    Player p3;
    
    public void startGame()
    {
        // Create three player objects and assign them to the three Player instance variables
        
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();
        
        // declare three variables to hold the three guesses the player make 
        
        int guessp1 = 0;
        int guessp2 = 0;
        int guessp3 = 0;
        
        // declare three variables to hold a true or false based on player's answer
        
        boolean p1isRight = false;
        boolean p2isRight = false;
        boolean p3isRight = false;
        
        // Make a 'target' number that the player have to guess
        int targetNumber = (int) (Math.random() * 10); 
        System.out.println("I'm thinking of a number between 0 and 9...");
        
        while(true)
        {
            System.out.println("Number to guess is "+targetNumber);
            
            // call each player's guess() method
            
            p1.guess();
            p2.guess();
            p3.guess();
            
            // get each player's guess ( the result of their guess() method running) by accessing the number variable of each player
            
            guessp1 = p1.number;
            System.out.println("Player one guessed "+guessp1);
            
            guessp2 = p2.number;
            System.out.println("Player two guessed "+guessp2);
            
            guessp3 = p3.number;
            System.out.println("Player three guessed "+guessp3);
            
            // Check each player's guess to see if it matches the target number.If a player is right then set that players variable to be true (we set it false by default);
            
            if(guessp1 == targetNumber)
            {
                p1isRight = true;
            }
            if(guessp2 == targetNumber)
            {
                p2isRight = true;
            }
            if(guessp3 == targetNumber)
            {
                p3isRight = true;
            }
            
            // if player one OR player two OR player three is right.. (the || operator means OR)
            
            if(p1isRight || p2isRight || p3isRight)
            {
                System.out.println("We have a winner1");
                System.out.println("Player one got it right ? "+p1isRight);
                System.out.println("Player two got it right ? "+p2isRight);
                System.out.println("Player three got it right ? "+p3isRight);
                System.out.println("Game is over.");
                break;
            }
            else
                // otherwise stay in the loop and ask the players for another guess
            {
                System.out.println("Players will have to try again.");
            }
            
            
            
        }
    }
}


Code:

public class Player 
{
    int number = 0; // where the guess goes
    
    public void guess()
    {
        number = (int) (Math.random() * 10);
        System.out.println("I'm guessing "+number);
    }
}


Code:

public class GameLauncher 
{
    public static void main(String[] args) 
    {
        GuessGame game = new GuessGame();
        game.startGame();
    }
}


Po koracima:

Deo koji stavim pod crtom mi je malo nejasan

Main klasa: GameLauncher

1 - Ovaj deo mi je jasan pravimo objekat tipa klase
2 - Ovaj deo mi je jasan objekat game poziva metodu startGame()

Prelazimo na klasu GuessGame

3 - Ovde deklarisemo tri promenljive p1, p2 i p3 klase Player. Tacnije samo im dajemo referencu da upucuju na klasu Player ?
Ovaj deo me malo zbunjuje ? Ovde klasa pravi novi objekat ili sta se vec ovde desava, moze li iko ovaj korak malo da mi pojasni ?
Code:

        Player p1;
    Player p2;
    Player p3;

4 - Ovaj deo mi je jasan Ulazimo u metodu startGame()

5 - Sada promenljivama p1, p2 i p3 stvarno dodeljujemo objekte tipa Player ?
Code:

                p1 = new Player();
        p2 = new Player();
        p3 = new Player();

6 - Ovaj deo mi je jasan pravimo tri promenljive tipa boolean koje sadrze vrednost false.
7 - Ovaj deo mi je jasan promenljivoj targetNumber dajemo broj koji je tipa int i broj mora biti izmedju 0 - 9 dodeljuje se pomocu metode random
8 - Ulazimo u while petlju, koja ce non stop imati vrednost true sve dok se u kasnijem toku programa ne prekine naredbom break;
9 - preko objekta p1, p2 i p3 ulazimo u metodu guess u klasi Player
Code:

                        p1.guess();
            p2.guess();
            p3.guess();

10 - Promenljiva number dobija vrednost izmedju 0 i 9 zatim se ispisuje koji broj pogadja.
Code:

public void guess()
    {
        number = (int) (Math.random() * 10);
        System.out.println("I'm guessing "+number);
    }

11 - guessp1 dobija vrednost p1.number. Promenljiva number je dobila random vrednost kada smo bili usli u metodu guess() iz koraka 10, i sada je zadrzala tu vrednost ?
Code:

                        guessp1 = p1.number;
            System.out.println("Player one guessed "+guessp1);
            
            guessp2 = p2.number;
            System.out.println("Player two guessed "+guessp2);
            
            guessp3 = p3.number;
            System.out.println("Player three guessed "+guessp3);

12 - Ovo mi je jasno.
Code:

                        if(guessp1 == targetNumber)
            {
                p1isRight = true;
            }
            if(guessp2 == targetNumber)
            {
                p2isRight = true;
            }
            if(guessp3 == targetNumber)
            {
                p3isRight = true;
            }

13 - Ovo mi je jasno
Code:

if(p1isRight || p2isRight || p3isRight)


Ovo je kraj programa, ja sam sada vama ispisao kako sam ja shvatio da program radi, nejasnoce sam stavio pod crtom koje me malo zbunjuju.
Takodje imam jos jedno pitanje u vezi ovog programa koje me zbunjuje.
Zasto umesto ovog dela koda
Code:

        Player p1;
    Player p2;
    Player p3;

i ovog
Code:

                p1 = new Player();
        p2 = new Player();
        p3 = new Player();

Nismo mogli da spojimo u jedno i da napisemo jednostavno

Code:
 
Player p1 = new Player();
Player p2 = new Player();
Player p3 = new Player(); 
?

Na internetu sam procitao da kada bi smo to uradili da to onda ne bi bio pravi primer OOP programiranja ? Mozete li da mi objasnite zasto ?
Mozda sam postavio previse pitanja, ali samo sam pokusao da budem sto detaljniji. Hvala vam svima dobre volje ko izdvoji malo vremena da mi pomogne. :-) :-) :-)
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
45.56.148.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: GuessGame Head First Java primer da li sam shvatio.12.09.2015. u 21:40 - pre 104 meseci
Citat:
3 - Ovde deklarisemo tri promenljive p1, p2 i p3 klase Player. Tacnije samo im dajemo referencu da upucuju na klasu Player ?
Ovaj deo me malo zbunjuje ? Ovde klasa pravi novi objekat ili sta se vec ovde desava, moze li iko ovaj korak malo da mi pojasni ?


Ne, ovde se ne pravi novi objekat (nema `new = Player()` kao što vidiš), već se prave tri reference koje će kasnije
da upućuju na objekte. Zamisli na računu za uplatu, postoji mesto za uplatioca i primaoca, ali su oni nepopunjeni,
sve dok neko ne napiše "Petar Petrović".

Citat:
5 - Sada promenljivama p1, p2 i p3 stvarno dodeljujemo objekte tipa Player ?


Ovo su zapravo dva koraka - praviš objekte tipa Player (zauzimaš memoriju, pozivaš konstruktore, itd) i
postavljaš reference da pokazuju na njih.

Citat:
11 - guessp1 dobija vrednost p1.number. Promenljiva number je dobila random vrednost kada smo bili usli u metodu guess() iz koraka 10, i sada je zadrzala tu vrednost ?


Da. Vidiš, number je deo stanja tog objekta (u ovom slučaju njegovo potpuno stanje je opisano number-om,
jer ne postoji nijedno drugo polje). Dakle, ona opisuje objekat. Stanje objekta se menja
kada pozivaš metode koje menjaju stanje objekta (kao što je guess() koja menja vrednost number-a), ali nakon
te promene, objekat ostaje isti (pa i number) sve dok ne promeniš neko od njegovih polja ponovo (možda ponovnim
pozivanjem metode guess()).

Citat:
Na internetu sam procitao da kada bi smo to uradili da to onda ne bi bio pravi primer OOP programiranja ? Mozete li da mi objasnite zasto ?
Mozda sam postavio previse pitanja, ali samo sam pokusao da budem sto detaljniji. Hvala vam svima dobre volje ko izdvoji malo vremena da mi pomogne. :-) :-) :-)


Odlično pitanje!

Mogli smo. Ne veruj svemu na internetu (pa ni ovom odgovoru :-) ), mislim da nisu u pravu.

Kao što vidiš, GuessGame nema nekog smisla da ima stanje. U ovom slučaju stanje ove klase je opisano
sa ova tri Player objekta. Ali oni nemaju smisla izvan ove klase. Na primer da postoji u klasi Player
polje score koje vraća trenutni rezultat za korisnika na rang listi, onda bi GuessGame klasa možda
mogla biti proširena sa metodom koja vraća player-a sa najvišim score-om:

Code:
Player getWinner() { if (p1.score >= p2.score) return p1; else return p2; } // zanemario sam p3 radi čitljivosti


onda bi čuvanje referenci u polju klase imalo smisla. Ovako baš i nema, jer ti objekti više nisu
potrebni nakon što se startGame završi.
 
Odgovor na temu

[es] :: Java :: GuessGame Head First Java primer da li sam shvatio.

[ Pregleda: 1200 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.