1
0
Fork 0
mirror of https://github.com/imjasonh/chessh synced 2026-07-19 07:07:04 +00:00

improve board rendering

Signed-off-by: Jason Hall <jason@chainguard.dev>
This commit is contained in:
Jason Hall 2025-09-16 14:37:48 -05:00
parent bf74a871ff
commit 3a772ea21b
3 changed files with 27 additions and 25 deletions

View file

@ -96,7 +96,7 @@ func NewBoard() Board {
{Pawn, White}, {Pawn, White}, {Pawn, White}, {Pawn, White}, {Pawn, White}, {Pawn, White}, {Pawn, White}, {Pawn, White},
} }
for col := 0; col < 8; col++ { for col := range 8 {
for row := 2; row < 6; row++ { for row := 2; row < 6; row++ {
board[row][col] = Piece{Empty, White} board[row][col] = Piece{Empty, White}
} }
@ -435,8 +435,8 @@ func (g *Game) updateGameState(from, to Position, piece Piece) {
} }
func (g *Game) FindKing(color Color) Position { func (g *Game) FindKing(color Color) Position {
for row := 0; row < 8; row++ { for row := range 8 {
for col := 0; col < 8; col++ { for col := range 8 {
pos := Position{row, col} pos := Position{row, col}
piece := g.Board.At(pos) piece := g.Board.At(pos)
if piece.Type == King && piece.Color == color { if piece.Type == King && piece.Color == color {
@ -455,8 +455,8 @@ func (g *Game) IsInCheck(color Color) bool {
enemyColor := 1 - color enemyColor := 1 - color
for row := 0; row < 8; row++ { for row := range 8 {
for col := 0; col < 8; col++ { for col := range 8 {
pos := Position{row, col} pos := Position{row, col}
piece := g.Board.At(pos) piece := g.Board.At(pos)
if piece.Type != Empty && piece.Color == enemyColor { if piece.Type != Empty && piece.Color == enemyColor {
@ -500,13 +500,13 @@ func (g *Game) IsCheckmate(color Color) bool {
return false return false
} }
for row := 0; row < 8; row++ { for row := range 8 {
for col := 0; col < 8; col++ { for col := range 8 {
from := Position{row, col} from := Position{row, col}
piece := g.Board.At(from) piece := g.Board.At(from)
if piece.Type != Empty && piece.Color == color { if piece.Type != Empty && piece.Color == color {
for toRow := 0; toRow < 8; toRow++ { for toRow := range 8 {
for toCol := 0; toCol < 8; toCol++ { for toCol := range 8 {
to := Position{toRow, toCol} to := Position{toRow, toCol}
if g.isValidMoveIgnoringCheck(from, to) { if g.isValidMoveIgnoringCheck(from, to) {
originalPiece := g.Board.At(to) originalPiece := g.Board.At(to)

View file

@ -94,7 +94,7 @@ resource "google_cloud_run_v2_service" "chessh" {
scaling { scaling {
min_instance_count = 0 min_instance_count = 0
max_instance_count = 10 max_instance_count = 1
} }
} }

32
main.go
View file

@ -331,7 +331,7 @@ func (m model) renderBoardWithInfo() string {
if i < len(boardLines) { if i < len(boardLines) {
s.WriteString(boardLines[i]) s.WriteString(boardLines[i])
} else { } else {
s.WriteString(strings.Repeat(" ", 27)) // Board width padding s.WriteString(strings.Repeat(" ", 26)) // Board width padding (8*3 + 2 for row numbers)
} }
s.WriteString(" ") s.WriteString(" ")
@ -349,41 +349,43 @@ func (m model) renderBoardWithInfo() string {
func (m model) getBoardLines() []string { func (m model) getBoardLines() []string {
var lines []string var lines []string
lines = append(lines, " a b c d e f g h ") lines = append(lines, " a b c d e f g h ")
for row := 7; row >= 0; row-- { for row := 7; row >= 0; row-- {
var line strings.Builder var line strings.Builder
line.WriteString(fmt.Sprintf("%d ", row+1)) line.WriteString(fmt.Sprintf("%d", row+1))
for col := 0; col < 8; col++ { for col := range 8 {
pos := Position{row, col} pos := Position{row, col}
piece := m.game.Board.At(pos) piece := m.game.Board.At(pos)
cellChar := piece.String() cellChar := piece.String()
if piece.Type == Empty { if piece.Type == Empty {
if (row+col)%2 == 0 { cellChar = " "
cellChar = "·"
} else {
cellChar = " "
}
} }
// Determine background color
var bgColor string
if m.cursorRow == row && m.cursorCol == col { if m.cursorRow == row && m.cursorCol == col {
line.WriteString(fmt.Sprintf("[%s]", cellChar)) bgColor = "\033[41m" // Red background for cursor
} else if m.selected != nil && m.selected.Row == row && m.selected.Col == col { } else if m.selected != nil && m.selected.Row == row && m.selected.Col == col {
line.WriteString(fmt.Sprintf("<%s>", cellChar)) bgColor = "\033[43m" // Yellow background for selected
} else if slices.Contains(m.validMoves, pos) { } else if slices.Contains(m.validMoves, pos) {
line.WriteString(fmt.Sprintf("*%s*", cellChar)) bgColor = "\033[42m" // Green background for valid moves
} else if (row+col)%2 == 0 {
bgColor = "\033[47m" // White background for light squares
} else { } else {
line.WriteString(fmt.Sprintf(" %s ", cellChar)) bgColor = "\033[40m" // Black background for dark squares
} }
line.WriteString(fmt.Sprintf("%s %s \033[0m", bgColor, cellChar))
} }
line.WriteString(fmt.Sprintf(" %d", row+1)) line.WriteString(fmt.Sprintf("%d", row+1))
lines = append(lines, line.String()) lines = append(lines, line.String())
} }
lines = append(lines, " a b c d e f g h ") lines = append(lines, " a b c d e f g h ")
return lines return lines
} }