finished persistence + added the files
continuous-integration/drone/push Build is failing Details

test_old_branch
Jules LASCRET 11 months ago
parent 87911f1ee0
commit 15e512aa86

@ -0,0 +1,16 @@
{
"leaderboard": [
{
"Date": "\/Date(1717106400000+0200)\/",
"PlayerName": "Jérémy",
"Points": 0,
"Victories": 1
},
{
"Date": "\/Date(1717106400000+0200)\/",
"PlayerName": "Jules",
"Points": 0,
"Victories": 0
}
]
}

File diff suppressed because it is too large Load Diff

@ -20,21 +20,25 @@ namespace QwirkleClassLibrary.Games
[DataContract] [DataContract]
public class Game : IPlayer, IRules public class Game : IPlayer, IRules
{ {
public ReadOnlyDictionary<Player, int> ScoreBoard => scoreBoard.AsReadOnly();
private readonly Dictionary<Player, int> scoreBoard = new();
private TileBag? bag = null; private TileBag? bag = null;
[DataMember] [DataMember]
public bool GameRunning { get; private set; } public bool GameRunning { get; set; }
[DataMember] [DataMember]
private Board board = new Board(15, 12); private Board board = new Board(15, 12);
public Board Board => board; public Board Board => board;
public ReadOnlyCollection<Player> PlayerList => players.AsReadOnly(); public ReadOnlyCollection<Player> PlayerList => players.AsReadOnly();
[DataMember]
private readonly List<Player> players = new(); private readonly List<Player> players = new();
[DataMember]
private readonly Dictionary<Player, int> scoreBoard = new();
public ReadOnlyDictionary<Player, int> ScoreBoard => scoreBoard.AsReadOnly();
public ReadOnlyCollection<Cell> CellsUsed => cellUsed.AsReadOnly(); public ReadOnlyCollection<Cell> CellsUsed => cellUsed.AsReadOnly();
private readonly List<Cell> cellUsed = new(); private readonly List<Cell> cellUsed = new();
@ -259,7 +263,7 @@ namespace QwirkleClassLibrary.Games
{ {
for (int j = 0; j < 6; j++) for (int j = 0; j < 6; j++)
{ {
if (bag != null) if (bag != null && p.Tiles.Count < 6)
{ {
int val = RandomNumberGenerator.GetInt32(0, bag.TilesBag.Count); int val = RandomNumberGenerator.GetInt32(0, bag.TilesBag.Count);

@ -3,14 +3,18 @@ using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Runtime.ExceptionServices; using System.Runtime.ExceptionServices;
using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace QwirkleClassLibrary.Players namespace QwirkleClassLibrary.Players
{ {
[DataContract]
public class Leaderboard public class Leaderboard
{ {
public ReadOnlyCollection<Score> Lb => leaderboard.AsReadOnly(); public ReadOnlyCollection<Score> Lb => leaderboard.AsReadOnly();
[DataMember]
private readonly List<Score> leaderboard = new(); private readonly List<Score> leaderboard = new();

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -11,20 +12,15 @@ using QwirkleClassLibrary.Tiles;
namespace QwirkleClassLibrary.Players namespace QwirkleClassLibrary.Players
{ {
[DataContract]
public class Player : INotifyPropertyChanged public class Player : INotifyPropertyChanged
{ {
private ObservableCollection<Tile> playerTiles = new ObservableCollection<Tile>(); [DataMember]
public ObservableCollection<Tile> Tiles public ObservableCollection<Tile> Tiles { get; private set; }
{
get { return playerTiles; }
set
{
playerTiles = value;
OnPropertyChanged(nameof(Tiles));
}
}
public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string? propertyName = null) void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
@ -41,10 +37,13 @@ namespace QwirkleClassLibrary.Players
} }
NameTag = name; NameTag = name;
Tiles = new ObservableCollection<Tile>();
} }
public string NameTag { get; } [DataMember]
public string NameTag { get; set; }
[DataMember]
public bool IsPlaying { get; set; } = false; public bool IsPlaying { get; set; } = false;
/// <summary> /// <summary>
@ -53,7 +52,7 @@ namespace QwirkleClassLibrary.Players
/// <param name="tile"></param> /// <param name="tile"></param>
public void AddTileToPlayer(Tile tile) public void AddTileToPlayer(Tile tile)
{ {
playerTiles.Add(tile); Tiles.Add(tile);
OnPropertyChanged(nameof(Tiles)); OnPropertyChanged(nameof(Tiles));
} }
@ -64,7 +63,7 @@ namespace QwirkleClassLibrary.Players
/// <returns>bool</returns> /// <returns>bool</returns>
public bool RemoveTileToPlayer(Tile tile) public bool RemoveTileToPlayer(Tile tile)
{ {
if (playerTiles.Remove(tile)) if (Tiles.Remove(tile))
{ {
OnPropertyChanged(nameof(Tiles)); OnPropertyChanged(nameof(Tiles));
return true; return true;

@ -3,16 +3,25 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace QwirkleClassLibrary.Players namespace QwirkleClassLibrary.Players
{ {
[DataContract]
public class Score public class Score
{ {
[DataMember]
public string PlayerName { get; private set; } public string PlayerName { get; private set; }
[DataMember]
public DateTime Date { get; set; } public DateTime Date { get; set; }
[DataMember]
public int Points { get; set; } public int Points { get; set; }
[DataMember]
public int Victories { get; set; } public int Victories { get; set; }
/// <summary> /// <summary>

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;

@ -173,7 +173,7 @@ static void MenuSwitch(Game game)
{ {
int enter = 0; int enter = 0;
while (enter != 3) while (enter != 3 && game.GameRunning)
{ {
ShowBoard(game); ShowBoard(game);
@ -186,6 +186,7 @@ static void MenuSwitch(Game game)
WriteLine("[1] Place your tiles"); WriteLine("[1] Place your tiles");
WriteLine("[2] Swap your tiles"); WriteLine("[2] Swap your tiles");
WriteLine("[3] End your turn / Skip your turn"); WriteLine("[3] End your turn / Skip your turn");
WriteLine("[4] Save the game");
Write("Enter your choice : "); Write("Enter your choice : ");
try try
@ -215,7 +216,23 @@ static void MenuSwitch(Game game)
game.EmptyCellUsed(); game.EmptyCellUsed();
game.DrawTiles(game.GetPlayingPlayer()); game.DrawTiles(game.GetPlayingPlayer());
game.CheckGameOver(game.GetPlayingPlayer()); game.CheckGameOver(game.GetPlayingPlayer());
var inGameSerializer = new DataContractJsonSerializer(typeof(Game));
using (Stream s = File.Create("game.json"))
{
inGameSerializer.WriteObject(s, game);
}
return; return;
case 4:
var postGameSerializer = new DataContractJsonSerializer(typeof(Game));
using (Stream s = File.Create("game.json"))
{
postGameSerializer.WriteObject(s, game);
}
game.GameRunning = false;
break;
} }
} }
} }
@ -231,20 +248,20 @@ static void ShowBoard(Game game)
Cell? cell = board.GetCell(y, i); Cell? cell = board.GetCell(y, i);
if (cell != null && !cell.IsFree) if (cell != null && !cell.IsFree)
{ {
Tile? tile = cell.GetTile; Tile? tile = cell.Tile;
if (tile != null) if (tile != null)
{ {
Console.Write("| " + tile.GetShape.ToString()[0] + tile.GetShape.ToString()[1] + Write("| " + tile.GetShape.ToString()[0] + tile.GetShape.ToString()[1] +
tile.GetColor.ToString()[0] + " |"); tile.GetColor.ToString()[0] + " |");
} }
} }
else else
{ {
Console.Write("| |"); Write("| |");
} }
} }
Console.WriteLine(); WriteLine();
} }
} }
@ -281,9 +298,9 @@ static void MainMenu(Game game)
{ {
game.GiveTilesToPlayers(); game.GiveTilesToPlayers();
Console.ForegroundColor = ConsoleColor.Green; ForegroundColor = ConsoleColor.Green;
WriteLine("Game is starting !"); WriteLine("Game is starting !");
Console.ResetColor(); ResetColor();
NotificationClass nc = new NotificationClass(); NotificationClass nc = new NotificationClass();
@ -309,12 +326,40 @@ static void MainMenu(Game game)
ShowScoreBoard(game); ShowScoreBoard(game);
} }
static void MainMenuContinue(Game game)
{
ForegroundColor = ConsoleColor.Green;
WriteLine("Game loaded ! You can continue the game !");
ResetColor();
NotificationClass nc = new NotificationClass();
do
{
game.NextPlayerNotified += nc.NotificationNextPlayer;
game.EndOfGameNotified += nc.NotificationEndOfGame;
game.SetNextPlayer();
WriteLine(" --------------------- GAME ! ------------------------");
MenuSwitch(game);
game.NextPlayerNotified -= nc.NotificationNextPlayer;
game.EndOfGameNotified -= nc.NotificationEndOfGame;
} while (game.GameRunning);
}
static void MainGame() static void MainGame()
{ {
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), "..\\..\\..\\..\\Files"));
Leaderboard leaderboard = new Leaderboard(); Leaderboard leaderboard = new Leaderboard();
Console.ForegroundColor = ConsoleColor.DarkGray;
ForegroundColor = ConsoleColor.DarkGray;
WriteLine(" ===================== WELCOME TO QWIRKLE ! ====================="); WriteLine(" ===================== WELCOME TO QWIRKLE ! =====================");
Console.ResetColor(); ResetColor();
int enter = 0; int enter = 0;
@ -322,8 +367,9 @@ static void MainGame()
{ {
ForegroundColor = ConsoleColor.DarkCyan; ForegroundColor = ConsoleColor.DarkCyan;
WriteLine("[1] Create game"); WriteLine("[1] Create game");
WriteLine("[2] Show leaderboard"); WriteLine("[2] Load game");
WriteLine("[3] Exit"); WriteLine("[3] Show leaderboard");
WriteLine("[4] Exit");
WriteLine(); WriteLine();
ResetColor(); ResetColor();
WriteLine("Enter your choice : "); WriteLine("Enter your choice : ");
@ -347,47 +393,52 @@ static void MainGame()
ForegroundColor = ConsoleColor.DarkYellow; ForegroundColor = ConsoleColor.DarkYellow;
WriteLine("Enter minimun 2 player and max 4 player !\n"); WriteLine("Enter minimun 2 player and max 4 player !\n");
ResetColor(); ResetColor();
Game game = new Game(); Game game = new Game();
AddPlayers(game); AddPlayers(game);
game.StartGame(); game.StartGame();
MainMenu(game); MainMenu(game);
leaderboard.AddScoreInLead(game.ScoreBoard); leaderboard.AddScoreInLead(game.ScoreBoard);
var leaderboardSerializer = new DataContractJsonSerializer(typeof(Leaderboard));
using (Stream s = File.Create("LeaderBoard.json "))
{
leaderboardSerializer.WriteObject(s, leaderboard);
}
break; break;
case 2: case 2:
ShowLeaderboard(leaderboard); Game loadedGame;
break;
case 3: var serializer = new DataContractJsonSerializer(typeof(Game));
return; using (Stream s = File.OpenRead("game.json"))
{
loadedGame = (serializer.ReadObject(s) as Game)!;
} }
var loadedLeaderboardSerializer = new DataContractJsonSerializer(typeof(Leaderboard));
using (Stream s = File.OpenRead("leaderboard.json"))
{
leaderboard = (loadedLeaderboardSerializer.ReadObject(s) as Leaderboard)!;
} }
}
// MainGame();
var game = new Game();
game.AddPlayerInGame(["Player1", "Player2", "Player3", "Player4"]);
game.StartGame(); MainMenuContinue(loadedGame);
game.SetNextPlayer(); leaderboard.AddScoreInLead(loadedGame.ScoreBoard);
game.PlaceTile(game.GetPlayingPlayer(), new Tile(Shape.Round, Color.Blue), 0, 0); break;
game.PlaceTile(game.GetPlayingPlayer(), new Tile(Shape.Square, Color.Blue), 0, 1);
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), "..\\..\\..\\..\\Files")); case 3:
ShowLeaderboard(leaderboard);
break;
var serializer = new DataContractJsonSerializer(typeof(Game)); case 4:
using (Stream s = File.Create("game.json")) return;
{
serializer.WriteObject(s, game);
} }
Game game2; }
using (Stream s = File.OpenRead("game.json"))
{
game2 = (serializer.ReadObject(s) as Game)!;
} }
WriteLine(game2.GetBoard()!.GetCell(0, 0)!.GetTile); MainGame();
Loading…
Cancel
Save