X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/0bad9c71956e4ab7006090a256edf7852957adcd..0acee7985cbb654d6fa50cb845c7c03ce6bb8a1d:/imago_pack/output.py diff --git a/imago_pack/output.py b/imago_pack/output.py index 82d1e4f..366d0d9 100644 --- a/imago_pack/output.py +++ b/imago_pack/output.py @@ -1,32 +1,10 @@ """Imago output module.""" +import copy import sys COORDS = 'abcdefghijklmnopqrs' -def txt2sgf(board): - """Converts textual represantation to SGF (set position).""" - - board = sys.stdin.read().split('\n') - board = [line.split() for line in board] - - black = [] - white = [] - - for i in range(19): - for j in range(19): - if board[i][j] == 'B': - black.append((i, j)) - elif board[i][j] == 'W': - white.append((i, j)) - - sgf = "" - #TODO version numbering - sgf += "(;FF[4]GM[1]SZ[19]AP[Imago:0.1.0]" - sgf += "AB" + ''.join('[' + coords[j] + coords[i] + ']' for (i, j) in black) - sgf += "AW" + ''.join('[' + coords[j] + coords[i] + ']' for (i, j) in white) - sgf += ")" - class Board: def __init__(self, size, stones): self.stones = stones @@ -41,15 +19,96 @@ class Board: line.append(self.stones[k]) k += 1 lines.append(" ".join(line)) + lines.append("") return ("\n".join(lines)) + 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 + def addMove(self, m): + self.stones[(m.y * self.size) + m.x] = m.color + + def getMoveCandidates(self, board): + 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 + +class Move: + def __init__(self, color, y, x, comment=None): + self.color = color + self.x = x + self.y = y + self.comment = comment + + def sgf_coords(self): + return COORDS[self.x] + COORDS[self.y] class Game: - def __init__(self, size): - self.board = (size * size) * "." + 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 = "" + + def addMove(self, board): + 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) + + def asSGF(self): + 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 - def add(self, board): - self