Rules and board state live in Minesweeper.Core with no console calls, so the same board drives both the CLI and the tests.
Engine: seeded or random boards with classic presets; first click always safe (and its ring too when the board has room); cascading reveal that stops at numbers; flagging and chording; win by clearing every safe cell; FromMines() for deterministic layouts.
CLI: typed commands ("3 4", "f 2 5", "chord 6 7") plus optional arrow-key mode. Rows numbered, columns lettered, player input 1-based while engine coordinates stay 0-based, with CommandParser the only place that converts. ANSI colour when writing to a terminal, plain when redirected or NO_COLOR is set.
Tests: 186 covering flood-fill bounds, first-click safety, chording, win/loss, command parsing, session behaviour, and renderer alignment with colour on and off.
Co-authored-by: openhands <openhands@all-hands.dev>
9 lines
306 B
C#
9 lines
306 B
C#
namespace Minesweeper.Core;
|
|
|
|
/// <summary>Thrown when a move is attempted on a board that has already been won or lost.</summary>
|
|
public sealed class GameOverException(GameStatus status) : InvalidOperationException(
|
|
$"The game is already {status}.")
|
|
{
|
|
public GameStatus Status { get; } = status;
|
|
}
|