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

From Wiki**3

< Polimorfismo, Interfaces, Classes Abstractas
(Solução)
(Solução)
 
(2 intermediate revisions by the same user not shown)
Line 14: Line 14:
 
[[Image:PO-20121119-uml-class-diag-tabs.png|600px]]
 
[[Image:PO-20121119-uml-class-diag-tabs.png|600px]]
  
Ficheiro '''Tabuleiro.java''':
+
{{CollapsedCode|Ficheiro '''Tabuleiro.java'''|
<java5>
+
<source lang="java">
 
import java.util.List;
 
import java.util.List;
 
import java.util.ArrayList;
 
import java.util.ArrayList;
Line 44: Line 44:
  
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiros '''Peça.java''', '''Cabo.java''' e '''Sargento.java''':
+
{{CollapsedCode|Ficheiro '''Peça.java'''|
<java5>
+
<source lang="java">
 
public abstract class Peça {
 
public abstract class Peça {
 
   private int _x;        // Note: required attribute
 
   private int _x;        // Note: required attribute
Line 90: Line 91:
  
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiros '''Cabo.java''':
+
{{CollapsedCode|Ficheiro '''Cabo.java'''|
<java5>
+
<source lang="java">
 
public class Cabo extends Peça {
 
public class Cabo extends Peça {
 
   public Cabo(int x, int y, String color) {
 
   public Cabo(int x, int y, String color) {
Line 99: Line 101:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiros '''Sargento.java''':
+
{{CollapsedCode|Ficheiro '''Sargento.java'''|
<java5>
+
<source lang="java">
 
public class Sargento extends Peça {
 
public class Sargento extends Peça {
 
   public Sargento(int x, int y, String color) {
 
   public Sargento(int x, int y, String color) {
Line 108: Line 111:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiro '''App.java''':
+
{{CollapsedCode|Ficheiro '''App.java'''|
<java5>
+
<source lang="java">
 
public class App {
 
public class App {
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
Line 125: Line 129:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
}}
  
 
[[category:Ensino]]
 
[[category:Ensino]]

Latest revision as of 19:34, 29 October 2019

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