Dúvida com código do Use a cabeça Java

13 respostas
R

Olá a todos, sou iniciante em java e estou lendo o use a cabeça java.

estou com dúvida no seguinte código do capitulo dois. Se trata de um jogo, onde o computador pensa em um número e 3 players ficticios (que são uma espécie de inteligencia artificial) chutam o número que o computador pensou.

A forma como foi programado segue bem os conceitos de orientação a objetos e é formado por 3 classes.

public class GuessGame {

   Player p1; // não entendi a declaração desses 3 variáveis, porque no livro geralmente declaravam a variável do tipo int, double, float, String, etc... E não do tipo de uma classe
   Player p2;
   Player p3;
   
   public void startGame() {
       p1 = new Player();
       p2 = new Player();
       p3 = new Player();
       int guessp1 = 0;
       int guessp2 = 0;
       int guessp3 = 0;
       boolean p1isRight = false;
       boolean p2isRight = false;
       boolean p3isRight = false;
       int targetNumber = (int) (Math.random() * 10);
       System.out.println("I'm thinking of a number between 0 and 9...");
       while(true) { //Este laço while eu também não entendi... primeiro, porque não tem contador e segundo... "True" o que, o que seria true nesse exemplo?
           System.out.println("Number to guess is " + targetNumber);
           
           p1.guess();
           p2.guess();
           p3.guess();
           
           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);
           
           if (guessp1 == targetNumber) {
               p1isRight = true;
           }
           if (guessp2 == targetNumber) {
               p2isRight = true;
           }
           if (guessp3 == targetNumber) {
               p3isRight = true;
           }
           
           if (p1isRight || p2isRight || p3isRight)
           {
               System.out.println("We have a winner!");
               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
           {
               System.out.println("Players will have to try again.");
           }
       }
   }
}
public class Player {
    int number = 0;
    public void guess()
    {
        number = (int) (Math.random() * 10);
        System.out.println("I'm guessing " + number);
    }
}
public class GameLauncher {
    public static void main (String[] args) {
        GuessGame game = new GuessGame();
        game.startGame();
    }
}

Bom, se puderem esclarecer minhas duvidas nos lugares marcados ficarei agradecido. Obrigado ^^

13 Respostas

mauricioadl

a declaração das variaves do tipo player eh normal, vc esta programando orientado a objetos, na mais comum que declarar e manipular objetos. certo?!?!?

while(true) significa que o looping vai rodar eternamente.

ddenis3526
public class GuessGame {  
      
       Player p1;
 /** Conceito de orientação objto, vc tem 3 player's  cada um chutará um determinado valor, aqui ele faz 3 referencia da classe Player  e depois ele adciona um novo valor. Não tem pq criar um int, double ou float, estamos tratando de um jogador, não de um atributo do jogador... nada melhor que representar esse player como uma classe e colocar em forma de metodo a sua funcionalidade ( chutar o numero rsrs ) **/
       Player p2;  
       Player p3;  
         
       public void startGame() {  
           p1 = new Player();  
           p2 = new Player();  
           p3 = new Player();  
           int guessp1 = 0;  
           int guessp2 = 0;  
           int guessp3 = 0;  
           boolean p1isRight = false;  
           boolean p2isRight = false;  
           boolean p3isRight = false;  
           int targetNumber = (int) (Math.random() * 10);  
           System.out.println("I'm thinking of a number between 0 and 9...");  
           while(true) { // Não a nescessidade desse while ser um contator, ele é representativo, o while só vai parar apenas quando a função abaixo for satisfeita ai ele lança o "break" . Seria "Enquanto ninguém acertar... vamos continuar o jogo!" 
               System.out.println("Number to guess is " + targetNumber);  
                 
               p1.guess();  
               p2.guess();  
               p3.guess();  
                 
               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);  
                 
               if (guessp1 == targetNumber) {  
                   p1isRight = true;  
               }  
               if (guessp2 == targetNumber) {  
                   p2isRight = true;  
               }  
               if (guessp3 == targetNumber) {  
                   p3isRight = true;  
               }  
                 
               if (p1isRight || p2isRight || p3isRight)  
               {  
                   System.out.println("We have a winner!");  
                   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  
               {  
                   System.out.println("Players will have to try again.");  
               }  
           }  
       }  
    }

