@using Shogi.Contracts.Types; @inject IShogiApi ShogiApi @inject AccountState Account;
@for (var rank = 1; rank < 10; rank++) { foreach (var file in Files) { var position = $"{file}{rank}"; var piece = session?.BoardState.Board[position];
} }
9 8 7 6 5 4 3 2 1
A B C D E F G H I
@if (session != null) { }
@code { [Parameter] public string? SessionName { get; set; } static readonly string[] Files = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; WhichPlayer Perspective => Account.User?.Id == session?.Player1 ? WhichPlayer.Player1 : WhichPlayer.Player2; Session? session; IReadOnlyCollection OpponentHand { get { if (this.session == null) return Array.Empty(); return Perspective == WhichPlayer.Player1 ? this.session.BoardState.Player1Hand : this.session.BoardState.Player2Hand; } } IReadOnlyCollection UserHand { get { if (this.session == null) return Array.Empty(); return Perspective == WhichPlayer.Player1 ? this.session.BoardState.Player1Hand : this.session.BoardState.Player2Hand; } } string? selectedPosition; WhichPiece? selectedPiece; protected override async Task OnParametersSetAsync() { if (!string.IsNullOrWhiteSpace(SessionName)) { this.session = await ShogiApi.GetSession(SessionName); } } void OnClickTile(Piece? piece, string position) { if (selectedPosition == null) { selectedPosition = position; return; } else if (selectedPosition == position) { selectedPosition = null; return; } else if (piece != null) { ShogiApi.PostMove(SessionName!, new Contracts.Api.MovePieceCommand { From = selectedPosition, To = position, IsP }); } } void OnClickHand(Piece piece) { selectedPiece = piece.WhichPiece; } }