creationDuPlateau #3
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); });
|
||||
}
|
||||
|
||||
[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