[Add] Basic project architecture

This commit is contained in:
2026-06-06 20:53:30 +07:00
parent 9ebedb12ec
commit 8ed9cc655f
79 changed files with 1080 additions and 9 deletions
@@ -0,0 +1,69 @@
using System;
namespace Minesweeper.Commands
{
public sealed class GameCommandDispatcher : IGameCommandDispatcher
{
private readonly SelectFieldCommandHandler selectFieldHandler;
private readonly StartGameCommandHandler startGameHandler;
private readonly OpenCellCommandHandler openCellHandler;
private readonly ToggleFlagCommandHandler toggleFlagHandler;
private readonly RestartCommandHandler restartHandler;
private readonly PauseCommandHandler pauseHandler;
private readonly ResumeCommandHandler resumeHandler;
private readonly GoToMenuCommandHandler goToMenuHandler;
public GameCommandDispatcher(
SelectFieldCommandHandler selectFieldHandler,
StartGameCommandHandler startGameHandler,
OpenCellCommandHandler openCellHandler,
ToggleFlagCommandHandler toggleFlagHandler,
RestartCommandHandler restartHandler,
PauseCommandHandler pauseHandler,
ResumeCommandHandler resumeHandler,
GoToMenuCommandHandler goToMenuHandler)
{
this.selectFieldHandler = selectFieldHandler;
this.startGameHandler = startGameHandler;
this.openCellHandler = openCellHandler;
this.toggleFlagHandler = toggleFlagHandler;
this.restartHandler = restartHandler;
this.pauseHandler = pauseHandler;
this.resumeHandler = resumeHandler;
this.goToMenuHandler = goToMenuHandler;
}
public void Dispatch<TCommand>(TCommand command) where TCommand : IGameCommand
{
switch (command)
{
case SelectFieldCommand selectFieldCommand:
selectFieldHandler.Handle(selectFieldCommand);
return;
case StartGameCommand startGameCommand:
startGameHandler.Handle(startGameCommand);
return;
case OpenCellCommand openCellCommand:
openCellHandler.Handle(openCellCommand);
return;
case ToggleFlagCommand toggleFlagCommand:
toggleFlagHandler.Handle(toggleFlagCommand);
return;
case RestartCommand restartCommand:
restartHandler.Handle(restartCommand);
return;
case PauseCommand pauseCommand:
pauseHandler.Handle(pauseCommand);
return;
case ResumeCommand resumeCommand:
resumeHandler.Handle(resumeCommand);
return;
case GoToMenuCommand goToMenuCommand:
goToMenuHandler.Handle(goToMenuCommand);
return;
default:
throw new InvalidOperationException($"No handler registered for command {typeof(TCommand).Name}.");
}
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6383c559964ec3545a7cd911b90586ce
@@ -0,0 +1,92 @@
using Minesweeper.Core;
namespace Minesweeper.Commands
{
public sealed class SelectFieldCommandHandler : IGameCommandHandler<SelectFieldCommand>
{
private readonly IGameStateService gameStateService;
public SelectFieldCommandHandler(IGameStateService gameStateService)
{
this.gameStateService = gameStateService;
}
public void Handle(SelectFieldCommand command)
{
gameStateService.SetState(GameState.FieldSelection);
}
}
public sealed class StartGameCommandHandler : IGameCommandHandler<StartGameCommand>
{
private readonly IGameStateService gameStateService;
public StartGameCommandHandler(IGameStateService gameStateService)
{
this.gameStateService = gameStateService;
}
public void Handle(StartGameCommand command)
{
gameStateService.SetState(GameState.Preparing);
}
}
public sealed class OpenCellCommandHandler : IGameCommandHandler<OpenCellCommand>
{
public void Handle(OpenCellCommand command)
{
}
}
public sealed class ToggleFlagCommandHandler : IGameCommandHandler<ToggleFlagCommand>
{
public void Handle(ToggleFlagCommand command)
{
}
}
public sealed class RestartCommandHandler : IGameCommandHandler<RestartCommand>
{
private readonly IGameStateService gameStateService;
public RestartCommandHandler(IGameStateService gameStateService)
{
this.gameStateService = gameStateService;
}
public void Handle(RestartCommand command)
{
gameStateService.SetState(GameState.Preparing);
}
}
public sealed class PauseCommandHandler : IGameCommandHandler<PauseCommand>
{
public void Handle(PauseCommand command)
{
}
}
public sealed class ResumeCommandHandler : IGameCommandHandler<ResumeCommand>
{
public void Handle(ResumeCommand command)
{
}
}
public sealed class GoToMenuCommandHandler : IGameCommandHandler<GoToMenuCommand>
{
private readonly IGameStateService gameStateService;
public GoToMenuCommandHandler(IGameStateService gameStateService)
{
this.gameStateService = gameStateService;
}
public void Handle(GoToMenuCommand command)
{
gameStateService.SetState(GameState.FieldSelection);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 31bfefc0901594043aae51cabba89234
@@ -0,0 +1,60 @@
namespace Minesweeper.Commands
{
public readonly struct SelectFieldCommand : IGameCommand
{
public SelectFieldCommand(int width, int height, int minesCount)
{
Width = width;
Height = height;
MinesCount = minesCount;
}
public int Width { get; }
public int Height { get; }
public int MinesCount { get; }
}
public readonly struct StartGameCommand : IGameCommand
{
}
public readonly struct OpenCellCommand : IGameCommand
{
public OpenCellCommand(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
public readonly struct ToggleFlagCommand : IGameCommand
{
public ToggleFlagCommand(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
public readonly struct RestartCommand : IGameCommand
{
}
public readonly struct PauseCommand : IGameCommand
{
}
public readonly struct ResumeCommand : IGameCommand
{
}
public readonly struct GoToMenuCommand : IGameCommand
{
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9bd93535958ca574999f8ec6de84baa3
@@ -0,0 +1,6 @@
namespace Minesweeper.Commands
{
public interface IGameCommand
{
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 50cd27fcb4d423e43b2a56cc23badbfb
@@ -0,0 +1,7 @@
namespace Minesweeper.Commands
{
public interface IGameCommandDispatcher
{
void Dispatch<TCommand>(TCommand command) where TCommand : IGameCommand;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f1c291311029640428d2ea8820fdfeaa
@@ -0,0 +1,7 @@
namespace Minesweeper.Commands
{
public interface IGameCommandHandler<in TCommand> where TCommand : IGameCommand
{
void Handle(TCommand command);
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e7b5f5892af9c184ba720b2b3f352b32