|
|
@ -11,7 +11,7 @@ namespace QwirkleClassLibrary
|
|
|
|
{
|
|
|
|
{
|
|
|
|
public class Game : IPlayer, IRules
|
|
|
|
public class Game : IPlayer, IRules
|
|
|
|
{
|
|
|
|
{
|
|
|
|
private readonly TileBag bag;
|
|
|
|
private TileBag bag;
|
|
|
|
public bool GameRunning { get; private set; }
|
|
|
|
public bool GameRunning { get; private set; }
|
|
|
|
private Board board;
|
|
|
|
private Board board;
|
|
|
|
|
|
|
|
|
|
|
@ -21,28 +21,40 @@ namespace QwirkleClassLibrary
|
|
|
|
public ReadOnlyCollection<Score> ScoreList => scores.AsReadOnly();
|
|
|
|
public ReadOnlyCollection<Score> ScoreList => scores.AsReadOnly();
|
|
|
|
private readonly List<Score> scores = new();
|
|
|
|
private readonly List<Score> scores = new();
|
|
|
|
|
|
|
|
|
|
|
|
public event EventHandler<AddPlayerNotifiedEventArgs> PlayerAddNotified;
|
|
|
|
public event EventHandler<AddPlayerNotifiedEventArgs>? PlayerAddNotified;
|
|
|
|
|
|
|
|
|
|
|
|
protected virtual void OnPlayerNotified(AddPlayerNotifiedEventArgs args)
|
|
|
|
protected virtual void OnPlayerNotified(AddPlayerNotifiedEventArgs args)
|
|
|
|
=> PlayerAddNotified?.Invoke(this, args);
|
|
|
|
=> PlayerAddNotified?.Invoke(this, args);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public event EventHandler<NextPlayerNotifiedEventArgs>? NextPlayerNotified;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected virtual void OnNextPlayer(NextPlayerNotifiedEventArgs args)
|
|
|
|
|
|
|
|
=> NextPlayerNotified?.Invoke(this, args);
|
|
|
|
|
|
|
|
|
|
|
|
public Game()
|
|
|
|
public Game()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bag = new TileBag(3);
|
|
|
|
bag = new TileBag(3);
|
|
|
|
board = CreateBoard();
|
|
|
|
board = CreateBoard();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool AddPlayerInGame(string? playerTag)
|
|
|
|
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;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (players.Count >= 4)
|
|
|
|
if (players.Count >= 4)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs(2));
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : The game is full."));
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -50,7 +62,7 @@ namespace QwirkleClassLibrary
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (p.NameTag == playerTag)
|
|
|
|
if (p.NameTag == playerTag)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs(3));
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs("ERROR : Name alreay taken"));
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -58,7 +70,7 @@ namespace QwirkleClassLibrary
|
|
|
|
|
|
|
|
|
|
|
|
players.Add(CreatePlayer(playerTag));
|
|
|
|
players.Add(CreatePlayer(playerTag));
|
|
|
|
scores.Add(new Score(players[players.Count-1]));
|
|
|
|
scores.Add(new Score(players[players.Count-1]));
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs(0));
|
|
|
|
OnPlayerNotified(new AddPlayerNotifiedEventArgs("Player was correctly added"));
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -117,7 +129,7 @@ namespace QwirkleClassLibrary
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (int j = 0; j < 6; j++)
|
|
|
|
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]);
|
|
|
|
p.AddTileToPlayer(bag.TilesBag[val]);
|
|
|
|
bag.RemoveTileInBag(bag.TilesBag[val]);
|
|
|
|
bag.RemoveTileInBag(bag.TilesBag[val]);
|
|
|
@ -130,6 +142,7 @@ namespace QwirkleClassLibrary
|
|
|
|
if (GameRunning == true)
|
|
|
|
if (GameRunning == true)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
players[0].IsPlaying = true;
|
|
|
|
players[0].IsPlaying = true;
|
|
|
|
|
|
|
|
//OnNextPlayer(new NextPlayerNotifiedEventArgs(players[0]));
|
|
|
|
return players[0].NameTag;
|
|
|
|
return players[0].NameTag;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -150,6 +163,7 @@ namespace QwirkleClassLibrary
|
|
|
|
|
|
|
|
|
|
|
|
players[i].IsPlaying = false;
|
|
|
|
players[i].IsPlaying = false;
|
|
|
|
players[(i + 1) % players.Count].IsPlaying = true;
|
|
|
|
players[(i + 1) % players.Count].IsPlaying = true;
|
|
|
|
|
|
|
|
OnNextPlayer(new NextPlayerNotifiedEventArgs(players[i]));
|
|
|
|
|
|
|
|
|
|
|
|
return players[GetPlayingPlayerPosition()].NameTag;
|
|
|
|
return players[GetPlayingPlayerPosition()].NameTag;
|
|
|
|
}
|
|
|
|
}
|
|
|
|