initial commit
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from blokus_gym.core.game import BlokusGame
|
||||
|
||||
# ANSI color codes for terminal rendering
|
||||
ANSI_COLORS = {
|
||||
0: "\033[90m", # grey (empty)
|
||||
1: "\033[91m", # red
|
||||
2: "\033[94m", # blue
|
||||
3: "\033[93m", # yellow
|
||||
4: "\033[92m", # green
|
||||
}
|
||||
ANSI_RESET = "\033[0m"
|
||||
|
||||
# Player names
|
||||
PLAYER_NAMES = {1: "Red", 2: "Blue", 3: "Yellow", 4: "Green"}
|
||||
|
||||
|
||||
def render_text_board(game: BlokusGame) -> str:
|
||||
"""Render the board as a text string (no ANSI colors).
|
||||
|
||||
Returns a string representation of the board.
|
||||
"""
|
||||
lines = []
|
||||
size = game.board_size
|
||||
|
||||
# Column headers
|
||||
header = " " + " ".join(str(i % 10) for i in range(size))
|
||||
lines.append(header)
|
||||
|
||||
for y in range(size):
|
||||
row = f"{y % 10} "
|
||||
for x in range(size):
|
||||
cell = game.board.get_cell(x, y)
|
||||
if cell == 0:
|
||||
row += ". "
|
||||
else:
|
||||
row += f"{cell} "
|
||||
lines.append(row)
|
||||
|
||||
# Player info
|
||||
lines.append("")
|
||||
for i, player in enumerate(game.players):
|
||||
remaining = len(player.available_pieces)
|
||||
total = len(game.piece_set.pieces)
|
||||
name = PLAYER_NAMES.get(i + 1, f"Player {i + 1}")
|
||||
lines.append(f"{name}: {remaining}/{total} pieces remaining, score: {player.score}")
|
||||
|
||||
cur_name = PLAYER_NAMES.get(game.current_player + 1, game.current_player + 1)
|
||||
lines.append(f"Current player: {cur_name}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def render_ansi_board(game: BlokusGame) -> str:
|
||||
"""Render the board with ANSI color codes.
|
||||
|
||||
Returns a string with ANSI escape sequences for colored output.
|
||||
"""
|
||||
lines = []
|
||||
size = game.board_size
|
||||
|
||||
# Column headers
|
||||
header = " " + " ".join(str(i % 10) for i in range(size))
|
||||
lines.append(header)
|
||||
|
||||
for y in range(size):
|
||||
row = f"{y % 10} "
|
||||
for x in range(size):
|
||||
cell = game.board.get_cell(x, y)
|
||||
color = ANSI_COLORS.get(cell, ANSI_RESET)
|
||||
if cell == 0:
|
||||
row += f"{color}. {ANSI_RESET}"
|
||||
else:
|
||||
row += f"{color}{cell} {ANSI_RESET}"
|
||||
lines.append(row)
|
||||
|
||||
# Player info
|
||||
lines.append("")
|
||||
for i, player in enumerate(game.players):
|
||||
remaining = len(player.available_pieces)
|
||||
total = len(game.piece_set.pieces)
|
||||
name = PLAYER_NAMES.get(i + 1, f"Player {i + 1}")
|
||||
color = ANSI_COLORS.get(i + 1, ANSI_RESET)
|
||||
lines.append(
|
||||
f"{color}{name}{ANSI_RESET}: {remaining}/{total} pieces, "
|
||||
f"score: {player.score}"
|
||||
)
|
||||
|
||||
lines.append(
|
||||
f"Current player: "
|
||||
f"{ANSI_COLORS.get(game.current_player + 1, ANSI_RESET)}"
|
||||
f"{PLAYER_NAMES.get(game.current_player + 1, game.current_player + 1)}"
|
||||
f"{ANSI_RESET}"
|
||||
)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def print_board(game: BlokusGame, use_ansi: bool = True) -> None:
|
||||
"""Print the board to stdout."""
|
||||
if use_ansi:
|
||||
print(render_ansi_board(game))
|
||||
else:
|
||||
print(render_text_board(game))
|
||||
Reference in New Issue
Block a user