diff --git a/Morris/GameState.cs b/Morris/GameState.cs index c1f001a..f42b2fe 100644 --- a/Morris/GameState.cs +++ b/Morris/GameState.cs @@ -20,10 +20,19 @@ namespace Morris public Occupation[] Board { get; private set; } public Player NextToMove { get; private set; } public GameResult Result { get; private set; } - public bool IsGameRunning { get; private set; } private Dictionary playerPhase; + /// + /// Gibt die Phase, in der sich ein Spieler befindet, zurück + /// + /// Der Spieler, dessen Phase gesucht ist + /// Eine Phase + public Phase GetPhase(Player player) + { + return playerPhase[player]; + } + private const int FIELD_SIZE = 24; static GameState() @@ -123,7 +132,7 @@ namespace Morris return MoveValidity.Invalid; // Darf keinen Stein mehr platzieren // 3.: Wurde eine Mühle geschlossen? - bool millClosed = mills.Any(mill => mill.All(point => (int)Board[point] == (int)NextToMove || point == move.To)); + bool millClosed = mills.Any(mill => mill.Contains(move.To) && mill.All(point => (int)Board[point] == (int)NextToMove || point == move.To)); // 4.: Verifikation des Mühlenparameters if (millClosed) @@ -166,7 +175,7 @@ namespace Morris /// public MoveResult TryApplyMove(GameMove move) { - if (!IsGameRunning) + if (Result != GameResult.Running) return MoveResult.GameNotRunning; if (IsValidMove(move) != MoveValidity.Valid) diff --git a/Morris/IMoveProvider.cs b/Morris/IMoveProvider.cs index 137ed56..d0f5f97 100644 --- a/Morris/IMoveProvider.cs +++ b/Morris/IMoveProvider.cs @@ -1,12 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +/* + * IMoveProvider.cs + * Copyright (c) 2016 Markus Himmel + * This file is distributed under the terms of the MIT license + */ namespace Morris { + /// + /// Eine Entität, welche in der Lage ist, basierend auf dem + /// aktuellen Spielzustand einen Spielzug bereitzustellen + /// (also in der Regel entweder eine Benutzeroberfläche oder + /// ein Bot). + /// interface IMoveProvider { + /// + /// Bestimmt den nächsten Spielzug + /// + /// Lesesicht auf den aktuellen Spielzustand + /// Ein Spielzug + GameMove GetNextMove(IReadOnlyGameState state); } } diff --git a/Morris/IReadOnlyGameState.cs b/Morris/IReadOnlyGameState.cs new file mode 100644 index 0000000..c035047 --- /dev/null +++ b/Morris/IReadOnlyGameState.cs @@ -0,0 +1,64 @@ +/* + * IReadOnlyGameState.cs + * Copyright (c) 2016 Markus Himmel + * This file is distributed under the terms of the MIT license + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Collections.ObjectModel; + +namespace Morris +{ + /// + /// Eine schreibgeschützte Sicht auf ein Spielfeld, anhand der ein + /// einen Nachfolgezug bestimmen soll + /// + public interface IReadOnlyGameState + { + // Properties, die Auskunft über die Spielsituation geben + + /// + /// Belegungsinformationen zum Spielfeld + /// + ReadOnlyCollection Board { get; } + + /// + /// Der Spieler, der am Zug ist + /// + Player NextToMove { get; } + + /// + /// Ob das Spiel noch läuft oder wie das Spiel ausgegangen ist + /// + GameResult Result { get; } + + + // Methoden, die Auskunft über die Spielsituation geben + + /// + /// Gibt die Phase, in der sich ein Spieler befindet, zurück + /// + /// Der Spieler, dessen Phase gesucht ist + /// Eine Phase + Phase GetPhase(Player player); + + + // Methoden zur Vereinfachung der Arbeit von IMoveProvider + + /// + /// Bestimmt, ob ein Zug in der aktuellen Spielsituation gültig ist + /// + /// Der Zug, der überprüft werden soll + /// + /// , wenn der Zug gültig ist. + /// , wenn der Zug gültig ist, aber eine Mühle schließt, und kein zu entfernender Stein angegeben wurde. + /// , wenn der Zug gültig ist, aber ein zu entfernender Stein angegeben wurde, obwohl der Zug keine Mühle schließt. + /// , wenn der Zug ungültig ist. + /// +