1from pychess.Utils.const import SETUPCHESS, VARIANTS_OTHER, BLACK, reprSign 2from pychess.Utils.Board import Board 3from pychess.Utils.Piece import Piece 4from pychess.Utils.lutils.LBoard import LBoard 5 6SETUPSTART = "4k3/8/8/8/8/8/8/4K3 w - - 0 1" 7 8 9class SetupBoard(Board): 10 variant = SETUPCHESS 11 __desc__ = "" 12 name = "" 13 cecp_name = "" 14 standard_rules = False 15 variant_group = VARIANTS_OTHER 16 17 PROMOTION_ZONE = ((), ()) 18 PROMOTIONS = () 19 20 def __init__(self, setup=True, lboard=None): 21 fenstr = SETUPSTART if setup is True else setup 22 # add all kind of pieces to holdings 23 parts = fenstr.split() 24 parts[0] += "/prnsqkPRNSQK" 25 fenstr = " ".join(parts) 26 if lboard is not None: 27 Board.__init__(self, setup=fenstr, lboard=lboard) 28 else: 29 Board.__init__(self, setup=fenstr) 30 self._ply = 0 31 32 def _get_ply(self): 33 return self._ply 34 35 ply = property(_get_ply) 36 37 def simulateMove(self, board, move): 38 moved = [] 39 new = [] 40 dead = [] 41 42 cord0, cord1 = move.cord0, move.cord1 43 if cord1.x < 0 or cord1.x > self.FILES - 1: 44 dead.append(self[cord0]) 45 else: 46 moved.append((self[cord0], cord0)) 47 48 return moved, new, dead 49 50 def move(self, move, color): 51 new_board = self.clone() 52 new_board._ply = self._ply + 1 53 cord0, cord1 = move.cord0, move.cord1 54 if cord0.x < 0 or cord0.x > self.FILES - 1 and \ 55 (cord1.x >= 0 and cord1.x <= 7): 56 new_board[cord1] = new_board[cord0] 57 new_board[cord0] = Piece(color, self[cord0].sign) 58 elif cord1.x < 0 or cord1.x > self.FILES - 1: 59 new_board[cord0] = None 60 else: 61 new_board[cord1] = new_board[cord0] 62 new_board[cord0] = None 63 return new_board 64 65 def as_fen(self, variant): 66 fenstr = [] 67 for r, row in enumerate(reversed(self.data)): 68 empty = 0 69 for i in range(0, 8): 70 piece = row.get(i) 71 if piece is not None: 72 if empty > 0: 73 fenstr.append(str(empty)) 74 empty = 0 75 sign = reprSign[piece.piece] 76 if piece.color == BLACK: 77 sign = sign.lower() 78 else: 79 sign = sign.upper() 80 fenstr.append(sign) 81 else: 82 empty += 1 83 if empty > 0: 84 fenstr.append(str(empty)) 85 if r != 7: 86 fenstr.append("/") 87 88 board = LBoard(variant) 89 board.applyFen("".join(fenstr) + " w") 90 return board.asFen().split()[0] 91 92 def __repr__(self): 93 return self.as_fen() 94