You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sae201_qwirkle/Qwirkle/QwirkleViews/Pages/GameBoard.xaml.cs

183 lines
5.8 KiB

using QwirkleClassLibrary.Games;
using QwirkleClassLibrary.Players;
using QwirkleClassLibrary.Tiles;
using QwirkleClassLibrary.Events;
using QwirkleClassLibrary.Boards;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.ComponentModel;
using Cell = QwirkleClassLibrary.Boards.Cell;
using Color = Microsoft.Maui.Graphics.Color;
using System.Drawing;
namespace Qwirkle.Pages;
public partial class Gameboard : ContentPage
{
public ICommand OnDrop => new Command<Cell>(OnDropTile);
public ICommand OnDropB => new Command(OnDropBag);
private Game game = ((App)Application.Current!).Game;
private Tile? tiledrag;
private List<Tile> tilesSwap = [];
public Color ColorBC1 { get; set; } = Colors.White;
public Color ColorBC2 { get; set; } = Colors.Transparent;
public Color ColorBC3 { get; set; } = Colors.Transparent;
public Color ColorBC4 { get; set; } = Colors.Transparent;
public Gameboard()
{
InitializeComponent();
BindingContext = game;
}
private void OnDragStarting(object sender, DragStartingEventArgs e)
{
var tile = ((Element)sender).BindingContext as Tile;
e.Data.Text = tile?.ToString();
tiledrag = tile;
}
private void OnDragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Copy;
}
private void OnDragOverBag(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Copy;
}
private void OnDropTile(Cell cell)
{
game.PlaceTileNotified += Game_PlaceTileNotified;
int x = cell.GetX;
int y = cell.GetY;
game.PlaceTile(game.GetPlayingPlayer(), tiledrag!, x, y);
game.PlaceTileNotified -= Game_PlaceTileNotified;
}
private void Game_PlaceTileNotified(object? sender, PlaceTileNotifiedEventArgs args)
{
if(args.Tile != null)
{
DisplayAlert("Tile place notified", args.Tile.ToString() + " : " + args.Reason, "<3");
return;
}
DisplayAlert("Tile place notified", args.Reason, "<3");
}
private void OnButtonSkipClicked(object sender, EventArgs e)
{
game.NextPlayerNotified += Game_NextPlayerNotified;
if (game.PlayerSwapping)
{
game.SwapTiles(game.GetPlayingPlayer(), tilesSwap);
tilesSwap.Clear();
game.PlayerSwapping = false;
}
else
{
game.GetPlayerScore(game.GetPlayingPlayer(), game.CellsUsed, game.GetBoard()!);
game.EmptyCellUsed();
game.DrawTiles(game.GetPlayingPlayer());
}
game.CheckGameOver(game.GetPlayingPlayer());
game.SetNextPlayer();
game.NextPlayerNotified -= Game_NextPlayerNotified;
ChangeColorBC();
}
private void ChangeColorBC()
{
if (game.GetPlayingPlayerPosition() == 0)
{
ColorBC1 = Colors.White;
ColorBC2 = Colors.Transparent;
ColorBC3 = Colors.Transparent;
ColorBC4 = Colors.Transparent;
OnPropertyChanged(nameof(ColorBC1));
OnPropertyChanged(nameof(ColorBC2));
OnPropertyChanged(nameof(ColorBC3));
OnPropertyChanged(nameof(ColorBC4));
}
if (game.GetPlayingPlayerPosition() == 1)
{
ColorBC2 = Colors.White;
ColorBC1 = Colors.Transparent;
ColorBC3 = Colors.Transparent;
ColorBC4 = Colors.Transparent;
OnPropertyChanged(nameof(ColorBC1));
OnPropertyChanged(nameof(ColorBC2));
OnPropertyChanged(nameof(ColorBC3));
OnPropertyChanged(nameof(ColorBC4));
}
if (game.GetPlayingPlayerPosition() == 2)
{
ColorBC3 = Colors.White;
ColorBC1 = Colors.Transparent;
ColorBC2 = Colors.Transparent;
ColorBC4 = Colors.Transparent;
OnPropertyChanged(nameof(ColorBC1));
OnPropertyChanged(nameof(ColorBC2));
OnPropertyChanged(nameof(ColorBC3));
OnPropertyChanged(nameof(ColorBC4));
}
if (game.GetPlayingPlayerPosition() == 3)
{
ColorBC4 = Colors.White;
ColorBC1 = Colors.Transparent;
ColorBC3 = Colors.Transparent;
ColorBC2 = Colors.Transparent;
OnPropertyChanged(nameof(ColorBC1));
OnPropertyChanged(nameof(ColorBC2));
OnPropertyChanged(nameof(ColorBC3));
OnPropertyChanged(nameof(ColorBC4));
}
}
private void Game_NextPlayerNotified(object? sender, NextPlayerNotifiedEventArgs args)
{
DisplayAlert("Player switch !", "It's your turn : " + args.Player.NameTag, "<3");
}
private void OnButtonSwapClicked(object sender, EventArgs e)
{
game.PlaceTileNotified += Game_PlaceTileNotified;
game.SwapTilesNotified += Game_SwapTilesNotified;
if (game.CellsUsed.Count == 0 && !game.PlayerSwapping)
{
DisplayAlert("Swap system", "\r\nWelcome to the swap system! To use the system, take the tiles you wish to swap and place them in the bag (you will not see the tiles disappear). Then, click on the skip button. /!\\ Attention, during the swap phase, you cannot play /!\\", "Copy !");
game.PlayerSwapping = true;
}
game.SwapTilesNotified -= Game_SwapTilesNotified;
game.PlaceTileNotified -= Game_PlaceTileNotified;
}
private void Game_SwapTilesNotified(object? sender, SwapTilesNotifiedEventArgs args)
{
DisplayAlert("Swap system", args.Reason, "<3");
}
private void OnDropBag()
{
if (game.PlayerSwapping)
{
game.PlayerList[game.GetPlayingPlayerPosition()].RemoveTileToPlayer(tiledrag!);
tilesSwap.Add(tiledrag!);
}
}
}