# Design eines Schachspiels



## sicLotus (30. Apr 2014)

Hallo,

ich würde gerne ein Schachspiel entwickeln. Nun bin ich bei der Projektplanung auf eine Stelle gestoßen, wo ich euch gerne um Rat fragen möchte.

Die wichtigsten Klassen die benötigt werden wären einmal das Spielfeld(board) und die Spielfiguren(piece). Das Spielfeld könnte man sowohl als 1-dimensionales Array, als auch 2-dimensionales Array umsetzen. Aufgrund der Komplixität von einem Schachspiel, hat jede Figur ihre Eigenheiten um einen Spielzug auszuführen. Um zu überprüfen, ob sich eine Spielfigur an eine bestimmte Stelle bewegen darf, benötige ich also eine Funktion die mir alle erlaubten Spielzüge zurückgibt.

Hier ist mein Problem: Wie kann ich die Trennung zwischen Spielfeld und -figur zusammenbringen?
Schließlich muss z.B. der Bauer überprüfen, ob er eine Figur schlagen kann, denn dann kann er sich ja auch schräg anstatt gerade aus laufen. Mir kommt es designtechnisch seltsam vor, das Spielbrett an eine Figur zu übergeben?! Das klingt einfach nicht logisch.

Wüsstet ihr eine Möglichkeit wie man das im "guten" Design der Objektorientierung umsetzen könnte?

Vielen Dank für eure Aufmerksamkeit und Antworten.


----------



## anti-held (30. Apr 2014)

Also ich hab es so umgesetzt, dass es verschiedene Objekte gibt:

Board
 -  Field[][]

Field
 -  x
 -  y
 -  figure

Figure
 -  figureType
 -  position

FigureType (Enum)

Color (Enum)

Match
 -  board
 -  white (Player)
 -  black (Player)
 -  colorToMove (Color)
 -  moves (List<Move>)

Move
 -  destinationField
 -  fromField

Natürlich muss es dann eine Methode [c]isMoveValid[/c] geben.
Für jedes Objekt gibt es auch noch eine View Klasse, die Observer für die jeweiligen Objekte sind.
So müssen nur die Objekte geändert werden und die GUI aktualisiert sich selbst.

Es sollte natürlich nach dem MVC Pattern alles von einem Controller gesteuert werden.


----------



## Thunderstorm (4. Mai 2014)

Hallo,

eine Möglichkeit wäre in deine Boardklasse, eine Methode anzulegen, die dir zurückgibt, ob ein Zug möglich ist. 

public static Moves[] validMoves(int xPos, int yPos, int figureType)

Diese kann von überall angesteuert werden und hat Zugriff auf das Board, somit auch auf die Positionen aller Figuren.

Ich hoffe, dass ich helfen konnte :rtfm:
mfg Thunder


----------



## sicLotus (6. Mai 2014)

Thunderstorm hat gesagt.:


> Hallo,
> 
> eine Möglichkeit wäre in deine Boardklasse, eine Methode anzulegen, die dir zurückgibt, ob ein Zug möglich ist.
> 
> ...



Diese Variante gefällt mir gut. Vielen Dank für diesen Vorschlag!


----------

