mirror of
https://github.com/TwoFX/Morris.git
synced 2025-12-13 08:22:51 +00:00
Infrastruktur, Logik
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
64
Morris/IReadOnlyGameState.cs
Normal file
64
Morris/IReadOnlyGameState.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user