1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
random.seed()
class Translation(object):
""" A translation transformation.
"""
def __init__(self, board):
""" Create a new translation from the board.
"""
self.board = board
def is_valid(self):
""" Apply if a translation if the goban is not maximized.
"""
return self.board.min_x != 0 or self.board.min_y != 0
def apply_points(self, coord):
""" Move the points to the lower position.
"""
x, y = coord
return (x - self.board.min_x, y - self.board.min_y)
def get_new_size(self):
""" The goban size does not change.
"""
return 0, 0, self.board.max_x - self.board.min_x, self.board.max_y - self.board.min_y
def get_new_side(self):
""" There is no changes on the sides.
"""
return self.board.side
class Rotation(object):
""" A rotation transformation.
"""
def __init__(self, board):
""" Create a new roation from the board.
"""
self.board = board
def is_valid(self):
""" Apply the rotation in following cases :
* if the board is widther than heigther
* randomly is width == heigth
* never if the board is heigther than widther
"""
width, heigth = self.board.get_size()
should = heigth - width
if should == 0:
return random.randint(0, 1) == 1
return should < 0
def apply_points(self, coord):
""" Apply the transformation on a point.
"""
x, y = coord
return (self.board.max_y - y, x)
def get_new_size(self):
""" Apply the transformation on the goban size.
"""
max_x = self.board.max_y - self.board.min_y
return 0, self.board.min_x, max_x, self.board.max_x
def get_new_side(self):
""" Apply the transformations on the sides.
"""
return {
"BOTTOM": self.board.side["RIGHT"],
"RIGHT": self.board.side["TOP"],
"LEFT": self.board.side["BOTTOM"],
"TOP":self.board.side["LEFT"]
}
class Symmetry(object):
""" A translation transformation.
"""
def __init__(self, board):
self.board = board
self.x_flip = random.randint(0, 1) == 1
self.y_flip = random.randint(0, 1) == 1
def is_valid(self):
""" The transformation is valid if one flip is required in one
direction. """
return self.x_flip or self.y_flip
def apply_points(self, coord):
""" Flip in both directions.
"""
x, y = coord
if self.x_flip:
new_x = self.board.max_x - x + self.board.min_x
else:
new_x = x
if self.y_flip:
new_y = self.board.max_y - y + self.board.min_y
else:
new_y = y
return (new_x, new_y)
def get_new_size(self):
""" The size is not changed.
"""
return self.board.min_x, self.board.min_y, self.board.max_x, self.board.max_y
def get_new_side(self):
""" There is no changes on the sides.
"""
return {
"TOP": self.board.side["BOTTOM" if self.y_flip else "TOP"],
"LEFT": self.board.side["RIGHT" if self.x_flip else "LEFT"],
"RIGHT": self.board.side["LEFT" if self.x_flip else "RIGHT"],
"BOTTOM":self.board.side["TOP" if self.y_flip else "BOTTOM"]
}
|