[go: up one dir, main page]

Menu

[cbc481]: / board.py  Maximize  Restore  History

Download this file

175 lines (141 with data), 5.7 kB

  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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from piece import PieceType
class BoardType(int):
none = 0
OddClassical = 1
Classical = 2
OddCroatianTies = 3
CroatianTies = 4
OddMayanAscendancy = 5
MayanAscendancy = 6
OddAgeOfAquarius = 7
AgeOfAquarius = 8
OddMirandasVeil = 9
MirandasVeil = 10
OddNineteen = 11
Nineteen = 12
OddHemerasDawn = 13
HemerasDawn = 14
OddTamoanchanRevisited = 15
TamoanchanRevisited = 16
OddConquestOfTlalocan = 17
ConquestOfTlalocan = 18
OddDiscovery = 19
Discovery = 20
OddOne = 21
One = 22
def __new__(cls, value):
if BoardType._is_valid(value):
return super(BoardType, cls).__new__(cls, value)
else:
raise ValueError("No such a board type, received '%s'." % (str(value), ))
def is_even_or_odd(self):
return (self % 2) == 0
@staticmethod
def _is_valid(board_type):
return BoardType.none <= board_type <= BoardType.One
def is_valid(self):
return BoardType._is_valid(self)
def get_name(self):
return { BoardType.none: 'none',
BoardType.OddClassical: 'Odd Classical',
BoardType.Classical: 'Classical',
BoardType.OddCroatianTies: 'Odd Croatian Ties',
BoardType.CroatianTies: 'Croatian Ties',
BoardType.OddMayanAscendancy: 'Odd Mayan Ascendancy',
BoardType.MayanAscendancy: 'Mayan Ascendancy',
BoardType.OddAgeOfAquarius: 'Odd Age Of Aquarius',
BoardType.AgeOfAquarius: 'Age Of Aquarius',
BoardType.OddMirandasVeil: 'Odd Miranda\'s Veil',
BoardType.MirandasVeil: 'Miranda\'s Veil',
BoardType.OddNineteen: 'Odd Nineteen',
BoardType.Nineteen: 'Nineteen',
BoardType.OddHemerasDawn: 'Odd Hemera\'s Dawn',
BoardType.HemerasDawn: 'Hemera\'s Dawn',
BoardType.OddTamoanchanRevisited: 'Odd Tamoanchan Revisited',
BoardType.TamoanchanRevisited: 'Tamoanchan Revisited',
BoardType.OddConquestOfTlalocan: 'Odd Conquest Of Tlalocan',
BoardType.ConquestOfTlalocan: 'Conquest Of Tlalocan',
BoardType.OddDiscovery: 'Odd Discovery',
BoardType.Discovery: 'Discovery',
BoardType.OddOne: 'Odd One',
BoardType.One: 'One' }[self]
def get_size(self):
return { BoardType.none: 0,
BoardType.OddClassical: 7,
BoardType.Classical: 8,
BoardType.OddCroatianTies: 9,
BoardType.CroatianTies: 10,
BoardType.OddMayanAscendancy: 11,
BoardType.MayanAscendancy: 12,
BoardType.OddAgeOfAquarius: 13,
BoardType.AgeOfAquarius: 14,
BoardType.OddMirandasVeil: 15,
BoardType.MirandasVeil: 16,
BoardType.OddNineteen: 17,
BoardType.Nineteen: 18,
BoardType.OddHemerasDawn: 19,
BoardType.HemerasDawn: 20,
BoardType.OddTamoanchanRevisited: 21,
BoardType.TamoanchanRevisited: 22,
BoardType.OddConquestOfTlalocan: 23,
BoardType.ConquestOfTlalocan: 24,
BoardType.OddDiscovery: 23,
BoardType.Discovery: 24,
BoardType.OddOne: 25,
BoardType.One: 26 }[self]
class Board(object):
def __init__(self, type, width=None, height=None):
self.type = type
if width is None:
width = self.type.get_size()
self._width = width
if height is None:
height = self.type.get_size()
self._height = height
self._board = [ [ PieceType(PieceType.none) for i in xrange(self._width) ] for j in xrange(self._height) ]
def _is_file(self, i):
return 0 <= i < self._width
def _is_rank(self, j):
return 0 <= j < self._height
def is_on_board(self, i, j):
return self._is_file(i) and self._is_rank(j)
def is_square(self):
return self._height == self._width
def is_by_the_book(self):
return (self._height == self.type.get_size()) and (self._width == self.type.get_size())
def clear(self):
for j in xrange(self._height):
for i in xrange(self._width):
self.set_piece(i, j, PieceType(PieceType.none))
def get_width(self):
return self._width
def get_height(self):
return self._height
def set_piece(self, i, j, piece):
self[j][i] = piece
def set_pieces(self, l):
for t in l:
self.set_piece(*t)
def get_piece(self, i, j):
return self[j][i]
# Pretending to be a list.
def __len__(self):
return self._width * self._height
def __getitem__(self, index):
return self._board[index]
def __setitem__(self, index, piece):
self._board[index] = piece
def __delitem__(self, index):
self._board[index] = PieceType(PieceType.none)
def __iter__(self):
return iter(self._board)
def __reversed__(self):
raise NotImplementedError("Can't reverse board. All pieces would fall off.")
def __contains__(self, piece):
for l in self._board:
for p in l:
if p == piece:
return p
return None