ajout de la classe plateau
This commit was merged in pull request #3.
This commit is contained in:
41
src/LittleTown.Core.Tests/BoardTesting.cs
Normal file
41
src/LittleTown.Core.Tests/BoardTesting.cs
Normal file
@@ -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<Board>(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<Tile> tilesCoin = _board.GetArea(0, 0);
|
||||||
|
Assert.Equal(3, tilesCoin.Count);
|
||||||
|
Assert.Equal(1, tilesCoin.Count(t => t.ResourceType == ResourceType.Wood));
|
||||||
|
|
||||||
|
ICollection<Tile> 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<Tile> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,4 +15,10 @@ public class MatchTesting
|
|||||||
|
|
||||||
Assert.Throws<ArgumentOutOfRangeException>(() => { new Match(5); });
|
Assert.Throws<ArgumentOutOfRangeException>(() => { new Match(5); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CheckBoardBoundaries()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
58
src/LittleTown.Core/BoardAggregate/Board.cs
Normal file
58
src/LittleTown.Core/BoardAggregate/Board.cs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace LittleTown.Core;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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
|
||||||
|
/// /// </summary>
|
||||||
|
public class Board
|
||||||
|
{
|
||||||
|
/// <summary> Nombre de colonne dans le plateau </summary>
|
||||||
|
public int Width { get; init; }
|
||||||
|
/// <summary> Nombre de rangée dans le plateau </summary>
|
||||||
|
public int Height { get; init; }
|
||||||
|
|
||||||
|
|
||||||
|
[JsonInclude]
|
||||||
|
private Tile[] Tiles { get; init; } = new Tile[1];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">la colonne de la tile partant de la gauche a 0</param>
|
||||||
|
/// <param name="y">ligne de la tile partant du bas a 0</param>
|
||||||
|
/// <returns>la tile</returns>
|
||||||
|
public Tile? GetTile(int x, int y)
|
||||||
|
{
|
||||||
|
if (x < 0 || x >= Width || y < 0 || y >= Height)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return Tiles[x + y * Width];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Permet de recuperer la liste des tiles autour de la position en parametre </summary>
|
||||||
|
/// <param name="x">la colonne au centre de la zone</param>
|
||||||
|
/// <param name="y">la rangée du centre de la zone</param>
|
||||||
|
/// <returns>une liste des tiles contenant entre 3(coin) et 8(centre) tiles</returns>
|
||||||
|
public ICollection<Tile> GetArea(int x, int y)
|
||||||
|
{
|
||||||
|
List<Tile> result = new List<Tile>();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/LittleTown.Core/BoardAggregate/Tile.cs
Normal file
28
src/LittleTown.Core/BoardAggregate/Tile.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using LittleTown.Core.Enums;
|
||||||
|
|
||||||
|
namespace LittleTown.Core;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represente les infos d'une tile sur le plateau de jeu
|
||||||
|
/// /// </summary>
|
||||||
|
public record struct Tile
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Le type de ressource présente sur cette Tile
|
||||||
|
/// </summary>
|
||||||
|
/// <value></value>
|
||||||
|
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||||
|
public ResourceType ResourceType { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Position X sur le plateau de cette tile, X = 0 a gauche du plateau
|
||||||
|
/// </summary>
|
||||||
|
/// <value></value>
|
||||||
|
public int PosX { get; init; }
|
||||||
|
/// <summary>
|
||||||
|
/// Position Y, sur la hauteur, du plateau, le Y = 0 est en bas du plateau
|
||||||
|
/// </summary>
|
||||||
|
/// <value></value>
|
||||||
|
public int PosY { get; init; }
|
||||||
|
}
|
||||||
276
src/LittleTown.Core/Data/Board1.json
Normal file
276
src/LittleTown.Core/Data/Board1.json
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
src/LittleTown.Core/Enumerations/ResourceType.cs
Normal file
18
src/LittleTown.Core/Enumerations/ResourceType.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
namespace LittleTown.Core.Enums;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Les types de ressources existant dans le jeu
|
||||||
|
/// </summary>
|
||||||
|
public enum ResourceType
|
||||||
|
{
|
||||||
|
/// <summary> certaines cases n'ont aucunes ressources </summary>
|
||||||
|
None,
|
||||||
|
/// <summary> Pierres, présente sur le plateau, ne sont pas de la nourriture </summary>
|
||||||
|
Rock,
|
||||||
|
/// <summary> Bois, présente sur le plateau, n'est pas de la nourriture </summary>
|
||||||
|
Wood,
|
||||||
|
/// <summary> Poisson, présente sur le plateau, peut être utilisé comme nourriture </summary>
|
||||||
|
Fish,
|
||||||
|
///<summary> Blé, non présente sur le plateau, peut être utilisé comme nourriture </summary>
|
||||||
|
Cereal
|
||||||
|
}
|
||||||
21
src/LittleTown.Core/Exceptions/MatchConfigException.cs
Normal file
21
src/LittleTown.Core/Exceptions/MatchConfigException.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
namespace LittleTown.Core.Exceptions;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Exception indiquant un probleme lors de la configuration d'un match.
|
||||||
|
/// </summary>
|
||||||
|
public class MatchConfigException : Exception
|
||||||
|
{
|
||||||
|
/// <summary> constructeur de base </summary>
|
||||||
|
public MatchConfigException() : base() { }
|
||||||
|
|
||||||
|
/// <summary> Constructeur avec un message d'erreur </summary>
|
||||||
|
/// <param name="message">le message decrivant l'exception en detail</param>
|
||||||
|
public MatchConfigException(string message) : base(message) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructeur avec un message et une exception interne
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">Le message de l'erreur</param>
|
||||||
|
/// <param name="innerException">l'exception encapsulée</param>
|
||||||
|
public MatchConfigException(string message, Exception innerException) : base(message, innerException) { }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user