Pseudo Código
1. O programa gera um número inteiro entre 1 e 100 e pede ao jogador para adivinhar o número.
2. O jogador insere um número inteiro.
(Computação e output)
3. A cada tentativa de adivinhação um contador é somado por mais um.
4. Se o número que o jogador digitou for maior do que o número escolhido pelo programa, um aviso de “número acima do escolhido” aparece para o jogador e o jogo retorna para o passo dois.
5. Se o número que o jogador digitou for menor do que o número escolhido pelo programa, um aviso de “número abaixo do escolhido” aparece para o jogador e o jogo retorna para o passo dois.
6. Se o número que o jogador digitou for igual ao número escolhido pelo programa, um aviso de “Você acertou” aparece para o jogador e o jogo termina e mostra o número de tentativas que foram realizadas.
Esse pseudo código viola a essência dos princípios da programação POO, apesar do código está dentro da classe principal, isso apenas satisfaz o formato da programação Java. Então, o que fazer para esse código ser uma programação orientada a objetos.
Sabemos que o nosso jogo precisa de duas pessoas, essas duas pessoas se comunicam uma após a outra para realizar as ações do jogo. Correspondente, no paradigma da POO, o projeto precisa de dois objetos para cuidar das ações necessárias e enquanto outro preserva as ações na sequência.
Dois objetos são refletidos em duas classes na programação orientada a objetos e as ações são enviadas para as diferentes classes. Apesar das pessoas do nosso pseudo código serem pessoas, elas têm comportamentos diferentes.
O Novo Pseudo Código
Sendo assim, temos que criar duas classes para cuidar desses comportamentos. Uma classe refere-se a pessoa A que tem as regras do jogo e a outra classe refere-se a pessoa B que segue a regra como jogador.
Inicialmente, uma classe (Initializer.java) começa o jogo escolhendo um número inteiro e pedido ao jogador para começar a jogar. Outra classe (Player.java) recebe o sinal e fornece ao jogador um meio para inserir um número.
Depois de enviar o número que o jogador está tentando adivinhar ele é comparado com o número que o programa escolheu. Se os dois números não são iguais, o jogador é avisado que não acertou e assim continua até o jogador acertar o número. Resumindo:
Initializer – 1. Gera um número
Player – 2. Digita um número
Initializer – 3. Verifica se os números são iguais
Player – 4. Se número não são iguais, volte para o passo 2, se são iguais o jogo termina.
Claramente, a classe Initializer e a Player tem comportamentos diferentes, e eles devem ser capaz de se comunicarem um com o outro para trocarem dados.
Como fazemos para duas classes se comunicarem? Há duas abordagens. Uma é criar duas classes mandando dados um para outra. Já fizemos isso no projeto PrintXmasCard https://cursojavanow.com.br/a-classe-xmascard-do-projeto-printxmascard/.
Podemos aplicar essa abordagem deixando a classe Initializer.java utilizar a classe Player.java para obter o número da tentativa de adivinhação. Mas, essa abordagem faz uma classe controlar a outra.
A outra abordagem é fazer uma terceira classe para ser o lugar de “encontro” para trocar dados uma com a outra. Essa abordagem é a melhor para o caso desse jogo.
Portanto, vamos criar uma terceira classe para cuidar das comunicações entre as duas classes. Esse terceiro objeto na verdade é um controlador que instância dois objetos e invoca comportamentos e interações desses objetos.
O Diagrama do Projeto
A terceira classe pode ser a classe principal. Contudo, queremos fazer uma classe principal o mais simples possível. Considerando todas essas considerações, vamos construir um programa com três classes mais a classe principal.
O nome da terceira classe será a GamePanel.java. Veja a imagem para entender melhor o padrão.
Baseado nas comunicações entre três classes GamePanel.java, Initializer.java e Player.java, podemos escrever um novo pseudo código.
1. GamePanel.java instância um objeto do Initializer initializer (1 e 2).
2. GamePanel.java instância um objeto de Player player (3 e 4).
3. GamePanel.java invoca o método initializer.initGame() (5), a qual gera um inteiro entre 1 e 100 (6).
4. GamePanel.java invoca o método player.playingGame() (7), que permite o player digitar um número para uma variável guessedInt e retorna o valor para o GamePanel.java (8).
5. GamePanel.java envia o valor de guessedInt submetido pelo o jogador para o método intializer.receiveGuess() (9), o qual invoca intializer.isGuessCorrect(), método que diz se o número é maior, menor ou correto (10).
6. Se “correto”, executa o método terminateGame() o qual mostra ao jogador “Você acertou xx vezes” e o jogo termina. Retorna para o passo 4.
Pseudo código terminado, vamos para a implementação do código.
Player.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import javax.swing.JOptionPane; public class Player{ private String guessedIntStr; private int guessedInt; public Player(){} public int playingGame(){ guessedIntStr = JOptionPane.showInputDialog("Digite um número inteiro entre 1 e 100"); guessedInt = Integer.parseInt(guessedIntStr); System.out.println("O meu palpite é " + guessedInt); return guessedInt; } } |
Initializer.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public class Initializer{ private int givenInt; private boolean match; public Initializer(){} public void initGame(){ givenInt = (int) (Math.random() * 100 + 1); // [1, 100] match = false; System.out.println("Eu já escolhi um número entre 1 e 100"); System.out.println("Agora tente adivinhar. Boa sorte! \n"); } public boolean receiveGuess(int receiveGuess){ match = isGuessCorrect(receiveGuess); return match; } public boolean isGuessCorrect(int playerGuess){ boolean correct = false; if(playerGuess == givenInt){ System.out.println("Seu palpite " + playerGuess + " está correto!"); correct = true; }else if(playerGuess > givenInt){ System.out.println("Seu palpite " + playerGuess + " é maior."); }else if(playerGuess < givenInt){ System.out.println("Seu palpite " + playerGuess + " é menor."); } return correct; } } |
GamePanel.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public class GamePanel{ private Initializer initializer; private Player player; private int playerInt; private boolean guessCorrect; private int numGuess; public GamePanel(){ guessCorrect = false; numGuess = 0; initPartner(); } private void initPartner(){ initializer = new Initializer(); player = new Player(); startGame(); } public void startGame(){ initializer.initGame(); playGame(); } public void playGame(){ while(!guessCorrect){ numGuess++; playerInt = player.playingGame(); guessCorrect = initializer.receiveGuess(playerInt); } terminateGame(); } public void terminateGame(){ System.out.println("O jogo terminou"); System.out.println("\nTotal, você tentou acertar " + numGuess + " vezes."); } } |
GuessInt.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class GuessInt { private String gameDescription; public GuessInt(){ gameDescription = "Esse é um jogo de adivinhação de números. Jogo: Adivinhe o Número.\n" + "Adivinhe um número entre 1 e 100. \n" + "O jogo escolhe um número inteiro e o jogador tenta adivinhar esse número. \n" + "O jogador que adivinhar com menos palpites, vence o jogo. "; System.out.println(gameDescription); new GamePanel(); } public static void main(String[] args){ new GuessInt(); } } |
Fonte: Learning Java with Games
Deixe um comentário