mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-07 10:50:53 -08:00
Convert Hexapawn to common library
This commit is contained in:
@@ -1,64 +1,67 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Games.Common.IO;
|
||||
using static Hexapawn.Cell;
|
||||
using static Hexapawn.Move;
|
||||
using static Hexapawn.Pawn;
|
||||
|
||||
namespace Hexapawn
|
||||
namespace Hexapawn;
|
||||
|
||||
internal class Human
|
||||
{
|
||||
internal class Human : IPlayer
|
||||
private readonly TextIO _io;
|
||||
|
||||
public Human(TextIO io)
|
||||
{
|
||||
public int Wins { get; private set; }
|
||||
_io = io;
|
||||
}
|
||||
|
||||
public void Move(Board board)
|
||||
public void Move(Board board)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var move = Input.GetMove("Your move");
|
||||
var move = _io.ReadMove("Your move");
|
||||
|
||||
if (TryExecute(board, move)) { return; }
|
||||
if (TryExecute(board, move)) { return; }
|
||||
|
||||
Console.WriteLine("Illegal move.");
|
||||
}
|
||||
}
|
||||
|
||||
public void AddWin() => Wins++;
|
||||
|
||||
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;
|
||||
_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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user