Skakbrikker med interface og abstrakt superklasse


Motivation

I skak har hver brik sine egne regler for, hvordan den må flytte sig på brættet. En konge må f.eks. kun flytte ét felt ad gangen, mens et tårn kan bevæge sig flere felter i lige linjer.

Men uanset hvilken brik det er, så kan de alle forsøge at lave et træk. Det gør interfaces relevante: De sikrer, at alle brikker har en metode til at lave et træk, selvom reglerne for bevægelse er forskellige.

For at genbruge fælles egenskaber (som farve og symbol) laver vi også en abstrakt superklasse `Brik`, som alle konkrete brikker nedarver fra.


Opgave

1. Definér et interface `IBrik` med en metode:

bool MovePiece(IBrik[,] board, int fromRow, int fromCol, int toRow, int toCol);

som prøver at flytte brikken på skakbrættet. Metoden skal returnere `true`, hvis trækket er lovligt og brikken flyttes, ellers `false`.

2. Definér en abstrakt klasse . Klassen skal indeholde:

  1. En egenskab `Farve` af typen enum `BrikFarve` (Hvid/Sort). (eller blot en char)
  2. En abstrakt egenskab `Symbol` (char), som viser brikkens symbol.

3. Lav en konkret klasse `Konge`, som nedarver fra `Brik`.

4. Skriv et simpelt test program, som:

  1. Opretter et 8×8 skakbræt (array af `IBrik`),
  2. Placér en hvid konge i position `(0, 0)`,
  3. Læs brugerinput til at flytte brikken:
    • Fra række/kolonne og til række/kolonne (tal mellem 0 og 7),
  4. Kald `MovePiece` og vis om trækket lykkedes eller ej,
  5. Vis brættet i konsollen efter hvert træk med brikkernes symboler.

Hint og gode råd

Hint - er trækket inde for pladen

Hint - er det en brik op destinationsfeltet

Hint - er trækket inde for pladen

Hint - opdatering af board efter træk


Udvidelse


Perspektivering

I denne øvelse kombinerer vi:

Dette er en grundlæggende måde at tænke objektorienteret programmering på — med fokus på både kontrakter (interfaces) og genbrug af kode (nedarvning).