Source code for output

"""Imago output module."""

import copy
import sys

COORDS = 'abcdefghijklmnopqrs'

# TODO refactor method names

[docs]class Board: """Represents the state of the board.""" def __init__(self, size, stones): self.stones = stones self.size = size def __str__(self): """Retrun string representation of the board.""" lines = [] k = 0 for i in range(self.size): line = [] for j in range(self.size): line.append(self.stones[k]) k += 1 lines.append(" ".join(line)) lines.append("") return ("\n".join(lines))
[docs] def asSGFsetPos(self): """Returns SGF (set position) representation of the position.""" #TODO version numbering sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n" sgf += self.SGFpos() sgf += ")" return sgf
def SGFpos(self): black = [] white = [] for i in range(self.size): for j in range(self.size): stone = self.stones[i * self.size + j] if stone == 'B': black.append(Move('B', i, j)) elif stone == 'W': white.append(Move('W', i, j)) sgf = "" if len(black) > 0: sgf += "AB" + ''.join('[' + m.sgf_coords() + ']' for m in black) + "\n" if len(white) > 0: sgf += "AW" + ''.join('[' + m.sgf_coords() + ']' for m in white) + "\n" return sgf
[docs] def addMove(self, m): """Add move to the board.""" self.stones[(m.y * self.size) + m.x] = m.color
[docs] def getMoveCandidates(self, board): """Take the next board in game and return a list of moves that are new.""" candidates = [] for i in range(self.size): for j in range(self.size): if (self.stones[self.size * i + j] == "."): if (board.stones[self.size * i + j] == "W"): candidates.append(Move("W", i, j)) elif (board.stones[self.size * i + j] == "B"): candidates.append(Move("B", i, j)) return candidates
[docs]class Move: """Repsresents a move.""" def __init__(self, color, y, x, comment=None): self.color = color self.x = x self.y = y self.comment = comment
[docs] def sgf_coords(self): """Return coordinates of the move in SGF.""" return COORDS[self.x] + COORDS[self.y]
[docs]class Game: """Represents a game.""" def __init__(self, size, board=None, debug=True): self.init_board = board or Board(size, (size * size) * ".") self.board = copy.deepcopy(self.init_board) self.moves = [] self.size = size self.debug = debug self.debug_comment = ""
[docs] def addMove(self, board): """Add next move to the game.""" candidates = self.board.getMoveCandidates(board) if self.debug: comment = str(board) comment += "Candidates: " + str(len(candidates)) if not candidates: self.debug_comment += "No candidates." return move = candidates[0] move.comment = comment self.moves.append(move) self.board.addMove(move)
[docs] def asSGF(self): """Return the game representation as SGF string.""" sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n" sgf += self.init_board.SGFpos() for m in self.moves: if m: sgf += ";" + m.color + "[" + m.sgf_coords() + "]" if m.comment: sgf += "C[" + m.comment + "]" sgf += "\n" sgf += ")" return sgf