blokus/blokus.py
2025-12-05 15:10:02 +01:00

80 lines
1.8 KiB
Python
Executable file

#!/usr/bin/env python
import random
import game
BOARD_SIZE = 14
tiles = game.game_tiles()
def can_place(
board: game.Board, tile: game.Tile, player: game.Player
) -> list[tuple[int, int]]:
placements = []
placements.extend
def print_game_state(game_state: tuple[game.Board, list[int], list[int]]):
(board, p1tiles, p2tiles) = game_state
barr = []
for i in range(BOARD_SIZE):
barr.append([])
for j in range(BOARD_SIZE):
barr[i].append(board[(j, i)])
for row in barr:
print(
"".join(
[
" " if x == 0 else "X" if x == 1 else "O" if x == 2 else "S"
for x in row
]
)
)
print("")
print(f"Player 1 tiles left: {p1tiles}")
print(f"Player 2 tiles left: {p2tiles}")
game_state = (
game.Board(),
[i for i in range(21)],
[i for i in range(21)],
)
playing = True
player = 1
while playing:
moves = []
assert player == 1 or player == 2
gp = game.Player.P1 if player == 1 else game.Player.P2
for tile_idx in game_state[player]:
tile = tiles[tile_idx]
perms = tile.permutations()
for perm in perms:
plcs = game_state[0].tile_placements(perm, gp)
moves.extend((tile_idx, perm, plc) for plc in plcs)
print(f"player {player} has {len(moves)} options")
if len(moves) == 0:
print(f"No moves left, player {player} lost")
playing = False
continue
(tidx, tile, placement) = random.choice(moves)
print(
f"player {player} is placing the following tile with index {tidx} at {placement}\n{tile}"
)
game_state[0].place(tile, placement, gp)
game_state[player].remove(tidx)
print_game_state(game_state)
if player == 1:
player = 2
elif player == 2:
player = 1