diff --git a/Qwirkle/QwirkleClassLibrary/Board.cs b/Qwirkle/QwirkleClassLibrary/Board.cs index 4614b52..81ba4e0 100644 --- a/Qwirkle/QwirkleClassLibrary/Board.cs +++ b/Qwirkle/QwirkleClassLibrary/Board.cs @@ -51,7 +51,6 @@ namespace QwirkleClassLibrary if (cells[i].IsFree == true) { return cells[i].SetTile(tile); - } } return false; diff --git a/Qwirkle/QwirkleClassLibrary/Game.cs b/Qwirkle/QwirkleClassLibrary/Game.cs index da0769d..088cb03 100644 --- a/Qwirkle/QwirkleClassLibrary/Game.cs +++ b/Qwirkle/QwirkleClassLibrary/Game.cs @@ -24,6 +24,9 @@ namespace QwirkleClassLibrary public ReadOnlyCollection ScoreList => scores.AsReadOnly(); private readonly List scores = new(); + + public ReadOnlyCollection CellsUsed => cellUsed.AsReadOnly(); + private readonly List cellUsed = new(); public Game() { @@ -84,6 +87,16 @@ namespace QwirkleClassLibrary return true; } + public void AddCellUsed(Cell? c) + { + if (c != null) cellUsed.Add(c); + } + + public void EmptyCellUsed() + { + cellUsed.Clear(); + } + public Player GetPlayingPlayer() { if(GetPlayingPlayerPosition() == -1) @@ -165,6 +178,12 @@ namespace QwirkleClassLibrary } } + + /// + /// Allows a player to draw tiles from the bag as soon as he has less than 6 tiles + /// + /// + /// public bool DrawTiles(Player player) { while(player.Tiles.Count < 6) @@ -210,6 +229,55 @@ namespace QwirkleClassLibrary return true; } + + public bool CheckExtendedSurroundingCells(Tile tile, int x, int y, int dx, int dy, Board b) + { + for (int i = 1; i < 7; i++) + { + var extendedCell = b.GetCell(x + i * dx, y + i * dy); + + if (extendedCell?.GetTile == null) + { + break; + } + + if (extendedCell.GetTile.GetColor != tile.GetColor && extendedCell.GetTile.GetShape != tile.GetShape) + { + return false; + } + + if (i == 6) + { + return false; + } + } + + return true; + } + + public bool CheckTilesInLine(List cells, Board b, int x, int y) + { + if(cells.Count < 2) + { + return true; + } + + var x1 = cells[0].GetX; + var y1 = cells[0].GetY; + var x2 = cells[1].GetX; + var y2 = cells[1].GetY; + + if (x1 == x2) + { + return x == x1; + } + if (y1 == y2) + { + return y == y1; + } + + return false; + } public bool IsMoveCorrect(Tile t, int x, int y, Board b) { @@ -218,7 +286,7 @@ namespace QwirkleClassLibrary return true; } - var surroundingCells = new[] + var surroundingCells = new List { b.GetCell(x + 1, y), b.GetCell(x - 1, y), @@ -241,29 +309,14 @@ namespace QwirkleClassLibrary var dx = cell.GetX - x; var dy = cell.GetY - y; - for (int i = 1; i < 7; i++) + if (CheckExtendedSurroundingCells(t, x, y, dx, dy, b) == false) { - var extendedCell = b.GetCell(x + i * dx, y + i * dy); - - if (extendedCell?.GetTile == null) - { - break; - } - - if (extendedCell.GetTile.GetColor != t.GetColor && extendedCell.GetTile.GetShape != t.GetShape) - { - return false; - } - - if (i == 6) - { - return false; - } + return false; } } - return surroundingCells.Any(cell => cell?.GetTile != null); - } + return CheckTilesInLine(this.cellUsed, b, x, y) && surroundingCells.Any(cell => cell?.GetTile != null); + } public int GetPlayerScore(Player player, List cellsPlayed, Board board) { @@ -319,7 +372,7 @@ namespace QwirkleClassLibrary public bool IsGameOver() { - return false; + return true; } } } \ No newline at end of file diff --git a/Qwirkle/QwirkleClassLibrary/IRules.cs b/Qwirkle/QwirkleClassLibrary/IRules.cs index 75d47a4..5041b74 100644 --- a/Qwirkle/QwirkleClassLibrary/IRules.cs +++ b/Qwirkle/QwirkleClassLibrary/IRules.cs @@ -14,6 +14,10 @@ namespace QwirkleClassLibrary bool IsMoveCorrect(Tile t, int x, int y, Board b); + bool CheckExtendedSurroundingCells(Tile tile, int x, int y, int dx, int dy, Board b); + + bool CheckTilesInLine(List cells, Board b, int x, int y); + bool IsGameOver(); } } diff --git a/Qwirkle/QwirkleConsoleApp/Program.cs b/Qwirkle/QwirkleConsoleApp/Program.cs index ef2f2a0..e76c236 100644 --- a/Qwirkle/QwirkleConsoleApp/Program.cs +++ b/Qwirkle/QwirkleConsoleApp/Program.cs @@ -76,6 +76,7 @@ static void AddTile(Game game) if (game.PlaceTile(game.GetPlayingPlayer(), tile, x, y) == true) { WriteLine("ok ! your tile is placed"); + game.AddCellUsed(game.GetBoard().GetCell(x, y)); } else { @@ -149,6 +150,7 @@ static void MenuSwitch(Game game) enter = 3; break; case 3: + game.EmptyCellUsed(); return; } } @@ -195,7 +197,7 @@ static void MainMenu(Game game) game.DrawTiles(game.GetPlayingPlayer()); MenuSwitch(game); - } while (true); //while (game.GetPlayingPlayerPosition() != game.PlayerList.Count - 1); + } while (game.IsGameOver()); //while (game.GetPlayingPlayerPosition() != game.PlayerList.Count - 1); } static void MainGame()