Tb sou novato, desculpem se disse alguma besteira :D

R

Mas poderia explicar melhor o que a declaração significa? ainda não entendi

ddenis3526

Vamos usar uma lógica alternativa, pense, Vc tem 3 amigos que vão jogar esse jogo com vc… mas antes de vc começar a jogar, vc quer saber quem são esses jogares, então vc faz uma referencia deles em um papel e fala “Jão vai jogar, Pedro tb, e Carlitos” Aii depoooiiiis vc chama eles e começa o jogo. Vc fez uma referencia desse objto então sua JVM cria uma pré-instancia deles para quando vc for utilizar.

pS: Essa é a ideia que tenho, se eu estou falando alguma abrobinha me corrigam ^^ obrigado e paciencia.

ribclauport

Objetos, podem conter objetos certo?

Ou seja um carro tem um motor, motor é um objeto certo?
Sendo assim o game tem players, o nome disto é “composição”, procure no google:

java+relacionamento tem um

Ou seja um carro tem um motor
Um jogo tem um jogador

e por ae vai…

la no while(true) ele está ocaionando um loop que somente será quebrado quando alcançar a instrução break que está presente no código abaixo:

if (p1isRight || p2isRight || p3isRight) { System.out.println("We have a winner!"); 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; }

espero ter ajudado.

lucas_guj

Tem certeza? Que eu saiba objetos não contem objetos. Nem mesmo as variaveis de referencia contem objetos, contem apenas um meio de se chegar até eles, que estao armazenadas na HEAP, Então acredito que quem contem objetos é a HEAP.

robferlima, tente continuar lendo o livro para você ver se consegue entender variaveis de referencia.

ribclauport

A rapaiz ta bitolado em heap heim!

Um carro não tem um motor?

Objeto carro não tem um objeto motor?

Os carros que eu vejo na rua são objetos, e os motores também, e os carros “tem um motor”, se não for assim por favor me diga.

Orientação a objetos nasceu antes do java, e antes de tudo é um conceito, pense bem antes de falar asneira.

ribclauport

Aproveita e manda um email la para o wikipédia, por que eles tão usando a palavra “contendo” veja abaixo:
E eu achei aqui mais um 30 links dizendo que objetos contém outros objetos, ae acho que tem um monte de gente pensando errado, e só você e seu heap está certo!

Objetos compostos são frequentemente referidos como tendo um relacionamento “tem um”. Um exemplo de composição do mundo real pode ser visto em um automóvel: os objetos roda, volante, banco, transmissão e motor podem não ter utilidade funcionando isoladamente, mas um objeto chamado automóvel [color=red]contendo [/color]todos estes objetos teria uma função muito útil, maior que a soma de todas as suas partes.

http://pt.wikipedia.org/wiki/Composi%C3%A7%C3%A3o_de_objetos

ribclauport

post duplicado.

lucas_guj

ribclauport:
Aproveita e manda um email la para o wikipédia, por que eles tão usando a palavra “contendo” veja abaixo:
E eu achei aqui mais um 30 links dizendo que objetos contém outros objetos, ae acho que tem um monte de gente pensando errado, e só você e seu heap está certo!

Objetos compostos são frequentemente referidos como tendo um relacionamento “tem um”. Um exemplo de composição do mundo real pode ser visto em um automóvel: os objetos roda, volante, banco, transmissão e motor podem não ter utilidade funcionando isoladamente, mas um objeto chamado automóvel [color=red]contendo [/color]todos estes objetos teria uma função muito útil, maior que a soma de todas as suas partes.

http://pt.wikipedia.org/wiki/Composi%C3%A7%C3%A3o_de_objetos

Já estudei composição. O que quis dizer foi que Objetos não contem objetos, vamos dizer “LITERALMENTE” porque que eu saiba uma variavel de referencia nao armazena um objeto, não armazena os bits do objeto e sim como se chegar até ele. Já uma variavel primitiva armazena o valor literal que está dentro dela a representação daquilo. Talvez nossas ideias entraram em conflito por eu levar ao pé da letra e você não. Então quando um objeto CARRO tem um objeto MOTOR, digo que uma variavel que referencia o Objeto Carro contem uma variavel que referencia um objeto Motor!!!

