Jogo
completaJuntando tudo o que fomos fazendo ao longo das várias secções deste capítulo, obtemos a classe Jogo
completa. Acrescentámos um atributo de instância mais – a designação do jogo –, e um método para revelar o valor do atributo. Alterámos também o construtor, para receber mais um parâmetro com o valor para esse novo atributo e o método toString
, para ficar coerente com esta alteração.
x/**
* Classe cujos objetos representam jogos
* @author Isabel Nunes
*/
public class Jogo {
/**
* O numero maximo de jogadores por jogo
*/
public static final int MAX_JOGADORES = 5;
/**
* O minimo e maximo de pontos que um jogador pode ter numa jogada
*/
public static final int MIN_PONTUACAO_JOGADA = 0;
public static final int MAX_PONTUACAO_JOGADA = 10;
// atributos que definem este jogo:
// A designacao do jogo
private String designacao
// A coleccao dos jogadores
private Jogador [] jogadores;
// Pontuacao objetivo
private int objetivo;
// Numero de jogadores em jogo
private int quantosEmJogo;
/**
* Construir um jogo.
* @param designacao A designacao deste jogo
* @param objetivo A pontuacao com que se ganha este jogo
* @requires objetivo > 0
*/
public Jogo (String designacao, int objetivo) {
this.designacao = designacao;
this.objetivo = objetivo;
this.jogadores = new Jogador [MAX_JOGADORES];
this.quantosEmJogo = 0;
}
/**
* A designacao deste jogo.
*/
public String designacao () {
return this.designacao;
}
/**
* A pontuacao objetivo deste jogo.
*/
public int pontuacaoObjetivo () {
return this.objetivo;
}
/**
* O numero de jogadores que estao em jogo.
*/
public int quantosEmJogo () {
return this.quantosEmJogo;
}
/**
* Juntar um jogador com um dado nome a este jogo.
* @param nomeJog O nome do jogador.
* @requires !this.estahEmJogo(nomeJog) &&
* this.quantosEmJogo() < MAX_JOGADORES
*/
public void juntarJogador (String nomeJog) {
this.jogadores[this.quantosEmJogo] = new Jogador (nomeJog);
this.quantosEmJogo++;
}
/**
* Retorna o jogador correspondente a um nome, ou null se nao houver.
* Metodo privado, auxiliar.
* @param nomeJog O nome do jogador.
* @returns O jogador com este nome se existir no jogo;
* null caso contrario
*/
private Jogador obterJogador (String nomeJog) {
Jogador result = null;
for (int i = 0 ; result == null && i < this.quantosEmJogo ; i++){
if (nomeJog.equals(this.jogadores[i].nome())){
result = this.jogadores[i];
}
}
return result;
}
/**
* 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) &&
* pontuacao >= MIN_PONTUACAO_JOGADA &&
* pontuacao <= MAX_PONTUACAO_JOGADA
*/
public void registarPontosJogada (String nomeJog, int pontuacao) {
this.obterJogador(nomeJog).registarPontos(pontuacao);
}
/**
* Um dado jogador estah em jogo?
* @param nomeJog O nome do jogador.
* @return true se o jogador com este nome estah inscrito neste jogo
* false caso contrario
*/
public boolean estahEmJogo (String nomeJog) {
return this.obterJogador(nomeJog) != null;
}
/**
* A pontuacao de um dado jogador deste jogo
* @param nomeJog O nome do jogador.
* @return A pontuacao do jogador com este nome
* @requires this.estahEmJogo (nomeJog)
*/
public int pontuacao (String nomeJog) {
return this.obterJogador(nomeJog).pontuacao();
}
/**
* A pontuacao maxima numa soh jogada de um dado jogador deste jogo
* @param nomeJog O nome do jogador.
* @return A pontuacao maxima numa soh jogada do jogador com este nome
* @requires this.estahEmJogo (nomeJog)
*/
public int maximoNumaJogada (String nomeJog) {
return this.obterJogador(nomeJog).maximoNumaJogada();
}
/**
* Este jogo jah terminou?
*/
public boolean terminou () {
return this.maiorPontuacao() >= objetivo;
}
/**
* Vencedor(es) deste jogo
* @return O nome do jogador que atingiu o objetivo. No caso de
* haver varios, aquele que teve a pontuacao mais alta numa
* soh jogada. No caso de haver varios, retorna os seus nomes
* @requires this.quantosEmJogo() > 0 && this.terminou()
*/
public String[] vencedores () {
// Os jogadores que tiveram a melhor pontuacao ex-aequo
Jogador[] melhores = this.osMelhores();
// calcular o maior dos maximos numa soh jogada
// o(s) jogador(es) que o obteve(iram) serah(ao) o(s) vencedor(es)
Jogador jog = melhores[0];
int maximo = jog.maximoNumaJogada();
for (int i = 1 ; i < melhores.length ; i++) {
jog = melhores[i];
int pontos = jog.maximoNumaJogada();
if (pontos > maximo) {
maximo = pontos;
}
}
String[] vencedores = new String[melhores.length];
int k = 0;
for (int i = 0 ; i < melhores.length ; i++) {
if (melhores[i].maximoNumaJogada() == maximo) {
vencedores[k] = melhores[i].nome();
k++;
}
}
// Soh interessa retornar os k primeiros elementos do vetor
// pois os outros estao a null
String[] resultado = new String[k];
for (int i = 0 ; i < k ; i++) {
resultado[i] = vencedores[i];
}
return resultado;
}
/**
* A maior pontuacao dos jogadores deste jogo
* @return O valor da maior pontuacao
* @requires this.quantosEmJogo() > 0
*/
public int maiorPontuacao () {
int maiorPontuacao = 0;
for (int i = 0 ; i < this.quantosEmJogo ; i++) {
int pontos = this.jogadores[i].pontuacao();
if (pontos > maiorPontuacao) {
maiorPontuacao = pontos;
}
}
return maiorPontuacao;
}
/**
* Os jogadores que teem a maior pontuacao geral.
* Metodo privado, auxiliar.
* @return Os jogadores que teem a maior pontuacao
* @requires this.quantosEmJogo() > 0
*/
private Jogador[] osMelhores () {
// Qual a melhor pontuacao?
int maiorPontuacao = this.maiorPontuacao();
// Nao sabemos quantos serao. No maximo serao this.quantosEmJogo
Jogador[] melhoresJogadores = new Jogador[this.quantosEmJogo];
int k = 0;
for (int i = 0 ; i < this.quantosEmJogo ; i++) {
if (this.jogadores[i].pontuacao() == maiorPontuacao) {
melhoresJogadores[k] = this.jogadores[i];
k++;
}
}
// Soh interessa retornar os k primeiros elementos do vetor
// pois os outros estao a null
Jogador[] resultado = new Jogador[k];
for (int i = 0 ; i < k ; i++) {
resultado[i] = melhoresJogadores[i];
}
return resultado;
}
/**
* Os nomes dos jogadores com pontuacao superior a um dado valor
* @param limiteInf O valor de comparacao.
* @requires this.quantosEmJogo() > 0
* @return Um vetor com os nomes dos jogadores deste jogo com
* pontuacao superior a limiteInf
*/
public String[] pontuacaoSuperiorA (int limiteInf) {
// Nao sabemos quantos serao. No maximo serao this.quantosEmJogo
String [] melhores = new String [this.quantosEmJogo];
int k = 0;
for (int j = 0 ; j < this.quantosEmJogo ; j++){
if (this.jogadores[j].pontuacao() >= limiteInf){
melhores[k] = this.jogadores[j].nome();
k++;
}
}
// Soh interessa retornar os elementos do vetor que
// nao sao null
String [] result = new String [k];
for (int i = 0 ; i < k ; i++){
result[i] = melhores[i];
}
return result;
}
/**
* Representacao textual deste jogo.
*/
public String toString () {
StringBuilder sb = new StringBuilder();
sb.append("Designacao do jogo: " + this.designacao + "\n");
sb.append("Objetivo do jogo: " + this.objetivo + " pontos" + "\n");
sb.append("Numero de jogadores: " + this.quantosEmJogo + "\n");
for (int i = 0 ; i < this.quantosEmJogo ; i++){
sb.append(this.jogadores[i].toString() + "\n");
}
return sb.toString();
}
}
Anterior: 11.7. Fim de jogo, vencedores e outros métodos
Seguinte: 11.9. Representação em UML – Unified Modeling Language