Voltemos agora à nossa classe Jogo
.
Para registar pontuações de jogadas dos jogadores do jogo, adicionamos o seguinte método de instância à classe Jogo
:
/**
* 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 O jogador com o nome nomeJog estah registado neste jogo &&
* pontuacao >= 0 && pontuacao <= 10
*/
public void registarPontosJogada (String nomeJog, int pontuacao) {
Jogador atual = null;
for (int i = 0 ; atual == null && i < this.quantosEmJogo ; i++){
if (nomeJog.equals(this.jogadores[i].nome())){
atual = this.jogadores[i];
}
}
atual.registarPontos(pontuacao);
}
Este método exige que o primeiro parâmetro represente um nome de um jogador que já está registado no jogo. Primeiro encontra o jogador com o nome dado e de seguida invoca, sobre esse jogador, o método que permite adicionar a pontuação indicada.
Adicionemos agora a instrução seguinte ao método main
da classe ClienteDeJogo
,
xxxxxxxxxx
meuJogo.registarPontosJogada("Pedro",7);
As figuras seguintes ilustram o estado da memória em várias fases da execução desta instrução:
registarPontosJogada
é invocado (repare o valor de this
no contexto deste método – é o mesmo conteúdo da variável meuJogo
, como seria de esperar): atual
e i
, o método registarPontosJogada
invoca, através da instrução if (nomeJog.equals(this.jogadores[i].nome()));
, o método nome
sobre o objeto referenciado por this.jogadores[0]
, que é o jogador de nome "Maria"; a figura seguinte mostra o estado da memória quando é feita essa invocação; repare no valor de this
no contexto do método nome
– é precisamente o objeto referenciado pelo primeiro elemento do array jogadores
: como o nome do primeiro elemento do array jogadores
não é igual ao valor do parâmetro nomeJog
(que é "Pedro"), a variável i
é incrementada e o método nome
é agora invocado sobre o segundo elemento do array jogadores
; a figura seguinte mostra o estado da memória quando é feita a invocação do método nome
sobre esse segundo elemento do array:
o jogador que se procurava foi encontrado e a sua referência foi guardada na variável atual
; a guarda do ciclo passa a ser falsa:
de seguida, a última instrução do método registarPontosJogada
invoca o método registarPontos
sobre o objeto referenciado pela variável atual
; a figura seguinte mostra o estado da memória na altura da invocação do método registarPontos
:
a figura seguinte mostra o estado da memória já no fim da execução do método registarPontos
:
depois do método registarPontos
terminar, o controle de execução volta ao método registarPontosJogada
e o jogador de nome "Pedro" já tem os seus atributos pontuacao
e maximoJogada
atualizados:
finalmente, já depois do método registarPontosJogada
terminar, o objeto referenciado pela variável meuJogo
já está atualizado pois o seu jogador de nome "Pedro" já tem os seus atributos pontuacao
e maximoJogada
atualizados:
Na próxima secção vamos ver uma versão melhorada deste método.
Anterior: 11.2. Registar jogadores no jogo
Seguinte: 11.4. Outros métodos relativos a um dado jogador do jogo