Source code for gomill.ascii_boards
"""ASCII board representation."""
from gomill.common import *
from gomill import boards
from gomill.common import column_letters
def render_grid(point_formatter, size):
"""Render a board-shaped grid as a list of strings.
point_formatter -- function (row, col) -> string of length 2.
Returns a list of strings.
"""
column_header_string = " ".join(column_letters[i] for i in range(size))
result = []
if size > 9:
rowstart = "%2d "
padding = " "
else:
rowstart = "%d "
padding = ""
for row in range(size-1, -1, -1):
result.append(rowstart % (row+1) +
" ".join(point_formatter(row, col)
for col in range(size)))
result.append(padding + " " + column_header_string)
return result
_point_strings = {
None : " .",
'b' : " #",
'w' : " o",
}
[docs]def render_board(board):
"""Render a gomill Board in ascii.
Returns a string without final newline.
"""
def format_pt(row, col):
return _point_strings.get(board.get(row, col), " ?")
return "\n".join(render_grid(format_pt, board.side))
[docs]def interpret_diagram(diagram, size, board=None):
"""Set up the position from a diagram.
diagram -- board representation as from render_board()
size -- int
Returns a Board.
If the optional 'board' parameter is provided, it must be an empty board of
the right size; the same object will be returned.
Ignores leading and trailing whitespace.
An ill-formed diagram may give ValueError or a 'best guess'.
"""
if board is None:
board = boards.Board(size)
else:
if board.side != size:
raise ValueError("wrong board size, must be %d" % size)
if not board.is_empty():
raise ValueError("board not empty")
lines = diagram.strip().split("\n")
colours = {'#' : 'b', 'o' : 'w', '.' : None}
if size > 9:
extra_offset = 1
else:
extra_offset = 0
try:
for (row, col) in board.board_points:
colour = colours[lines[size-row-1][3*(col+1)+extra_offset]]
if colour is not None:
board.play(row, col, colour)
except Exception:
raise ValueError
return board