Polimorfismo, Interfaces, Classes Abstractas/Exercício 06: Tabuleiros e Peças

From Wiki**3

< Polimorfismo, Interfaces, Classes Abstractas

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
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();
  }

}
Ficheiro Peça.java
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;
  }

}
Ficheiro Cabo.java
public class Cabo extends Peça {
  public Cabo(int x, int y, String color) {
    super(x, y, color);
  }
}
Ficheiro Sargento.java
public class Sargento extends Peça {
  public Sargento(int x, int y, String color) {
    super(x, y, color, 3);
  }
}
Ficheiro App.java
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();
  }
}