Laboratório 02

Propaganda
Universidade Federal de Campina Grande – UFCG
Centro de Engenharia Elétrica e Informática – CEEI
Departamento de Sistemas e Computação – DSC
Professores: Gustavo Soares (turma 1)
Raquel Lopes (turma 2)
Livia Campos (turma 3)
Kyller Gorgônio (turma 4)
Disciplina: Laboratório de Programação 2
Período: 2014.1
Laboratório 02
Neste laboratório iremos experimentar a edição e compilação de programas simples em Java,
explorando entrada de dados através do teclado, estruturas de repetição e mais detalhes de
operadores em Java.
Importante:




Antes da definição de cada classe escreva o seu nome em comentário (/*Aluno: <seu
nome>*/);
A partir deste roteiro você poderá usar o Eclipse como ambiente de desenvolvimento Java;
Crie no eclipse o projeto lab02 (File -> New -> Java Project) e programe todos os
exercícios dentro do pacote lp2.lab02 que está dentro deste projeto;
Neste laboratório você vai usar estruturas de desvio e repetição, além de tipos primitivos e
leitura a partir da entrada padrão (use a classe java.util.Scanner). Pode também fazer
modularização usando métodos. Porém, não usar arrays. Consulte o material da disciplina
teórica aqui.
Entendendo o problema
Pedra-Papel-Tesoura é um jogo simples para ser jogado apenas com as mãos e que não requer
nenhuma habilidade especial ou equipamentos específicos. O jogo é frequentemente usado como
método de seleção (como na escolha de equipes para a prática desportiva, por exemplo), assim
como lançar moedas, jogar dados, ou tirar par-ou-ímpar. As regras são bastante simples.
Os jogadores devem simultaneamente esticar a mão, formando um símbolo (que significa pedra,
papel ou tesoura) e comparam os símbolos para decidir quem ganhou, da seguinte forma:
 Pedra ganha da tesoura (amassando-a ou quebrando-a);
 tesoura ganha do papel (cortando-o);
 papel ganha da pedra (embrulhando-a).
A pedra é simbolizada por um punho fechado; a tesoura, por dois dedos esticados; e o papel,
pela mão aberta. Caso dois jogadores façam o mesmo gesto, ocorre um empate, e geralmente se
joga de novo até desempatar.
Uma variação desse jogo é o Pedra-Papel-Tesoura-Lagarto-Spock.
Uma generalização desse jogo é criar um índice para cada um dos elementos (pedra, papel,
tesoura, etc.), onde esse índice é um número de 1 até n (onde n é o número total de elementos).
Por exemplo, podemos ter: pedra = 1, papel = 2 e tesoura = 3. Cada um dos jogadores escolhe
um número entre 1 e n, e o vencedor pode ser escolhido por uma operação módulo trivial.
Digamos que o jogador 1 escolha o número i e o jogador 2 escolha o número j. O resultado do
jogo pode ser calculado usando a fórmula
res = |(n + i – j) mod n|
1
Se:



0 < res ≤ n/2, então o jogador 1 ganha;
res > n/2, então o jogador 2 ganha;
res = 0, então houve empate.
Passo1: Implemente um programa chamado PedraPapelTesoura.java para simular o jogo descrito
acima. Considere o jogo para n = 3 (mas, seu programa deve ser facilmente estendido para suportar
outros valores de n); 2 jogadores. Os valores de cada jogador serão lidos do teclado usando a classe
java.util.Scanner (consulte o material aqui para lembrar como se usa essa classe). Seu programa
deve informar o jogador vencedor da rodada.
Um exemplo de execução do seu programa:
Pedra (1), Papel (2), Tesoura (3)? 3
Pedra (1), Papel (2), Tesoura (3)? 2
TESOURA - PAPEL
Jogador 1 Ganhou!
Passo3: O que acontece se o usuário fornecer uma entrada inválida para seu programa?
Certifique-se de estar lendo um número inteiro no intervalo [1, n]. Caso o usuário informe um
outro tipo de dado ou um inteiro negativo, solicite um valor, até que o valor fornecido pelo
usuário seja válido.
Passo3: Seu programa fez o maior sucesso e agora você deve modificá-lo para permitir várias
partidas (o programa continua até que o usuário digite -1).
Passo4: Modularize seu código para que ele fique mais organizado, simples e possa ser mais
reusado. Experimente, por exemplo, modularizar a leitura da opção de cada jogador, a jogada e a
decisão do vencedor.
Jogo++: Que tal fazer um dos jogadores ser o computador? Uma dica é usar um gerador de
números randômicos (java.util.Random) que escolha o valor do computador.
Jogo++: No jogo quando se tem empate, automaticamente inicia-se uma nova partida. Modifique
seu programa para permitir isso.
Para exercitar mais
1. Quantos pares de coelhos podem ser gerados de um par de coelhos em 365 dias (1 ano)? Um
homem ganhou um par de coelhos que serão criados em um ambiente inteiramente fechado.
Quantos pares de coelhos podem ser gerados deste par em um ano, se de um modo natural a
cada mês ocorre a produção de um par e um par começa a produzir coelhos quando completa
dois meses de vida? Escreva um programa em Java que resolva este enigma.
2. Quantas vezes você deve rolar um par de dados (bozó, etc.) antes que eles mostrem os
“olhos de cobra”? Você pode fazer o experimento rolando os dados agora... Escreva um
programa de computador que simula esse experimento. O programa deve imprimir na tela o
número de rodadas necessárias para os dados mostrarem os “olhos de cobra”.
a. Dica: para simular a rolagem de um dado você pode usar a classe java.util.Random.
Algumas dicas que podem ser úteis
1. Lembrando as estruturas de repetição apresentadas no material da disciplina:
2
for(int i=0; i<LIMITE; i++){ //LIMITE é uma constante
bloco de comandos do for
}
while(condição verdade){
bloco de comandos do while
}
do{
bloco de comandos do while
}while(condição verdade);
O comando de decisão switch (para situações com ifs encadeados sobre condições para a mesma
variável)
switch(variável){
case valor1:
<bloco de comandos>
break;
case valor2:
<bloco de comandos>
break;
case...
default:
}
2. Evite números mágicos no seu código usando constantes.
...
final int SAIR = -1;
int opcao;
//leitura de opcao do teclado
if(opcao == SAIR)...
3. Usando a classe java.util.Random
...
Random r = new Random(); //cria um gerador de números randômicos.
r.nextInt(); //retorna o próximo inteiro randômico (distribuição uniforme).
r.nextInt(5); //retorna o próximo inteiro randômico no intervalo [0, 5[.
3
Download