diff --git a/src/LittleTown.Core.Tests/BoardTesting.cs b/src/LittleTown.Core.Tests/BoardTesting.cs new file mode 100644 index 0000000..22f486d --- /dev/null +++ b/src/LittleTown.Core.Tests/BoardTesting.cs @@ -0,0 +1,41 @@ +using System.Text.Json; +using LittleTown.Core.Enums; + +namespace LittleTown.Core.Tests; + +public class BoardTesting +{ + + private readonly Board _board; + + public BoardTesting() + { + string path = Path.Combine(Environment.CurrentDirectory, "../../../../LittleTown.Core/Data/Board1.json"); + string data = System.IO.File.ReadAllText(path); + _board = JsonSerializer.Deserialize(data) ?? throw new JsonException("Cannot deserialize Board"); + } + + [Fact] + public void BoardGetTile() + { + Assert.Equal(ResourceType.Fish, _board.GetTile(0, 3)?.ResourceType); + } + + [Fact] + public void BoardGetArea() + { + ICollection tilesCoin = _board.GetArea(0, 0); + Assert.Equal(3, tilesCoin.Count); + Assert.Equal(1, tilesCoin.Count(t => t.ResourceType == ResourceType.Wood)); + + ICollection tilesCentre = _board.GetArea(7, 1); + Assert.Equal(8, tilesCentre.Count); + Assert.Equal(2, tilesCentre.Count(t => t.ResourceType == ResourceType.Wood)); + Assert.Equal(1, tilesCentre.Count(t => t.ResourceType == ResourceType.Fish)); + + ICollection tilesBord = _board.GetArea(4, 5); + Assert.Equal(5, tilesBord.Count); + Assert.Equal(1, tilesBord.Count(t => t.ResourceType == ResourceType.Rock)); + Assert.Equal(1, tilesBord.Count(t => t.ResourceType == ResourceType.Fish)); + } +} \ No newline at end of file diff --git a/src/LittleTown.Core.Tests/MatchTesting.cs b/src/LittleTown.Core.Tests/MatchTesting.cs index dc9ed1e..3a1fb9e 100644 --- a/src/LittleTown.Core.Tests/MatchTesting.cs +++ b/src/LittleTown.Core.Tests/MatchTesting.cs @@ -15,4 +15,10 @@ public class MatchTesting Assert.Throws(() => { new Match(5); }); } + + [Fact] + public void CheckBoardBoundaries() + { + + } } \ No newline at end of file diff --git a/src/LittleTown.Core/BoardAggregate/Board.cs b/src/LittleTown.Core/BoardAggregate/Board.cs new file mode 100644 index 0000000..d764a0c --- /dev/null +++ b/src/LittleTown.Core/BoardAggregate/Board.cs @@ -0,0 +1,58 @@ +using System.Text.Json.Serialization; + +namespace LittleTown.Core; + +/// +/// Represente un plateau de jeu dans un match +/// Le plateau de littleTown est constitué 9 X 6 cases +/// Chaque case est a un type et peut ou pas contenir un batiment +/// /// +public class Board +{ + /// Nombre de colonne dans le plateau + public int Width { get; init; } + /// Nombre de rangée dans le plateau + public int Height { get; init; } + + + [JsonInclude] + private Tile[] Tiles { get; init; } = new Tile[1]; + + /// + /// Permet de récupéré une tile sur le plateau, le 0,0 étant le bas gauche du plateau, x sur la largeur et y la hauteur + /// + /// la colonne de la tile partant de la gauche a 0 + /// ligne de la tile partant du bas a 0 + /// la tile + public Tile? GetTile(int x, int y) + { + if (x < 0 || x >= Width || y < 0 || y >= Height) + return null; + + return Tiles[x + y * Width]; + } + + /// Permet de recuperer la liste des tiles autour de la position en parametre + /// la colonne au centre de la zone + /// la rangée du centre de la zone + /// une liste des tiles contenant entre 3(coin) et 8(centre) tiles + public ICollection GetArea(int x, int y) + { + List result = new List(); + for (int ix = -1; ix <= 1; ix++) + { + for (int iy = -1; iy <= 1; iy++) + { + if (iy != 0 || ix != 0) + { + Tile? t = GetTile(x + ix, y + iy); + if (null != t) + { + result.Add((Tile)t); + } + } + } + } + return result; + } +} diff --git a/src/LittleTown.Core/BoardAggregate/Tile.cs b/src/LittleTown.Core/BoardAggregate/Tile.cs new file mode 100644 index 0000000..e81f30e --- /dev/null +++ b/src/LittleTown.Core/BoardAggregate/Tile.cs @@ -0,0 +1,28 @@ +using System.Text.Json.Serialization; +using LittleTown.Core.Enums; + +namespace LittleTown.Core; + +/// +/// Represente les infos d'une tile sur le plateau de jeu +/// /// +public record struct Tile +{ + /// + /// Le type de ressource présente sur cette Tile + /// + /// + [JsonConverter(typeof(JsonStringEnumConverter))] + public ResourceType ResourceType { get; init; } + + /// + /// Position X sur le plateau de cette tile, X = 0 a gauche du plateau + /// + /// + public int PosX { get; init; } + /// + /// Position Y, sur la hauteur, du plateau, le Y = 0 est en bas du plateau + /// + /// + public int PosY { get; init; } +} \ No newline at end of file diff --git a/src/LittleTown.Core/Data/Board1.json b/src/LittleTown.Core/Data/Board1.json new file mode 100644 index 0000000..169a768 --- /dev/null +++ b/src/LittleTown.Core/Data/Board1.json @@ -0,0 +1,276 @@ +{ + "Width": 9, + "Height": 6, + "Tiles": [ + { + "ResourceType": "None", + "PosX": 0, + "PosY": 0 + }, + { + "ResourceType": "Wood", + "PosX": 1, + "PosY": 0 + }, + { + "ResourceType": "Wood", + "PosX": 2, + "PosY": 0 + }, + { + "ResourceType": "None", + "PosX": 3, + "PosY": 0 + }, + { + "ResourceType": "Fish", + "PosX": 4, + "PosY": 0 + }, + { + "ResourceType": "Fish", + "PosX": 5, + "PosY": 0 + }, + { + "ResourceType": "None", + "PosX": 6, + "PosY": 0 + }, + { + "ResourceType": "None", + "PosX": 7, + "PosY": 0 + }, + { + "ResourceType": "Wood", + "PosX": 8, + "PosY": 0 + }, + { + "ResourceType": "None", + "PosX": 0, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 1, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 2, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 3, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 4, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 5, + "PosY": 1 + }, + { + "ResourceType": "Wood", + "PosX": 6, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 7, + "PosY": 1 + }, + { + "ResourceType": "None", + "PosX": 8, + "PosY": 1 + }, + { + "ResourceType": "Wood", + "PosX": 0, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 1, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 2, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 3, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 4, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 5, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 6, + "PosY": 2 + }, + { + "ResourceType": "None", + "PosX": 7, + "PosY": 2 + }, + { + "ResourceType": "Fish", + "PosX": 8, + "PosY": 2 + }, + { + "ResourceType": "Fish", + "PosX": 0, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 1, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 2, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 3, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 4, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 5, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 6, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 7, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 8, + "PosY": 3 + }, + { + "ResourceType": "None", + "PosX": 0, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 1, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 2, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 3, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 4, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 5, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 6, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 7, + "PosY": 4 + }, + { + "ResourceType": "None", + "PosX": 8, + "PosY": 4 + }, + { + "ResourceType": "Rock", + "PosX": 0, + "PosY": 5 + }, + { + "ResourceType": "None", + "PosX": 1, + "PosY": 5 + }, + { + "ResourceType": "Wood", + "PosX": 2, + "PosY": 5 + }, + { + "ResourceType": "Rock", + "PosX": 3, + "PosY": 5 + }, + { + "ResourceType": "None", + "PosX": 4, + "PosY": 5 + }, + { + "ResourceType": "Fish", + "PosX": 5, + "PosY": 5 + }, + { + "ResourceType": "None", + "PosX": 6, + "PosY": 5 + }, + { + "ResourceType": "Rock", + "PosX": 7, + "PosY": 5 + }, + { + "ResourceType": "Rock", + "PosX": 8, + "PosY": 5 + } + ] +} \ No newline at end of file diff --git a/src/LittleTown.Core/Enumerations/ResourceType.cs b/src/LittleTown.Core/Enumerations/ResourceType.cs new file mode 100644 index 0000000..bb384c3 --- /dev/null +++ b/src/LittleTown.Core/Enumerations/ResourceType.cs @@ -0,0 +1,18 @@ +namespace LittleTown.Core.Enums; + +/// +/// Les types de ressources existant dans le jeu +/// +public enum ResourceType +{ + /// certaines cases n'ont aucunes ressources + None, + /// Pierres, présente sur le plateau, ne sont pas de la nourriture + Rock, + /// Bois, présente sur le plateau, n'est pas de la nourriture + Wood, + /// Poisson, présente sur le plateau, peut être utilisé comme nourriture + Fish, + /// Blé, non présente sur le plateau, peut être utilisé comme nourriture + Cereal +} \ No newline at end of file diff --git a/src/LittleTown.Core/Exceptions/MatchConfigException.cs b/src/LittleTown.Core/Exceptions/MatchConfigException.cs new file mode 100644 index 0000000..028d0d2 --- /dev/null +++ b/src/LittleTown.Core/Exceptions/MatchConfigException.cs @@ -0,0 +1,21 @@ +namespace LittleTown.Core.Exceptions; + +/// +/// Exception indiquant un probleme lors de la configuration d'un match. +/// +public class MatchConfigException : Exception +{ + /// constructeur de base + public MatchConfigException() : base() { } + + /// Constructeur avec un message d'erreur + /// le message decrivant l'exception en detail + public MatchConfigException(string message) : base(message) { } + + /// + /// Constructeur avec un message et une exception interne + /// + /// Le message de l'erreur + /// l'exception encapsulée + public MatchConfigException(string message, Exception innerException) : base(message, innerException) { } +} \ No newline at end of file