Files
basic-computer-games/46_Hexapawn/csharp/Human.cs
2022-03-18 07:05:27 +11:00

68 lines
1.5 KiB
C#

using System;
using System.Linq;
using Games.Common.IO;
using static Hexapawn.Cell;
using static Hexapawn.Move;
using static Hexapawn.Pawn;
namespace Hexapawn;
internal class Human
{
private readonly TextIO _io;
public Human(TextIO io)
{
_io = io;
}
public void Move(Board board)
{
while (true)
{
var move = _io.ReadMove("Your move");
if (TryExecute(board, move)) { return; }
_io.WriteLine("Illegal move.");
}
}
public bool HasLegalMove(Board board)
{
foreach (var from in AllCells.Where(c => c > 3))
{
if (board[from] != White) { continue; }
if (HasLegalMove(board, from))
{
return true;
}
}
return false;
}
private bool HasLegalMove(Board board, Cell from) =>
Right(from).IsRightDiagonalToCapture(board) ||
Straight(from).IsStraightMoveToEmptySpace(board) ||
from > 4 && Left(from).IsLeftDiagonalToCapture(board);
public bool HasNoPawns(Board board) => board.All(c => c != White);
public bool TryExecute(Board board, Move move)
{
if (board[move.From] != White) { return false; }
if (move.IsStraightMoveToEmptySpace(board) ||
move.IsLeftDiagonalToCapture(board) ||
move.IsRightDiagonalToCapture(board))
{
move.Execute(board);
return true;
}
return false;
}
}