Infrastruktur, Logik

This commit is contained in:
Markus Himmel
2016-08-24 16:59:10 +02:00
parent 561490e3db
commit 75e8dd0b28
4 changed files with 94 additions and 8 deletions

View File

@@ -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<Player, Phase> playerPhase;
/// <summary>
/// Gibt die Phase, in der sich ein Spieler befindet, zurück
/// </summary>
/// <param name="player">Der Spieler, dessen Phase gesucht ist</param>
/// <returns>Eine Phase</returns>
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
/// </returns>
public MoveResult TryApplyMove(GameMove move)
{
if (!IsGameRunning)
if (Result != GameResult.Running)
return MoveResult.GameNotRunning;
if (IsValidMove(move) != MoveValidity.Valid)

View File

@@ -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
{
/// <summary>
/// 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).
/// </summary>
interface IMoveProvider
{
/// <summary>
/// Bestimmt den nächsten Spielzug
/// </summary>
/// <param name="state">Lesesicht auf den aktuellen Spielzustand</param>
/// <returns>Ein Spielzug</returns>
GameMove GetNextMove(IReadOnlyGameState state);
}
}

View File

@@ -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
{
/// <summary>
/// Eine schreibgeschützte Sicht auf ein Spielfeld, anhand der ein <see cref="IMoveProvider"/>
/// einen Nachfolgezug bestimmen soll
/// </summary>
public interface IReadOnlyGameState
{
// Properties, die Auskunft über die Spielsituation geben
/// <summary>
/// Belegungsinformationen zum Spielfeld
/// </summary>
ReadOnlyCollection<Occupation> Board { get; }
/// <summary>
/// Der Spieler, der am Zug ist
/// </summary>
Player NextToMove { get; }
/// <summary>
/// Ob das Spiel noch läuft oder wie das Spiel ausgegangen ist
/// </summary>
GameResult Result { get; }
// Methoden, die Auskunft über die Spielsituation geben
/// <summary>
/// Gibt die Phase, in der sich ein Spieler befindet, zurück
/// </summary>
/// <param name="player">Der Spieler, dessen Phase gesucht ist</param>
/// <returns>Eine Phase</returns>
Phase GetPhase(Player player);
// Methoden zur Vereinfachung der Arbeit von IMoveProvider
/// <summary>
/// Bestimmt, ob ein Zug in der aktuellen Spielsituation gültig ist
/// </summary>
/// <param name="move">Der Zug, der überprüft werden soll</param>
/// <returns>
/// <para><see cref="MoveValidity.Valid"/>, wenn der Zug gültig ist.</para>
/// <para><see cref="MoveValidity.ClosesMill"/>, wenn der Zug gültig ist, aber eine Mühle schließt, und kein zu entfernender Stein angegeben wurde.</para>
/// <para><see cref="MoveValidity.DoesNotCloseMill"/>, wenn der Zug gültig ist, aber ein zu entfernender Stein angegeben wurde, obwohl der Zug keine Mühle schließt.</para>
/// <para><see cref="MoveValidity.Invalid"/>, wenn der Zug ungültig ist.</para>
/// </returns
MoveValidity IsValidMove(GameMove move);
}
}

View File

@@ -50,6 +50,7 @@
<Compile Include="IGameStateObserver.cs" />
<Compile Include="IMoveProvider.cs" />
<Compile Include="GameMove.cs" />
<Compile Include="IReadOnlyGameState.cs" />
<Compile Include="MoveResult.cs" />
<Compile Include="MoveValidity.cs" />
<Compile Include="Occupation.cs" />