intro-to-dotnet-web-dev/5-blazor/1-complete/ConnectFour/Shared/Board.razor
Katie Savage 7549d7bdd9
Merge pull request #18 from EducatedStrikeCart/Fix_LastColumnUnableToFill
Fix a bug preventing last column of Connect Four from being filled
2023-02-03 13:30:04 -08:00

116 lines
2.6 KiB
Plaintext

@inject GameState State
@using System.Drawing
<HeadContent>
<style>
:root {
--board-bg: @ColorTranslator.ToHtml(BoardColor);
--player1: @ColorTranslator.ToHtml(Player1Color);
--player2: @ColorTranslator.ToHtml(Player2Color);
}
</style>
</HeadContent>
<nav>
<span title="Click to play a piece" @onclick="() => PlayPiece(0)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(1)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(2)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(3)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(4)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(5)">🔽</span>
<span title="Click to play a piece" @onclick="() => PlayPiece(6)">🔽</span>
</nav>
<article>
@WinnerMessage <button style="@ResetStyle" @onclick="ResetGame">Reset the game</button>
<br />
<span class="alert-danger">@ErrorMessage</span>
<span class="alert-info">@CurrentTurn</span>
</article>
<div>
<div class="board">
@for (var i = 0; i < 42; i++)
{
<span class="container"><span></span></span>
}
</div>
@for (var i = 0; i < 42; i++)
{
<span class="@Pieces[i]"></span>
}
</div>
@code {
private string[] Pieces = new string[42];
private string WinnerMessage = string.Empty;
private string ErrorMessage = string.Empty;
private string CurrentTurn => (WinnerMessage == string.Empty) ? $"Player {State.PlayerTurn}'s Turn" : "";
private string ResetStyle => (WinnerMessage == string.Empty) ? "display: none;" : "";
[Parameter()]
public Color BoardColor { get; set; }
= ColorTranslator.FromHtml("yellow");
[Parameter()]
public Color Player1Color { get; set; }
= ColorTranslator.FromHtml("red");
[Parameter()]
public Color Player2Color { get; set; }
= ColorTranslator.FromHtml("blue");
protected override void OnInitialized()
{
State.ResetBoard();
}
private void PlayPiece(byte col)
{
ErrorMessage = string.Empty;
try
{
var landingRow = State.PlayPiece(col);
var cssClass = $"player{State.PlayerTurn} col{col} drop{landingRow}";
Pieces[State.CurrentTurn - 1] = cssClass;
}
catch (ArgumentException ex)
{
ErrorMessage = ex.Message;
}
WinnerMessage = State.CheckForWin() switch
{
GameState.WinState.Player1_Wins => "Player 1 Wins!",
GameState.WinState.Player2_Wins => "Player 2 Wins!",
GameState.WinState.Tie => "It's a tie!",
_ => ""
};
}
void ResetGame()
{
State.ResetBoard();
WinnerMessage = string.Empty;
ErrorMessage = string.Empty;
Pieces = new string[42];
}
}