"""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
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