Add VisualizeBitboard function to BitboardHelepr
This commit is contained in:
parent
a71ba0dc9c
commit
6ae5aa695f
2 changed files with 60 additions and 15 deletions
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
namespace ChessChallenge.API
|
namespace ChessChallenge.API
|
||||||
{
|
{
|
||||||
|
using ChessChallenge.Application;
|
||||||
using ChessChallenge.Chess;
|
using ChessChallenge.Chess;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -99,6 +100,15 @@ namespace ChessChallenge.API
|
||||||
{
|
{
|
||||||
return isWhite ? Bits.WhitePawnAttacks[square.Index] : Bits.BlackPawnAttacks[square.Index];
|
return isWhite ? Bits.WhitePawnAttacks[square.Index] : Bits.BlackPawnAttacks[square.Index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void VisualizeBitboard(ulong bitboard)
|
||||||
|
{
|
||||||
|
BoardUI.VisualizeBitboardEnabled = true;
|
||||||
|
BoardUI.BitboardToVisualize = bitboard;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void StopVisualizingBitboard() => BoardUI.VisualizeBitboardEnabled = false;
|
||||||
|
|
||||||
static ulong GetRookAttacks(Square square, ulong blockers)
|
static ulong GetRookAttacks(Square square, ulong blockers)
|
||||||
{
|
{
|
||||||
ulong mask = Magic.RookMask[square.Index];
|
ulong mask = Magic.RookMask[square.Index];
|
||||||
|
|
|
@ -10,6 +10,8 @@ namespace ChessChallenge.Application
|
||||||
{
|
{
|
||||||
public class BoardUI
|
public class BoardUI
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Board settings
|
||||||
const int squareSize = 100;
|
const int squareSize = 100;
|
||||||
const double moveAnimDuration = 0.15;
|
const double moveAnimDuration = 0.15;
|
||||||
bool whitePerspective = true;
|
bool whitePerspective = true;
|
||||||
|
@ -19,6 +21,12 @@ namespace ChessChallenge.Application
|
||||||
static readonly Color inactiveTextCol = new(100, 100, 100, 255);
|
static readonly Color inactiveTextCol = new(100, 100, 100, 255);
|
||||||
static readonly Color nameCol = new(67, 204, 101, 255);
|
static readonly Color nameCol = new(67, 204, 101, 255);
|
||||||
|
|
||||||
|
// Bitboard debug mode
|
||||||
|
public static bool VisualizeBitboardEnabled { get; set; }
|
||||||
|
public static ulong BitboardToVisualize { get; set; }
|
||||||
|
static readonly Color bitboardColZERO = new(61, 121, 217, 200);
|
||||||
|
static readonly Color bitboardColONE = new(252, 43, 92, 200);
|
||||||
|
|
||||||
// Colour state
|
// Colour state
|
||||||
Color topTextCol;
|
Color topTextCol;
|
||||||
Color bottomTextCol;
|
Color bottomTextCol;
|
||||||
|
@ -195,34 +203,50 @@ namespace ChessChallenge.Application
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawBorder();
|
DrawBorder();
|
||||||
for (int y = 0; y < 8; y++)
|
ForEachSquare(DrawSquare);
|
||||||
|
|
||||||
|
if (isAnimatingMove)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < 8; x++)
|
UpdateMoveAnimation(animT);
|
||||||
{
|
}
|
||||||
DrawSquare(x, y);
|
|
||||||
}
|
if (VisualizeBitboardEnabled)
|
||||||
|
{
|
||||||
|
ForEachSquare(DrawBitboardDebugOverlaySquare);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDraggingPiece)
|
if (isDraggingPiece)
|
||||||
{
|
{
|
||||||
DrawPiece(board.Square[dragSquare], dragPos - new Vector2(squareSize * 0.5f, squareSize * 0.5f));
|
DrawPiece(board.Square[dragSquare], dragPos - new Vector2(squareSize * 0.5f, squareSize * 0.5f));
|
||||||
}
|
}
|
||||||
if (isAnimatingMove)
|
|
||||||
{
|
|
||||||
Coord startCoord = new Coord(moveToAnimate.StartSquareIndex);
|
|
||||||
Coord targetCoord = new Coord(moveToAnimate.TargetSquareIndex);
|
|
||||||
Vector2 startPos = GetSquarePos(startCoord.fileIndex, startCoord.rankIndex, whitePerspective);
|
|
||||||
Vector2 targetPos = GetSquarePos(targetCoord.fileIndex, targetCoord.rankIndex, whitePerspective);
|
|
||||||
|
|
||||||
Vector2 animPos = Vector2.Lerp(startPos, targetPos, (float)animT);
|
|
||||||
DrawPiece(board.Square[moveToAnimate.StartSquareIndex], animPos);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset state
|
// Reset state
|
||||||
isDraggingPiece = false;
|
isDraggingPiece = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ForEachSquare(Action<int, int> action)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 8; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 8; x++)
|
||||||
|
{
|
||||||
|
action(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateMoveAnimation(double animT)
|
||||||
|
{
|
||||||
|
Coord startCoord = new Coord(moveToAnimate.StartSquareIndex);
|
||||||
|
Coord targetCoord = new Coord(moveToAnimate.TargetSquareIndex);
|
||||||
|
Vector2 startPos = GetSquarePos(startCoord.fileIndex, startCoord.rankIndex, whitePerspective);
|
||||||
|
Vector2 targetPos = GetSquarePos(targetCoord.fileIndex, targetCoord.rankIndex, whitePerspective);
|
||||||
|
|
||||||
|
Vector2 animPos = Vector2.Lerp(startPos, targetPos, (float)animT);
|
||||||
|
DrawPiece(board.Square[moveToAnimate.StartSquareIndex], animPos);
|
||||||
|
}
|
||||||
|
|
||||||
public void DrawPlayerNames(string nameWhite, string nameBlack, int timeWhite, int timeBlack, bool isPlaying)
|
public void DrawPlayerNames(string nameWhite, string nameBlack, int timeWhite, int timeBlack, bool isPlaying)
|
||||||
{
|
{
|
||||||
string nameBottom = whitePerspective ? nameWhite : nameBlack;
|
string nameBottom = whitePerspective ? nameWhite : nameBlack;
|
||||||
|
@ -338,6 +362,17 @@ namespace ChessChallenge.Application
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DrawBitboardDebugOverlaySquare(int file, int rank)
|
||||||
|
{
|
||||||
|
bool isSet = BitBoardUtility.ContainsSquare(BitboardToVisualize, new Coord(file,rank).SquareIndex);
|
||||||
|
Color col = isSet ? bitboardColONE : bitboardColZERO;
|
||||||
|
|
||||||
|
Vector2 squarePos = GetSquarePos(file, rank, whitePerspective);
|
||||||
|
Raylib.DrawRectangle((int)squarePos.X, (int)squarePos.Y, squareSize, squareSize, col);
|
||||||
|
Vector2 textPos = squarePos + new Vector2(squareSize, squareSize) / 2;
|
||||||
|
DrawText(isSet ? "1" : "0", textPos, 50, 0, Color.WHITE, AlignH.Centre);
|
||||||
|
}
|
||||||
|
|
||||||
static Vector2 GetSquarePos(int file, int rank, bool whitePerspective)
|
static Vector2 GetSquarePos(int file, int rank, bool whitePerspective)
|
||||||
{
|
{
|
||||||
const int boardStartX = -squareSize * 4;
|
const int boardStartX = -squareSize * 4;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue