1. Herança
Para trabalhar com o mecanismo de jogo CodeGym, você precisará usar a herança . Mas e se você não souber o que é isso? Por um lado, você precisa entender e estudar este tópico. Por outro lado, o mecanismo foi especialmente projetado para ser muito simples, para que você possa se virar com um conhecimento superficial de herança.
Então, o que é herança? Em termos simples, a herança é um relacionamento entre duas classes. Uma delas atua como a classe pai e a outra se torna a classe filha (descendente). Além do mais, uma classe pai pode nem saber que tem classes descendentes. Em outras palavras, o pai não obtém muito benefício de ter classes descendentes.
Mas a herança oferece muitas vantagens para a classe filha. A mais importante delas é que todas as variáveis e métodos da classe pai apareçam na classe filha, como se o código da classe pai fosse copiado diretamente para a classe filha. Isso não é totalmente preciso, mas será suficiente para uma compreensão básica da herança.
Aqui estão alguns exemplos para ajudá-lo a entender melhor a herança.
Exemplo 1 — aqui está o exemplo mais simples
|
A Childclasse herda a Parentclasse com a ajuda da extendspalavra-chave. |
|
Exemplo 2 — usando as variáveis da classe pai
|
A Childclasse pode usar os campos agee nameda Parentclasse como se fossem declarados na Childprópria classe. |
|
Exemplo 3 — usando métodos da classe pai
|
A Childclasse pode usar as variáveis e métodos da classe Parent como se fossem declarados na Childclasse. Neste exemplo, usamos o getName()método. |
|
Omitindo alguns detalhes, podemos dizer que, do ponto de vista do compilador Java, simplesmente copiamos o código da classe pai para o código da classe filha:
public class Child extends Parent
{
public int age; // An inherited variable public String name; // An inherited variable public getName() { // An inherited method return name; }
public void printInfo()
{
System.out.println(getName() + " " + age);
}
}
Childclasse aparece do ponto de vista do compilador
2. Sobreposição de método
Às vezes, há situações em que fazemos nossa Childclasse herdar uma classe muito útil Parent, fazendo com que o filho herde todas as variáveis e métodos do pai. Mas alguns desses métodos podem não funcionar da maneira que queremos ou não funcionar da maneira que queremos.
O que você faz neste caso? Podemos sobrescrever um método cuja implementação não gostamos . Isso é algo simples de fazer: em nossa Childclasse, simplesmente declaramos um método com a mesma assinatura do método da Parentclasse e, em seguida, escrevemos nosso próprio código nele.
Exemplo 1 — substituição de método
|
O printInfo()método exibirá a seguinte frase: |
|
Simplificando um pouco a situação, a herança faz com que o código da classe pai seja copiado para a classe filha. Mas se uma classe descendente já possui um método que existe em uma classe ancestral, esse método não é copiado da classe ancestral. Aqui dizemos que o método na classe filha substitui o método na classe pai. Veja o exemplo abaixo. Talvez isso ajude a tornar as coisas um pouco mais claras:
| Veja como a classe Child aparece do ponto de vista do compilador: |
|---|
|
Exemplo 2 - um pouco de mágica de herança (e substituição de método)
public class Parent
{
public getName() {
return "Luke";
}
public void printInfo()
{
System.out.println( getName() );
}
}
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
}
Se o printInfo()método for chamado em um Parenttipo, ele, por sua vez, chamará o getName()método da Parentclasse.
Se o printInfo()método for chamado em um Childobjeto, ele por sua vez chamará o getName()método da Childclasse.
Em outras palavras, o printInfo()método é declarado apenas na Parentclasse, mas chama o getName()método da Childclasse se o printInfo()método for chamado em um Childobjeto.
Exemplo:
|
Este código exibe o seguinte texto na tela: |
|
Este código exibe o seguinte texto na tela: |
E tudo porque do ponto de vista do compilador (uma versão bem simplificada dele), o código da Childclasse fica assim:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo() { System.out.println(getName()); }
}
Childclasse aparece do ponto de vista do compilador
3. Listas
Aqui está um breve lembrete sobre listas ( List). Listas têm muito em comum com arrays:
- Eles podem armazenar muitos dados de um tipo específico.
- Eles permitem que você obtenha elementos por seu índice.
- Os índices dos elementos começam em
0.
Vantagens das listas:
Ao contrário dos arrays, as listas podem mudar de tamanho dinamicamente. Imediatamente após a criação, o tamanho de uma lista é 0. Conforme os itens são adicionados à lista, seu tamanho aumenta. Exemplo de criação de uma lista:
ArrayList<String> myList = new ArrayList<String>();
ArrayList
O valor indicado entre os colchetes angulares é o tipo de dados que a lista pode armazenar.
Aqui estão alguns métodos para trabalhar com uma lista:
| Código | Descrição breve |
|---|---|
|
Criando uma nova lista de strings |
|
Adicionar um elemento ao final da lista |
|
Adicionar um elemento ao início da lista |
|
Obter um elemento por seu índice |
|
Alterar um elemento por seu índice |
|
Obter o número de elementos na lista |
|
Remover um elemento da lista |
Para obter mais informações sobre listas, você pode ler os seguintes artigos:
4. Números aleatórios
O motor de jogo CodeGym tem dois métodos que podem ser usados para gerar números aleatórios. Esses métodos são:
int getRandomNumber(int max)
int getRandomNumber(int min, int max)
O primeiro método — getRandomNumber(int max)— retorna um número aleatório no intervalo 0, 1, 2, ... max-1. Nos bastidores, ele usa a Randomclasse do java.utilpacote, mas isso não muda como você usa um número aleatório.
getRandomNumber(int)aceita um número inteiro como argumento. Esse número será o limite superior dos números que o gerador de números aleatórios pode retornar. O limite inferior é 0. Atenção! O gerador de números aleatórios NUNCA retornará o valor do limite superior. Por exemplo, se você chamar getRandomNumber(3), ele retornará aleatoriamente 0, 1 ou 2. Como você pode ver, ele não retornará 3. Usar um gerador de números aleatórios dessa maneira é bastante simples, mas é adequado para muitos casos.
O segundo método — getRandomNumber(int min, int max)— retorna um número inteiro aleatório no intervalo [min, max-1]. Ele nunca retornará um número menor que mine nunca retornará um número maior que max-1.
Como esses métodos podem ser usados na prática?
1. Dados
Suponha que você queira simular o lançamento de um dado e obter um número aleatório no intervalo 1-6. Como você faria? Isso pode ser feito com código como este:
int dice = getRandomNumber(1, 7);
Este método retornará um número inteiro aleatório no intervalo 1-6.
2. Prática de tiro ao alvo
Suponha que você queira simular um tiro em um alvo, e a precisão de um tiro inclui um componente aleatório que varia no intervalo de -10até +10inclusive. Isso pode ser feito com código como este:
int dx = getRandomNumber(-10, 11);
Este método retornará um número inteiro aleatório no intervalo -10de +10.
Existem muitas maneiras de usar números aleatórios em jogos. Você está limitado apenas pela sua imaginação. Escreva seus próprios jogos, refine-os e aproveite o processo.
Todos podem jogar, mas apenas os programadores podem criá-los.
GO TO FULL VERSION