ajout de la classe plateau

This commit was merged in pull request #3.
This commit is contained in:
2024-05-29 12:20:04 +02:00
parent 9567423195
commit a4847c1641
7 changed files with 448 additions and 0 deletions

View 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));
}
}

View File

@@ -15,4 +15,10 @@ public class MatchTesting
Assert.Throws<ArgumentOutOfRangeException>(() => { new Match(5); });
}
[Fact]
public void CheckBoardBoundaries()
{
}
}

View 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;
}
}

View 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; }
}

View 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
}
]
}

View 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
}

View 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) { }
}