From 740598a50808e3f4de42e134c266842ec60bea7d Mon Sep 17 00:00:00 2001 From: "jeremy.mouyon" Date: Mon, 13 May 2024 15:02:54 +0200 Subject: [PATCH 1/2] add event (just problem with first notification) --- .../AddPlayerNotifiedEventArgs.cs | 12 +++++ Qwirkle/QwirkleClassLibrary/Game.cs | 12 ++++- .../QwirkleConsoleApp/NotificationClass.cs | 33 +++++++++++++ Qwirkle/QwirkleConsoleApp/Program.cs | 48 ++++++++++--------- 4 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs create mode 100644 Qwirkle/QwirkleConsoleApp/NotificationClass.cs diff --git a/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs b/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs new file mode 100644 index 0000000..bc1ad1c --- /dev/null +++ b/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs @@ -0,0 +1,12 @@ +namespace QwirkleClassLibrary +{ + public class AddPlayerNotifiedEventArgs : EventArgs + { + public int numberBack { get; private set; } + + public AddPlayerNotifiedEventArgs(int numberBack) + { + this.numberBack = numberBack; + } + } +} \ No newline at end of file diff --git a/Qwirkle/QwirkleClassLibrary/Game.cs b/Qwirkle/QwirkleClassLibrary/Game.cs index 68360de..ada4983 100644 --- a/Qwirkle/QwirkleClassLibrary/Game.cs +++ b/Qwirkle/QwirkleClassLibrary/Game.cs @@ -21,6 +21,11 @@ namespace QwirkleClassLibrary public ReadOnlyCollection ScoreList => scores.AsReadOnly(); private readonly List scores = new(); + public event EventHandler PlayerAddNotified; + + protected virtual void OnPlayerNotified(AddPlayerNotifiedEventArgs args) + => PlayerAddNotified?.Invoke(this, args); + public Game() { bag = new TileBag(3); @@ -31,11 +36,13 @@ namespace QwirkleClassLibrary { if (string.IsNullOrWhiteSpace(playerTag) == true || this.GameRunning == true) { + OnPlayerNotified(new AddPlayerNotifiedEventArgs(1)); return false; } if (players.Count >= 4) { + OnPlayerNotified(new AddPlayerNotifiedEventArgs(2)); return false; } @@ -43,19 +50,22 @@ namespace QwirkleClassLibrary { if (p.NameTag == playerTag) { + OnPlayerNotified(new AddPlayerNotifiedEventArgs(3)); return false; } + } players.Add(CreatePlayer(playerTag)); scores.Add(new Score(players[players.Count-1])); - + OnPlayerNotified(new AddPlayerNotifiedEventArgs(0)); return true; } public Player CreatePlayer(string playerTag) { var player = new Player(playerTag); + return player; } diff --git a/Qwirkle/QwirkleConsoleApp/NotificationClass.cs b/Qwirkle/QwirkleConsoleApp/NotificationClass.cs new file mode 100644 index 0000000..3cd2dc4 --- /dev/null +++ b/Qwirkle/QwirkleConsoleApp/NotificationClass.cs @@ -0,0 +1,33 @@ +using QwirkleClassLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace QwirkleConsoleApp +{ + class NotificationClass + { + public void NotificationMessagePlayer(object? sender, AddPlayerNotifiedEventArgs args) + { + int t = args.numberBack; + + switch (t) + { + case 0: + Console.WriteLine("Player as correctly add"); + break; + case 1: + Console.WriteLine("ERROR : The name is null or white space"); + break; + case 2: + Console.WriteLine("ERROR : The game is full"); + break; + case 3: + Console.WriteLine("ERROR : Name exist"); + break; + } + } + } +} diff --git a/Qwirkle/QwirkleConsoleApp/Program.cs b/Qwirkle/QwirkleConsoleApp/Program.cs index ef1a41e..7c6580f 100644 --- a/Qwirkle/QwirkleConsoleApp/Program.cs +++ b/Qwirkle/QwirkleConsoleApp/Program.cs @@ -1,24 +1,26 @@ using QwirkleClassLibrary; +using QwirkleConsoleApp; using System.Net.Quic; using System.Text; using System.Transactions; using static System.Console; + static void AddPlayers(Game game) { + NotificationClass nc = new NotificationClass(); + while (game.PlayerList.Count < 4) { Write("Enter player tag : "); string? playerTag = ReadLine(); - if (game.AddPlayerInGame(playerTag) == false) - { - WriteLine("ERROR : Player already exist or game is running !"); - } - else - { - WriteLine("Player " + playerTag + " added !"); - } + game.AddPlayerInGame(playerTag); + + game.PlayerAddNotified -= nc.NotificationMessagePlayer; + + game.PlayerAddNotified += nc.NotificationMessagePlayer; + Write("Do you want to add another player ? (y/n) : "); string? answer = ReadLine(); @@ -38,14 +40,14 @@ static void AddPlayers(Game game) static void ShowTiles(Game game) { WriteLine("\n --------------------- YOUR TILES ------------------------"); - + var currentPlayer = game.GetPlayingPlayer(); var stringBuilder = new StringBuilder(); for (int i = 0; i < currentPlayer.Tiles.Count(); i++) { - stringBuilder.Append("[" + (i+1) + "] "); + stringBuilder.Append("[" + (i + 1) + "] "); stringBuilder.AppendLine(currentPlayer.Tiles[i].ToString()); } @@ -65,12 +67,12 @@ static void AddTile(Game game) } tile = game.TileOfPlayerWithPos(no - 1); - + Write("Enter the x of the cell: "); int x = Convert.ToInt32(ReadLine()); Write("Enter the y of the cell : "); int y = Convert.ToInt32(ReadLine()); - + if (game.PlaceTile(game.GetPlayingPlayer(), tile, x, y) == true) { WriteLine("ok ! your tile is placed"); @@ -85,14 +87,14 @@ static void SwapTile(Game game) { var tilesToSwap = new List(); bool continueSwap = true; - + ShowTiles(game); while (continueSwap == true) { Write("Enter the number of the tile you want to swap : "); int no = Convert.ToInt32(ReadLine()); - + if (no is < 1 or > 6) { WriteLine("ERROR : Enter a number between 1 and 6 !"); @@ -101,23 +103,23 @@ static void SwapTile(Game game) { tilesToSwap.Add(game.TileOfPlayerWithPos(no - 1)); } - + Write("Do you want to swap another tile ? (y/n) : "); string? answer = ReadLine(); - + if (answer == "n") { continueSwap = false; } } - + game.SwapTiles(game.GetPlayingPlayer(), tilesToSwap); } static void MenuSwitch(Game game) { int enter = 0; - + while (enter != 3) { ShowTiles(game); @@ -152,11 +154,11 @@ static void MainMenu(Game game) Console.ForegroundColor = ConsoleColor.Green; WriteLine("Game is starting !"); Console.ResetColor(); - + do { string tagPlayerPlay = game.SetNextPlayer(); - + WriteLine(" --------------------- GAME ! ------------------------"); WriteLine(tagPlayerPlay + "'s turn !"); @@ -169,16 +171,16 @@ static void MainMenu(Game game) static void MainGame() { Game game = new Game(); - + Console.ForegroundColor = ConsoleColor.DarkGreen; WriteLine(" ===================== WELCOME TO QWIRKLE ! ====================="); WriteLine("Enter the players' nametags (2 to 4 players) : "); Console.ResetColor(); - + AddPlayers(game); game.StartGame(); - + MainMenu(game); } From bdcc6cb1382b30d518e7444a0d7fc7e7b0525575 Mon Sep 17 00:00:00 2001 From: "jeremy.mouyon" Date: Tue, 14 May 2024 19:18:52 +0200 Subject: [PATCH 2/2] last modif of branch --- .../AddPlayerNotifiedEventArgs.cs | 6 ++-- Qwirkle/QwirkleClassLibrary/Game.cs | 30 ++++++++++++++----- .../NextPlayerNotifiedEventArgs.cs | 12 ++++++++ .../QwirkleConsoleApp/NotificationClass.cs | 23 ++++---------- Qwirkle/QwirkleConsoleApp/Program.cs | 20 ++++++++----- 5 files changed, 56 insertions(+), 35 deletions(-) create mode 100644 Qwirkle/QwirkleClassLibrary/NextPlayerNotifiedEventArgs.cs diff --git a/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs b/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs index bc1ad1c..1f6abd3 100644 --- a/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs +++ b/Qwirkle/QwirkleClassLibrary/AddPlayerNotifiedEventArgs.cs @@ -2,11 +2,11 @@ { public class AddPlayerNotifiedEventArgs : EventArgs { - public int numberBack { get; private set; } + public string returnedNotified { get; private set; } - public AddPlayerNotifiedEventArgs(int numberBack) + public AddPlayerNotifiedEventArgs(string returnedNotified) { - this.numberBack = numberBack; + this.returnedNotified = returnedNotified; } } } \ No newline at end of file diff --git a/Qwirkle/QwirkleClassLibrary/Game.cs b/Qwirkle/QwirkleClassLibrary/Game.cs index ada4983..3480b93 100644 --- a/Qwirkle/QwirkleClassLibrary/Game.cs +++ b/Qwirkle/QwirkleClassLibrary/Game.cs @@ -11,7 +11,7 @@ namespace QwirkleClassLibrary { public class Game : IPlayer, IRules { - private readonly TileBag bag; + private TileBag bag; public bool GameRunning { get; private set; } private Board board; @@ -21,28 +21,40 @@ namespace QwirkleClassLibrary public ReadOnlyCollection ScoreList => scores.AsReadOnly(); private readonly List scores = new(); - public event EventHandler PlayerAddNotified; + public event EventHandler? PlayerAddNotified; protected virtual void OnPlayerNotified(AddPlayerNotifiedEventArgs args) => PlayerAddNotified?.Invoke(this, args); + public event EventHandler? NextPlayerNotified; + + protected virtual void OnNextPlayer(NextPlayerNotifiedEventArgs args) + => NextPlayerNotified?.Invoke(this, args); + public Game() { bag = new TileBag(3); board = CreateBoard(); + } public bool AddPlayerInGame(string? playerTag) { - if (string.IsNullOrWhiteSpace(playerTag) == true || this.GameRunning == true) + if (string.IsNullOrWhiteSpace(playerTag) == true) + { + OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : The name is null or white space.")); + return false; + } + + if(this.GameRunning == true) { - OnPlayerNotified(new AddPlayerNotifiedEventArgs(1)); + OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : The game is running.")); return false; } if (players.Count >= 4) { - OnPlayerNotified(new AddPlayerNotifiedEventArgs(2)); + OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : The game is full.")); return false; } @@ -50,7 +62,7 @@ namespace QwirkleClassLibrary { if (p.NameTag == playerTag) { - OnPlayerNotified(new AddPlayerNotifiedEventArgs(3)); + OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : Name alreay taken")); return false; } @@ -58,7 +70,7 @@ namespace QwirkleClassLibrary players.Add(CreatePlayer(playerTag)); scores.Add(new Score(players[players.Count-1])); - OnPlayerNotified(new AddPlayerNotifiedEventArgs(0)); + OnPlayerNotified(new AddPlayerNotifiedEventArgs("Player was correctly added")); return true; } @@ -117,7 +129,7 @@ namespace QwirkleClassLibrary { for (int j = 0; j < 6; j++) { - int val = RandomNumberGenerator.GetInt32(0, bag.TilesBag.Count + 1); + int val = RandomNumberGenerator.GetInt32(0, bag.TilesBag.Count); p.AddTileToPlayer(bag.TilesBag[val]); bag.RemoveTileInBag(bag.TilesBag[val]); @@ -130,6 +142,7 @@ namespace QwirkleClassLibrary if (GameRunning == true) { players[0].IsPlaying = true; + //OnNextPlayer(new NextPlayerNotifiedEventArgs(players[0])); return players[0].NameTag; } else @@ -150,6 +163,7 @@ namespace QwirkleClassLibrary players[i].IsPlaying = false; players[(i + 1) % players.Count].IsPlaying = true; + OnNextPlayer(new NextPlayerNotifiedEventArgs(players[i])); return players[GetPlayingPlayerPosition()].NameTag; } diff --git a/Qwirkle/QwirkleClassLibrary/NextPlayerNotifiedEventArgs.cs b/Qwirkle/QwirkleClassLibrary/NextPlayerNotifiedEventArgs.cs new file mode 100644 index 0000000..6c0f6aa --- /dev/null +++ b/Qwirkle/QwirkleClassLibrary/NextPlayerNotifiedEventArgs.cs @@ -0,0 +1,12 @@ +namespace QwirkleClassLibrary +{ + public class NextPlayerNotifiedEventArgs : EventArgs + { + public Player player { get; set; } + + public NextPlayerNotifiedEventArgs(Player player) + { + this.player = player; + } + } +} \ No newline at end of file diff --git a/Qwirkle/QwirkleConsoleApp/NotificationClass.cs b/Qwirkle/QwirkleConsoleApp/NotificationClass.cs index 3cd2dc4..953e9d6 100644 --- a/Qwirkle/QwirkleConsoleApp/NotificationClass.cs +++ b/Qwirkle/QwirkleConsoleApp/NotificationClass.cs @@ -9,25 +9,14 @@ namespace QwirkleConsoleApp { class NotificationClass { - public void NotificationMessagePlayer(object? sender, AddPlayerNotifiedEventArgs args) + public void NotificationPlayerAdd(object? sender, AddPlayerNotifiedEventArgs args) { - int t = args.numberBack; + Console.WriteLine(args.returnedNotified); + } - switch (t) - { - case 0: - Console.WriteLine("Player as correctly add"); - break; - case 1: - Console.WriteLine("ERROR : The name is null or white space"); - break; - case 2: - Console.WriteLine("ERROR : The game is full"); - break; - case 3: - Console.WriteLine("ERROR : Name exist"); - break; - } + public void NotificationNextPlayer(object? sender, NextPlayerNotifiedEventArgs args) + { + Console.WriteLine(args.player.NameTag + "'s turn"); } } } diff --git a/Qwirkle/QwirkleConsoleApp/Program.cs b/Qwirkle/QwirkleConsoleApp/Program.cs index 7c6580f..ab2d393 100644 --- a/Qwirkle/QwirkleConsoleApp/Program.cs +++ b/Qwirkle/QwirkleConsoleApp/Program.cs @@ -9,6 +9,7 @@ using static System.Console; static void AddPlayers(Game game) { NotificationClass nc = new NotificationClass(); + game.PlayerAddNotified += nc.NotificationPlayerAdd; while (game.PlayerList.Count < 4) { @@ -17,10 +18,6 @@ static void AddPlayers(Game game) game.AddPlayerInGame(playerTag); - game.PlayerAddNotified -= nc.NotificationMessagePlayer; - - game.PlayerAddNotified += nc.NotificationMessagePlayer; - Write("Do you want to add another player ? (y/n) : "); string? answer = ReadLine(); @@ -130,7 +127,14 @@ static void MenuSwitch(Game game) WriteLine("[2] Swap your tiles"); WriteLine("[3] Skip your turn"); - enter = Convert.ToInt32(ReadLine()); + try + { + enter = Convert.ToInt32(ReadLine()); + } + catch { + WriteLine("ERROR : You must type (1 / 2 / 3). Please retry : "); + } + switch (enter) { @@ -155,12 +159,14 @@ static void MainMenu(Game game) WriteLine("Game is starting !"); Console.ResetColor(); + NotificationClass nc = new NotificationClass(); + game.NextPlayerNotified += nc.NotificationNextPlayer; + do { - string tagPlayerPlay = game.SetNextPlayer(); + game.SetNextPlayer(); WriteLine(" --------------------- GAME ! ------------------------"); - WriteLine(tagPlayerPlay + "'s turn !"); game.DrawTiles(game.GetPlayingPlayer()); MenuSwitch(game);