bc13280dcad40383314bb4ca2018c58898968ef2
[imago.git] / imago_pack / output.py
1 """Imago output module."""
2
3 import sys
4
5 COORDS = 'abcdefghijklmnopqrs'
6
7 class Board:
8     def __init__(self, size, stones):
9         self.stones = stones        
10         self.size = size
11
12     def __str__(self):
13         lines = []
14         k = 0
15         for i in range(self.size):
16             line = []
17             for j in range(self.size):
18                 line.append(self.stones[k])
19                 k += 1
20             lines.append(" ".join(line))
21         return ("\n".join(lines))
22
23     def asSGFsetPos(self):
24         """Returns SGF (set position) representation of the position."""
25
26         #TODO version numbering
27         sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n"
28         sgf += self.SGFpos()
29         sgf += ")"
30         return sgf
31
32     def SGFpos(self):
33         black = []
34         white = []
35
36         for i in range(self.size):
37             for j in range(self.size):
38                 stone = self.stones[i * self.size + j]
39                 if stone == 'B':
40                     black.append((i, j))
41                 elif stone == 'W':
42                     white.append((i, j))
43         sgf = ""
44         if len(black) > 0:
45             sgf += "AB" + ''.join('[' + COORDS[j] + COORDS[i] + ']'
46                               for (i, j) in black) + "\n"
47         if len(white) > 0:
48             sgf += "AW" + ''.join('[' + COORDS[j] + COORDS[i] + ']' 
49                               for (i, j) in white) + "\n"
50         return sgf
51
52     def getMove(self, board):
53         for i in range(self.size):
54             for j in range(self.size):
55                 if (self.stones[self.size * i + j] == "."):
56                     if (board.stones[self.size * i + j] == "W"):
57                         return ("W", COORDS[i] + COORDS[j])
58                     elif (board.stones[self.size * i + j] == "B"):
59                         return ("B", COORDS[i] + COORDS[j])
60         return None
61
62
63 class Game:
64     def __init__(self, size, board=None):
65         self.init_board = board or Board(size, (size * size) * ".")
66         self.board = self.init_board
67         self.moves = []
68         self.size = size
69
70     def addMove(self, board):
71         self.moves.append(self.board.getMove(board))
72         self.board = board
73
74     def asSGF(self):
75         sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n"
76         sgf += self.init_board.SGFpos()
77         for m in self.moves:
78             if m:
79                 sgf += ";" + m[0] + "[" + m[1] + "]\n"
80         sgf += ")"
81         return sgf
82
83