diff --git a/source/Trek-12/ConsoleApp/Program.cs b/source/Trek-12/ConsoleApp/Program.cs index 70dadea..e623b1c 100644 --- a/source/Trek-12/ConsoleApp/Program.cs +++ b/source/Trek-12/ConsoleApp/Program.cs @@ -5,11 +5,17 @@ using Models.Events; using Models.Game; using Models.Interfaces; using DataContractPersistence; +using Microsoft.Extensions.Logging; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; namespace ConsoleApp; class Program { + + static Game Game { get; set; } + /// /// Main function of the console app /// @@ -24,21 +30,131 @@ class Program Player player = new Player(pseudo, "test.png"); Map map = new Map("Dunai","background"); - Game game = new Game(persistence); + Game = new Game(persistence); // Abonnement aux événements - game.GameStarted += OnGameStarted!; - game.GameEnded += OnGameEnded!; - game.BoardUpdated += OnBoardUpdated!; - game.DiceRolled += OnDiceRolled!; - game.OperationChosen += OnOperationChosen!; - game.CellChosen += OnCellChosen!; + Game.GameStarted += OnGameStarted!; + Game.GameEnded += OnGameEnded!; + Game.BoardUpdated += OnBoardUpdated!; + Game.DiceRolled += OnDiceRolled!; + Game.OperationChosen += OnOperationChosen!; + Game.CellChosen += OnCellChosen!; + Game.PlayerChooseOp += OnPlayerSelectionOp!; + Game.PlayerOption += OnPlayerOption!; + Game.PlayerChooseCell += OnPlayerSelectionCell!; // Initialisation - game.InitializeGame(map, player); + Game.InitializeGame(map, player); + } + + + } + + static void OnPlayerSelectionCell(Object sender, PlayerChooseCellEventArgs e) + { + int row, column; + while (true) + { + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine("Enter the position of the cell you want to play"); + Console.WriteLine("Enter the row number (0-6)"); + Console.ResetColor(); + if (!int.TryParse(Console.ReadLine(), out row) || row < 0 || row >= 7) + { + Console.ForegroundColor= ConsoleColor.Red; + Console.WriteLine("Invalid row number. Please enter a number between 0 and 6."); + Console.ResetColor(); + continue; + } + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine("Enter the column number (0-6)"); + Console.ResetColor(); + if (!int.TryParse(Console.ReadLine(), out column) || column < 0 || column >= 7) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Invalid column number. Please enter a number between 0 and 6."); + Console.ResetColor(); + continue; + } + + Game.PlayerCell = new Cell(row, column); + break; + } + } + + static void OnPlayerOption(object sender, PlayerOptionEventArgs e) + { + Console.WriteLine(); + if(e.Turn != 1) + { + IEnumerable PlayedCellsQuery = + from cell in e.Board + where cell.Valid == true + where cell.Value != null + select cell; + foreach (var item in e.Board) + { + if (item.X == 6) + Console.WriteLine(); + if (!item.Valid) + Console.Write(" "); + else if (item.Value != null) + Console.Write($"{item.Value}"); + else + { + foreach (var item1 in PlayedCellsQuery) + { + if (Math.Abs(item.X - item1.X) <= 1 && Math.Abs(item.Y - item1.Y) <= 1) + { + Console.ForegroundColor = ConsoleColor.Cyan; + Console.Write($"{e.Resultat}"); + Console.ResetColor(); + } + } + } + } + return; + } + foreach (var item in e.Board) + { + if (!item.Valid) + Console.Write(" "); + else + { + Console.ForegroundColor = ConsoleColor.Cyan; + Console.Write($"{e.Resultat}"); + Console.ResetColor(); + + } + if (item.X == 6) + Console.WriteLine(); } + Console.WriteLine(); + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine("Choose an Available cell."); + Console.ResetColor(); + } + + static void OnPlayerSelectionOp(object sender, PlayerChooseOperationEventArgs e) + { + Console.WriteLine(); + DisplayOperationTable(((Game)sender).UsedMap.OperationGrid.ToList()); + Console.WriteLine(); + Console.WriteLine("0. Lower | 1. Higher | 2. Substraction | 3. Addition | 4. Multiplication"); + string? op = Console.ReadLine(); + while (op != "0" && op != "1" && op != "2" && op != "3" && op != "4") + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Invalid operation. Please choose again."); + Console.ResetColor(); + op = Console.ReadLine(); + } + int test = Convert.ToInt32(op); + Game.PlayerOperation = (Operation)test; + } + /// /// Handles the event when the game has started. /// @@ -65,10 +181,18 @@ class Program /// /// /// - static void OnBoardUpdated(object sender, EventArgs e) + static void OnBoardUpdated(object sender, BoardsUpdateEventArgs e) { - DisplayBoard(((Game)sender).UsedMap); - DisplayOperationTable(((Game)sender).UsedMap.OperationGrid.ToList()); + foreach (var item in e.Boards) + { + if (!item.Valid) + Console.Write(" "); + else if (item.Value != null) + Console.Write($"{item.Value}"); + else Console.Write("O"); + if (item.X == 6) + Console.WriteLine(); + } } /// @@ -78,9 +202,12 @@ class Program /// static void OnDiceRolled(object sender, DiceRolledEventArgs e) { + // Console.Clear(); Console.WriteLine($"Dice 1: {e.Dice1Value} | Dice 2: {e.Dice2Value}"); - Operation playerOperation = GetPlayerOperation(sender); - ((Game)sender).HandlePlayerOperation(playerOperation); + Console.WriteLine(); + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine("Choose an operation."); + Console.ResetColor(); } /// @@ -180,24 +307,28 @@ class Program /// The operation table to display. static void DisplayOperationTable(List operationTable) { - Console.WriteLine("Operation Table:"); - string[] operations = { "Addition (+)", "Subtraction (-)", "Multiplication (*)", "Lower Dice (less)", "Higher Dice (high)" }; - - for (int i = 0; i < operations.Length; i++) + Console.ForegroundColor = ConsoleColor.Yellow; + foreach ( var cell in operationTable) { - Console.Write(operations[i].PadRight(18)); - - for (int j = 0; j < 4; j++) - { - int index = i * 4 + j; - if (index < operationTable.Count) - { - string status = operationTable[index].IsChecked ? "X" : " "; - Console.Write($" | {status}"); - } - } - Console.WriteLine(); + + if (cell.X == 0 && cell.Y == 0) + Console.Write("Lower => "); + if (cell.X == 0 && cell.Y == 1) + Console.Write("Higher => "); + if (cell.X == 0 && cell.Y == 2) + Console.Write("Substraction => "); + if (cell.X == 0 && cell.Y == 3) + Console.Write("Addition => "); + if (cell.X == 0 && cell.Y == 4) + Console.Write("Multiplication => "); + if (cell.IsChecked) + Console.Write("X | "); + if (!cell.IsChecked) + Console.Write(" | "); + if (cell.X == 3) + Console.WriteLine(); } + Console.ResetColor(); } /// diff --git a/source/Trek-12/Models/Events/BoardsUpdateEventArgs.cs b/source/Trek-12/Models/Events/BoardsUpdateEventArgs.cs index 22e205f..1526db6 100644 --- a/source/Trek-12/Models/Events/BoardsUpdateEventArgs.cs +++ b/source/Trek-12/Models/Events/BoardsUpdateEventArgs.cs @@ -7,7 +7,7 @@ namespace Models.Events /// public class BoardsUpdateEventArgs : EventArgs { - public List Boards { get; } + public List Boards { get; set; } public BoardsUpdateEventArgs(List board) { diff --git a/source/Trek-12/Models/Events/PlayerChooseCellEventArgs.cs b/source/Trek-12/Models/Events/PlayerChooseCellEventArgs.cs new file mode 100644 index 0000000..cf51950 --- /dev/null +++ b/source/Trek-12/Models/Events/PlayerChooseCellEventArgs.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Models.Game; + +namespace Models.Events +{ + public class PlayerChooseCellEventArgs : EventArgs + { + public Cell Cell { get; set; } + public PlayerChooseCellEventArgs(Cell cell) + { + Cell = cell; + } + } +} diff --git a/source/Trek-12/Models/Events/PlayerChooseOperationEventArgs.cs b/source/Trek-12/Models/Events/PlayerChooseOperationEventArgs.cs new file mode 100644 index 0000000..ccbcd6b --- /dev/null +++ b/source/Trek-12/Models/Events/PlayerChooseOperationEventArgs.cs @@ -0,0 +1,19 @@ +using Models.Game; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Models.Events +{ + public class PlayerChooseOperationEventArgs : EventArgs + { + public Operation PlayerOp { get; set; } + + public PlayerChooseOperationEventArgs(Operation op) + { + PlayerOp = op; + } + } +} diff --git a/source/Trek-12/Models/Events/PlayerOptionEventArgs.cs b/source/Trek-12/Models/Events/PlayerOptionEventArgs.cs new file mode 100644 index 0000000..036370b --- /dev/null +++ b/source/Trek-12/Models/Events/PlayerOptionEventArgs.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Models.Game; + +namespace Models.Events +{ + public class PlayerOptionEventArgs : EventArgs + { + public List Board { get; set; } + public int Resultat { get; set; } + public int Turn { get; set; } + + public PlayerOptionEventArgs(List boards, int resultat, int turn) + { + Board = boards; + Resultat = resultat; + Turn = turn; + } + } +} diff --git a/source/Trek-12/Models/Game/Game.cs b/source/Trek-12/Models/Game/Game.cs index 20cca2f..4d0f6a7 100644 --- a/source/Trek-12/Models/Game/Game.cs +++ b/source/Trek-12/Models/Game/Game.cs @@ -101,6 +101,10 @@ namespace Models.Game [DataMember] public int Turn { get; private set; } + public Operation PlayerOperation { get; set; } + + public Cell PlayerCell { get; set; } + public Rules.Rules GameRules { get; } @@ -111,7 +115,11 @@ namespace Models.Game public event EventHandler DiceRolled; public event EventHandler OperationChosen; public event EventHandler CellChosen; - + public event EventHandler PlayerChooseOp; + public event EventHandler PlayerOption; + public event EventHandler PlayerChooseCell; + + public void AddPlayer(Player player) { Players.Add(player); @@ -259,7 +267,7 @@ namespace Models.Game /// Marks an operation as checked in the operation grid of the game. /// /// - public void MarkOperationAsChecked(Operation operation) + private void MarkOperationAsChecked(Operation operation) { int operationIndex = (int)operation; IEnumerable sortPaths = @@ -299,8 +307,6 @@ namespace Models.Game Operation.MULTIPLICATION => Dice2.Value * Dice1.Value, _ => throw new ArgumentOutOfRangeException() }; - - MarkOperationAsChecked(o); return result; } @@ -311,27 +317,18 @@ namespace Models.Game /// /// The cell chosen by the player to place the result. /// The result of the dice operation to be placed in the cell. - private bool PlaceResult(Cell playerChoice, int result) + private void PlaceResult(Cell playerChoice, int result) { - if (Turn == 1 || GameRules.NearCellIsValid(playerChoice, UsedMap.Boards.ToList())) + IEnumerable ValidCell = + from cell in UsedMap.Boards + where cell.Value == null + where cell.Valid == true + select cell; + foreach (var item in ValidCell) { - for (int i = 0; i < UsedMap.Boards.Count; i++) - { - if (UsedMap.Boards[i].X == playerChoice.X && UsedMap.Boards[i].Y == playerChoice.Y) - { - if (UsedMap.Boards[i].Value != null) - return false; - UsedMap.Boards[i].Value = result; - if ((UsedMap.Boards[i].IsDangerous && result > 6) || result > 12) - UsedMap.Boards[i].SetPenalty(); - BoardUpdated?.Invoke(this, new BoardsUpdateEventArgs(UsedMap.Boards.ToList())); - return true; - } - } - //playerChoice.Value = result; + if(item.X == playerChoice.X && item.Y == playerChoice.Y) + item.Value = result; } - return false; - } /// @@ -413,28 +410,38 @@ namespace Models.Game /// private void GameLoop() { + int res = 0,turn = 1; + Cell cell; while (IsRunning) { - if (Turn == 20) - { - foreach(var cells in UsedMap.Boards.ToList()) - { - GameRules.IsZoneValidAndAddToZones(cells, UsedMap); - AddToRopePath(cells, GameRules.EveryAdjacentCells(cells, UsedMap.Boards.ToList())); - } - int? points = GameRules.FinalCalculusOfZones(UsedMap.Zones); - for (int i = 0; i < UsedMap.RopePaths.Count; i++) - { - points += GameRules.ScoreRopePaths(UsedMap.RopePaths[i]); - } - EndGame(points); - break; - } - RollAllDice(); + res = PlayerChooseOperation(); + PlayerOption?.Invoke(this,new PlayerOptionEventArgs(UsedMap.Boards.ToList(),res,turn)); + PlayerSelectionCell(); + PlaceResult(PlayerCell,res); + BoardUpdated?.Invoke(this, new BoardsUpdateEventArgs(UsedMap.Boards.ToList())); + turn++; + } + } - Turn++; + public int PlayerChooseOperation() + { + PlayerChooseOp?.Invoke(this, new PlayerChooseOperationEventArgs(PlayerOperation)); + while(!GameRules.OperationAvailable(PlayerOperation,UsedMap.OperationGrid.ToList())) + { + PlayerChooseOp?.Invoke(this, new PlayerChooseOperationEventArgs(PlayerOperation)); + } + return ResultOperation(PlayerOperation); + } + + public void PlayerSelectionCell() + { + PlayerChooseCell?.Invoke(this,new PlayerChooseCellEventArgs(PlayerCell)); + while(!GameRules.NearCellIsValid(PlayerCell,UsedMap.Boards.ToList())) + { + PlayerChooseCell?.Invoke(this, new PlayerChooseCellEventArgs(PlayerCell)); } + MarkOperationAsChecked(PlayerOperation); } /// @@ -468,7 +475,7 @@ namespace Models.Game //throw new InvalidCellException("Cell is not valid. Please choose again."); } - bool res = PlaceResult(cell, result); + bool res = true; if (!res) { return false; diff --git a/source/Trek-12/Models/Game/Map.cs b/source/Trek-12/Models/Game/Map.cs index 8b034b6..324d5fd 100644 --- a/source/Trek-12/Models/Game/Map.cs +++ b/source/Trek-12/Models/Game/Map.cs @@ -72,7 +72,7 @@ namespace Models.Game { for (int i = 0; i < 49; i++) // 7x7 board { - board.Add(new Cell(i / 7, i % 7)); + board.Add(new Cell(i % 7, i / 7)); } board[1].Valid = true; board[3].Valid = true; diff --git a/source/Trek-12/Models/Rules/Rules.cs b/source/Trek-12/Models/Rules/Rules.cs index 54a29e4..42b28e7 100644 --- a/source/Trek-12/Models/Rules/Rules.cs +++ b/source/Trek-12/Models/Rules/Rules.cs @@ -35,10 +35,7 @@ namespace Models.Rules { if (Math.Abs(choosenCell.X - targetCell.X) <= 1 && Math.Abs(choosenCell.Y - targetCell.Y) <= 1) { - if (choosenCell.X != targetCell.X || choosenCell.Y != targetCell.Y) - { return true; - } } return false; @@ -73,15 +70,16 @@ namespace Models.Rules IEnumerable PlayedCellsQuery = from cell in cells - where cell.Value != null + where cell.Valid == true select cell; foreach (var cell in PlayedCellsQuery) { + if (choosenCell.X == cell.X && choosenCell.Y == cell.Y && cell.Value == null) + return true; if (IsCellAdjacent(choosenCell, cell)) - { return true; - } + } return false; @@ -217,5 +215,19 @@ namespace Models.Rules return score; } + public bool OperationAvailable(Operation operation,List operationGrid) + { + IEnumerable row = + from cell in operationGrid + where cell.Y == (int)operation + select cell; + foreach (var item in row) + { + if (!item.IsChecked) + return true; + } + return false; + } + } } \ No newline at end of file