-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGridBoard.py
101 lines (79 loc) · 2.87 KB
/
GridBoard.py
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
import numpy as np
import random
import sys
def randPair(s,e):
return np.random.randint(s,e), np.random.randint(s,e)
class BoardPiece:
def __init__(self, name, code, pos):
self.name = name #name of the piece
self.code = code #an ASCII character to display on the board
self.pos = pos #2-tuple e.g. (1,4)
class BoardMask:
def __init__(self, name, mask, code):
self.name = name
self.mask = mask
self.code = code
def get_positions(self): #returns tuple of arrays
return np.nonzero(self.mask)
def zip_positions2d(positions): #positions is tuple of two arrays
x,y = positions
return list(zip(x,y))
class GridBoard:
def __init__(self, size=10):
self.size = size #Board dimensions, e.g. 4 x 4
self.components = {} #name : board piece
self.masks = {}
def addPiece(self, name, code, pos=(0,0)):
newPiece = BoardPiece(name, code, pos)
self.components[name] = newPiece
#basically a set of boundary elements
def addMask(self, name, mask, code):
#mask is a 2D-numpy array with 1s where the boundary elements are
newMask = BoardMask(name, mask, code)
self.masks[name] = newMask
def movePiece(self, name, pos):
move = True
for _, mask in self.masks.items():
if pos in zip_positions2d(mask.get_positions()):
move = False
if move:
self.components[name].pos = pos
def delPiece(self, name):
del self.components['name']
def render(self):
dtype = '<U2'
displ_board = np.zeros((self.size, self.size), dtype=dtype)
displ_board[:] = ' '
for name, piece in self.components.items():
if type(piece.pos) == str:
piece.pos = eval(piece.pos)
else:
piece.pos = tuple(piece.pos)
displ_board[piece.pos] = piece.code
for name, mask in self.masks.items():
displ_board[mask.get_positions()] = mask.code
return displ_board
def render_np(self):
num_pieces = len(self.components) + len(self.masks)
displ_board = np.zeros((num_pieces, self.size, self.size), dtype=np.uint8)
layer = 0
for name, piece in self.components.items():
if type(piece.pos) is str:
pos = (layer,) + tuple(eval(piece.pos))
else:
pos = (layer,) + tuple(piece.pos)
displ_board[pos] = 1
layer += 1
for name, mask in self.masks.items():
x, y = self.masks['boundary'].get_positions()
z = np.repeat(layer, len(x))
a = (z, x, y)
displ_board[a] = 1
layer += 1
return displ_board
def addTuple(a,b):
if type(a) == str:
a = eval(a)
if type(b) == str:
b = eval(b)
return tuple([sum(x) for x in zip(a,b)])