Porque quando alguem expressa a sua opinião e não bate com a de outro usuário “vocês” já parecem nervoso e meio que partir para agresão?
Olha bem o meu post:

Tinha uma pergunta no começo dela viu? Não te insultei nem nada. Sei que também não me insultou. Mais esse negocio ah entao manda um email para o wikipedia parece coisa de criança¬¬

Bom, mais é isso ai. Quem estiver de fora e está vendo a “discussão” e quiser me corrigir, sinta-se a vontade, afinal isso aqui é publico e quanto mais informação correta, melhor. E quanto ao criador do tópico acho melhor nem prestar atenção na nossa “discussão” se não pode confundir mais ainda.

ribclauport


Já estudei composição. O que quis dizer foi que Objetos não contem objetos, vamos dizer “LITERALMENTE”

Precisa então prestar atenção, antes de fazer perguntas.
Dirija a pergunta, citando o autor do post, tipo:

Tem certeza ribclauport, que objetos tem objetos? Eu penso que objetos residem no heap… o que você acha?

Entendeu?

Você disse da seguinte forma:

Tem certeza? Que eu saiba objetos não contem objetos. Nem mesmo as variaveis de referencia contem objetos, contem apenas um meio de se chegar até eles, que estao armazenadas na HEAP, Então acredito que quem contem objetos é a HEAP.

Rapaiz você usou linguagem conotativa, uma pergunta que na verdade quer dizer “Você esta errado”, depois disse “acredito que quem contem objetos e a HEAP”,
não disse “acho que quem contem objetos e a HEAP”.

Você não fez uma pergunta, fez uma crítica ao meu post, e depois piorou as coisas dizendo

Você disse literalmente, afirmou indiretamente que eu estava errado, e de quebra ainda usou a palavra “criança”, quem está vendo a nossa discussão com certeza, vai olhar para a rua, e vai verificar que um carro tem um motor, que uma pessoa tem um coração, ou seja:

Que um objeto “tem um” outro objeto. Aliás se “tem um” não quer dizer neste contexto:

“Um objeto tem outro objeto”

Então desconsidere tudo o que eu disse.

lucas_guj

Nesse caso eu não precisei me dirigir a você porque você mesmo soube que eu me dirigi a você, então colocar o seu nome teria sido desnecessário. Talvez o meu modo de se expressar e “falar” neste post tenha parecido um pouco agressivo para você. Questão de interpretação. No caso você interpretou assim. Mas garanto que não foi. Fiz uma pergunta, mas não afirmando que estava errado. Fiz uma pergunta esperando sua resposta técnica. E com o meu “QUE EU SAIBA”:

Talvez tenha parecido para você:
Você está falando M%#%#$ e eu sei mais que você.

Mas não foi isso.

E quanto ao que disse que eu piore dizendo a palavra “LITERALMENTE”, acho que você também interpretou errado. Quando me referi LITERALMENTE, me referi ao valor LITERAL da variavel, a exatamente o que está ali dentro, aqui lá é aquilo lá entende? Quanto a palavra criança que usei, AI SIM, realmente fiz uma critica ao seu post dizendo para eu mandar um email para wikipedia. Tipo achei rediculo e desnecessário no seu post. Na minha opiniao o que aconteceu foi: Eu falei de uma maneira e você interpretou de um jeito, e eu levei o seu post relacionado a objetos ao Pé da Letra. A questão é, você concorda comigo em relação ao pé da letra? Sem levar por esse lado, é claro que eu concordo que um objeto “tem um” objeto na composição. Afinal quando estudei aprendi assim e com essas palavras que você mesmo usou. Se meu modo de falar pareceu agressivo a você peço desculpas. Embora muitos diriam, ah q se F*¨&% não tenho que mudar meu modo de falar pq um carinha do post achou diferente. Mas no meu caso, acho isso importante, principalmente se for em uma relação de trabalho. Então da próxima vez vou tentar me expressar melhor ao fazer um comentario que eu nao concorde com alguem. E você o que tem a dizer?

lucas_guj

E quanto a duvida do criador do tópico, vamos esperar para ver se ele já entendeu ou não e se precisamos explicar mais. Porque com essa discussão talvez tenha saido o foco dele, se é que ele já viu o tópico e não respondeu.

Criado 19 de março de 2012
Ultima resposta 20 de mar. de 2012
Respostas 13
Participantes 5