Difference between revisions of "Polimorfismo, Interfaces, Classes Abstractas/Exercício 06: Tabuleiros e Peças"

From Wiki**3

< Polimorfismo, Interfaces, Classes Abstractas
(Solução)
(No difference)

Revision as of 11:06, 18 November 2013

Execício do teste de 2012/11/19.

Problema

Implemente, em Java, as classes Tabuleiro e Peça. A classe Tabuleiro guarda um número variável de peças e tem o método desenhaPeças() que é responsável por desenhar todas as peças guardadas. A classe Peça tem dois atributos inteiros que representam as suas coordenadas no tabuleiro, um atributo que representa a côr da peça (cadeia de caracteres) e dois métodos: o método move() e o método devolveCor(). Existem dois tipos de peças: Cabo e Sargento. Cada tipo de peça move-se de forma distinta: as peças do tipo Cabo avançam uma unidade em cada uma das coordenadas enquanto que as peças do tipo Sargento avançam 3 unidades em cada uma das coordenadas. Para simplificar o seu trabalho considere que o tabuleiro não tem limites.

Se necessário pode implementar outras classes e/ou métodos.

Solução

A solução contém cinco classes (4 são as descritas no enunciado e a 5ª é a que contém o método main, App). Os métodos descritos no enunciado estão assinalados como "required method" e os atributos com "required attributes". Note-se que a solução é mínima e que algumas opções não são ideais em casos gerais (o uso de ArrayList na classe Tabuleiro, por exemplo).

O diagrama de classes é o seguinte:

600px

Ficheiro Tabuleiro.java: <java5> import java.util.List; import java.util.ArrayList;

public class Tabuleiro {

 // could be more sophisticated
 private List<Peça> _board = new ArrayList<Peça>();
 public void add(Peça piece) {
   _board.add(piece);
 }
 /**
  * Note: required method
  */
 public void desenhaPeças() {
   for (Peça p: _board)
     System.out.println(p);
 }
 /**
  * Moves all pieces.
  */
 public void shake() {
   for (Peça p: _board)
     p.move();
 }

} </java5>

Ficheiros Peça.java, Cabo.java e Sargento.java: <java5> public abstract class Peça {

 private int _x;        // Note: required attribute
 private int _y;        // Note: required attribute
 private String _color; // Note: required attribute
 private int _xstep;
 private int _ystep;
 public Peça(int x, int y, String color, int xstep, int ystep) {
   _x = x;
   _y = y;
   _color = color;
   _xstep = xstep;
   _ystep = ystep;
 }
 public Peça(int x, int y, String color, int xystep) {
   this(x, y, color, xystep, xystep);
 }
 public Peça(int x, int y, String color) {
   this(x, y, color, 1);
 }
 public String toString() {
   return "Peça at (" + _x + ", " + _y + ") is " + _color + " (" + getClass().getName() + ")";
 }
 /**
  * Note: required method
  * @return color
  */
 public String devolveCor() { return _color; }
 /**
  * Note: required method
  */
 public void move() {
   _x += _xstep;
   _y += _ystep;
 }

} </java5>

Ficheiros Cabo.java: <java5> public class Cabo extends Peça {

 public Cabo(int x, int y, String color) {
   super(x, y, color);
 }

} </java5>

Ficheiros Sargento.java: <java5> public class Sargento extends Peça {

 public Sargento(int x, int y, String color) {
   super(x, y, color, 3);
 }

} </java5>

Ficheiro App.java: <java5> public class App {

 public static void main(String[] args) {
   Tabuleiro t = new Tabuleiro();
   t.add(new Cabo(1, 1, "azul"));
   t.add(new Cabo(2, 5, "azul"));
   t.add(new Sargento(4, 1, "amarelo"));
   System.out.println("Initial:");
   t.desenhaPeças();
   t.shake();
   System.out.println("After shaking:");
   t.desenhaPeças();
 }

} </java5>