Jogo
Vamos agora implementar uma outra subclasse de Jogo
– uma classe que representa jogos que terminam quando tiver sido feito um dado número exato de jogadas – e em que vence quem alcançou a melhor pontuação ao fim dessas jogadas.
Não controlamos se os jogadores fizeram igual número de jogadas, nem se joga um de cada vez. A ideia é que este tipo de jogo seja suficientemente geral para representar não só jogos em que os jogadores jogam por rondas (um de cada vez em cada ronda) como também jogos em que as jogadas são registadas à medida que os jogadores as fazem, independentemente da ordem, ou de algum(ns) fazer(em) mais jogadas que outro(s). As classes cliente desta deverão escolher o número de jogadas de acordo com o pretendido (por exemplo, num jogo por rondas, o número de jogadas para terminar deve ser um valor múltiplo do número de jogadores que vão jogar).
Chamemos JogoNumeroExatoJogadas
a esta nova subclasse.
x/**
* Representa jogos que terminam ao fim de um dado numero de jogadas
* @author Isabel Nunes
*/
public class JogoNumeroExatoJogadas extends Jogo {
// Numero exato de jogadas ao fim do qual este jogo termina
private int numeroJogadasAFazer;
// Numero de jogadas jah efetuadas neste jogo
private int jogadasJahFeitas;
// Este jogo jah terminou?
private boolean jahTerminou;
/**
* Construir um jogo.
* @param designacao A designacao para o jogo
* @param numJogadas O numero de jogadas a fazer para que este jogo termine
* @requires designacao != null && numJogadas >= 0
*/
public JogoNumeroExatoJogadas(String designacao, int numJogadas) {
super(designacao);
this.numeroJogadasAFazer = numJogadas;
this.jogadasJahFeitas = 0;
this.jahTerminou = false;
}
/**
* O numero de jogadas a fazer neste jogo.
*/
public int numeroJogadasAFazer () {
return this.numeroJogadasAFazer;
}
/**
* O numero de jogadas jah feitas neste jogo.
*/
public int jogadasJahFeitas () {
return this.jogadasJahFeitas;
}
/**
* Registar a pontuacao, na jogada atual, de um dado jogador.
* @param nomeJog O nome do jogador.
* @param pontuacao A pontuacao obtida na jogada atual.
* @requires this.estahEmJogo (nomeJog)
*/
@Override
public void registarPontosJogada (String nomeJog, int pontuacao) {
super.registarPontosJogada(nomeJog,pontuacao);
this.jogadasJahFeitas++;
if (this.jogadasJahFeitas == this.numeroJogadasAFazer) {
this.jahTerminou = true;
}
}
/**
* Este jogo jah terminou?
*/
public boolean terminou() {
return this.jahTerminou;
}
/**
* Representacao textual deste jogo.
*/
@Override
public String toString () {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
sb.append("Numero de jogadas a fazer: " + this.numeroJogadasAFazer + "\n");
sb.append("Numero de jogadas jah feitas: " + this.jogadasJahFeitas);
return sb.toString();
}
}
Então, um objeto do tipo JogoNumeroExatoJogadas
tem cinco atributos de instância:
numeroJogadasAFazer
e jogadasJahFeitas
e o boolean
jahTerminou
definidos na própria classe JogoNumeroExatoJogadas
eString
designação
e o array jogadores
, herdados da classe Jogo
.A imagem seguinte representa o estado pretendido de um objeto do tipo JogoNumeroExatoJogadas
acabado de criar (com valor inicial para o número de jogadas a fazer de 4).
Além do valor do número de jogadas a fazer para terminar o jogo, que é dado como parâmetro do construtor, é necessário ir contabilizando cada jogada que é feita. Logo que o número de jogadas feitas iguala o número de jogadas por fazer, podemos considerar que o jogo está terminado.
Para fazer isto:
vamos acrescentar três atributos de instância:
int numeroJogadasAFazer
– que é inicializado com o valor do parâmetro correspondente no construtor e nunca mais muda o seu valor;int jogadasJahFeitas
– que é inicializado a zero e incrementado de uma unidade sempre que o método registarPontosJogada
é invocado;boolean jahTerminou
– que é inicializado a false
e colocado a true
no método registarPontosJogada
logo que o número de jogadas feitas iguala o número de jogadas a fazer;vamos redefinir o método que permite registar jogadas – registarPontosJogada
– acrescentando-lhe:
uma instrução que permita contabilizar mais uma jogada:
xthis.jogadasJahFeitas++;
e uma instrução que permita verificar se o jogo já pode ser considerado como terminado:
xxxxxxxxxx
if (this.jogadasJahFeitas == this.numeroJogadasAFazer) {
this.jahTerminou = true;
}
Mas isto não chega, como veremos de seguida.
Anterior: 14.6. Redefinição de métodos
Seguinte: 14.8. Ainda a redefinição de métodos