Introdução aos Objectos/Exercício 02: Energia: Difference between revisions

From Wiki**3

< Introdução aos Objectos
 
(45 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{TOCright}}
#REDIRECT [[ist:Introdução aos Objectos/Exercício 02: Energia]]
= Problema =
 
Numa casa de campo existem vários animais.
 
Alguns animais são domésticos: cães, gatos e pássaros (canários, etc.). Os donos acreditam em dar liberdade completa aos animais, o que causa alguns problemas de interacção nem sempre do agrado geral.
 
Outros animais, embora vivam na casa ou perto dela, não são oficialmente considerados animais domésticos: ratos, cobras, insectos, aranhas, etc. Estes animais também se deslocam pela propriedade, livre mas nem sempre impunemente.
 
Todos os animais podem correr (e os pássaros voar), consumindo energia para o efeito. Quando a energia termina, não podem correr mais e têm de dormir para recuperar forças.
 
Além do repouso, os cães e os gatos podem recuperar energia comendo ratos. Um rato devorado perde, claro está, toda a energia (é transferida para o predador). Os gatos, por serem ágeis, também conseguem comer pássaros (com efeitos muito semelhantes aos da relação gato-rato).
 
Por vezes, os cães perdem a paciência e atacam os gatos. Ambos perdem energia no processo.
 
Modele os conceitos "cão", "gato", "pássaro" e "rato". Além da energia, os cães e os gatos têm nome (uma cadeia de caracteres).
 
Considere que a energia disponível inicialmente para os cães, gatos, pássaros e ratos é, respectivamente, de 1000, 500, 20 e 50 unidades. Quando os animais correm, gastam, respectivamente, 50, 25, 5 e 2 unidades. Um pássaro, quando voa, gasta apenas 2 unidades. Um cão que ataque um gato gasta 100 unidades e faz com que o gato perca 25.
 
Para um predador comer uma presa tem de a perseguir para a capturar (podendo a perseguição ser ou não bem sucedida). Um cão consegue capturar um rato em cada 25 tentativas. Para os gatos, o rácio é 1 em 5 (ratos) e 1 em 10 (pássaros). A perseguição consome a mesma energia que correr (para cada interveniente), mas a presa recebe um bónus de 5 unidades se escapar. Se a presa estiver a dormir, é apanhada 1 em cada 2 tentativas.
 
Construa uma aplicação onde existem 2 cães ("Piloto" e "Átila"), 3 gatos ("Tareco", "Pantufa" e "Kitty"), 20 pássaros e 50 ratos (os pássaros e ratos podem ser organizados em arrays).
 
Neste cenário, os gatos correm, perseguem pássaros e ratos e são atacados pelos cães, que também podem correr e perseguir e comer ratos. Os animais dormem automaticamente se ficam sem energia (excepto quando são devorados: nesse caso devem ser considerados mortos).
 
Apresente o estado inicial dos animais (métodos toString) e o estado final (depois de algumas interacções).
 
(Pode utilizar parte do resultado do [[Introdução aos Objectos/Exercício 01: Gato simples|Exercício 01]] na resolução deste exercicio.)
 
= Solução =
 
A solução apresentada procura manter-se simples e a um nível que ainda não implica utilizar abstracção de propriedade comuns, como por exemplo, a energia, ou de conceitos mais básicos (o de Animal, por exemplo). Estes aspectos, '''necessários numa boa definição de solução''' são objecto de estudo em fases mais adiantadas da exposição da matéria.
 
== UML: Diagrama de Classes ==
 
Neste caso, como se escolheu (dada a fase introdutória) não representar os conceitos hierarquizados, apenas existem relações de dependência entre as classes (representadas pelas setas a tracejado).
 
[[Image:PO-dog-cat-mouse-bird-energy.png]]
 
== Conceito de Cão: Dog ==
 
<java5>
public class Dog {
 
/**
* We define the base energy as a constant, but it does not have to be this
* way. It could be defined differently for each dog (but this requirement
* does not exist in this case).
*/
private static final int BASE_ENERGY = 1000;
 
/**
* The dog's name.
*/
private String _name;
 
/**
* The dog's current energy value.
*/
private int _energy = BASE_ENERGY;
 
/**
* @return dog's current energy level.
*/
private int getEnergy() {
return _energy;
}
 
/**
* @return dog's name
*/
public String getName() {
return _name;
}
 
/**
* Set the dog's name
*
* @param name
*            the dog's name
*/
public void setName(String name) {
_name = name;
}
 
/**
* When a dog runs, the energy decreases by 50 units. This value could be
* defined as an attribute or as a constant.
*
* @return whether the dog was able to run.
*/
public boolean run() {
if (_energy < 50)
return false;
_energy -= 50;
return true;
}
 
/**
* Call "run" to account for spent energy.
*
* @param mouse
*            the mouse to be chased.
* @return whether the dog was able to catch the mouse. If the mouse
*        escapes, its energy increases.
*/
public boolean caughtMouse(Mouse mouse) {
run();
mouse.run();
if (0 == (int) (25 * Math.random())) {
return true;
}
mouse.escaped();
return false;
}
 
/**
* Eating is more or less like a vampire feeding...
*
* @param mouse
*            the mouse to eat.
*/
public void eatMouse(Mouse mouse) {
if (caughtMouse(mouse))
_energy += mouse.drain();
}
 
/**
* We assume that the dog is always able to attack the cat. The parameter to
* ''attacked'' is used to specify the amount of energy lost by the cat.
* Note that we are assuming that the degree of loss depends on the attacker
* (hence the value being defined in the dog class).
*
* The energy values could be defined as attributes or as constants.
*
* @param cat
*            the cat the dog attacks
*/
public void attackCat(Cat cat) {
_energy -= 100;
cat.attacked(25);
}
 
/**
* Energy is recovered when sleeping.
*/
public void sleep() {
_energy = BASE_ENERGY;
}
 
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
if (o instanceof Dog) {
Dog dog = (Dog) o;
return _name.equals(dog.getName()) && _energy == dog.getEnergy();
}
return false;
}
 
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return _name + " (dog) (" + _energy + ")";
}
}
</java5>
 
== Conceito de Gato: Cat ==
 
<java5>
</java5>
 
== Conceito de Rato: Mouse ==
 
<java5>
</java5>
 
== Conceito de Pássaro: Bird ==
 
<java5>
</java5>
 
== Programa Principal ==
 
<java5>
</java5>
 
[[category:Teaching]]
[[category:PO]]

Latest revision as of 16:33, 7 November 2018