I try to create an object for all the pieces in the game and the assign coordinates for each piece on the board. when I try to run the code, all of the pieces of the same type are drawn in the same place.
here's my code for each piece and assigning its starting position on the board:
#piece sprites
Pieces = pg.sprite.Group()
WKing = piece("W", "King")
WQueen = piece("W", "Queen")
BKing = piece("B", "King")
BQueen = piece("B", "Queen")
Pieces.add(WKing, WQueen, BKing, BQueen)
for j in range(2):
WBishop = piece("W", "Bishop")
WKnight = piece("W", "Knight")
WRook = piece("W", "Rook")
BBishop = piece("B", "Bishop")
BKnight = piece("B", "Knight")
BRook = piece("B", "Rook")
Pieces.add(WBishop, WKnight, WRook, BBishop, BKnight, BRook)
for i in range(8):
WPawn = piece("W", "Pawn")
BPawn = piece("B", "Pawn")
Pieces.add(WPawn, BPawn)
#set starting position of all pieces
A, B, C, D, E, F, G, H = 0, 1, 2, 3, 4, 5, 6, 7
for p in Pieces:
side = p.get_side()
#Bishops
if p.get_name() == "Bishop":
for Bi in range(1, 3):
if side == "W":
sx, sy = p.set_position(((Bi*3)-1), 1)
position = sx, sy
elif side == "B":
sx, sy = p.set_position(((Bi*3)-1), 8)
position = sx, sy
#Knights
elif p.get_name() == "Knight":
for Kn in range(1, 3):
if side == "W":
sx, sy = p.set_position((((Kn*5)-3)-1), 1)
position = sx, sy
elif side == "B":
sx, sy = p.set_position((((Kn*5)-3)-1), 8)
position = sx, sy
#Rooks
elif p.get_name() == "Rook":
for Ro in range(1, 3):
if side == "W":
sx, sy = p.set_position((((Ro*7)-6)-1), 1)
position = sx, sy
elif side == "B":
sx, sy = p.set_position((((Ro*7)-6)-1), 8)
position = sx, sy
#Pawns
elif p.get_name() == "Pawn":
for Pa in range(1, 8, 1):
if side == "W":
sx, sy = p.set_position(Pa, 2)
position = sx, sy
elif side == "B":
sx, sy = p.set_position(Pa, 7)
position = sx, sy
#Kings
elif p.get_name() == "King":
if side == "W":
sx, sy = p.set_position(E, 1)
position = sx, sy
elif side == "B":
sx, sy = p.set_position(E, 8)
position = sx, sy
#Queens
elif p.get_name() == "Queen":
if side == "W":
sx, sy = p.set_position(D, 1)
position = sx, sy
elif side == "B":
sx, sy = p.set_position(D, 8)
position = sx, sy
here is the piece class and its relevant functions:
class piece(pg.sprite.Sprite):
def __init__(self, side, piece_name):
super().__init__()
self.side = side
self.name = piece_name
icon = "images/" + self.side + "/" + self.name + ".png"
self.image = pg.image.load(icon)
def set_position(self, x, y):
tile_size = 40
ex, ey = (tile_size*(x))+8, (tile_size*((9-y)-1))+8
self.rect = self.image.get_rect(topleft = (ex, ey))
return (ex, ey)
def get_name(self):
return self.name
def get_side(self):
return self.side
I've looked through and can't find what's wrong
as I mentioned before, I tried to draw each object in it's starting position on the board.
instead, every piece of the same type is drawn in the same place.
You change the position of the same pice 3 times and do the same for all pices of one type. I suggest to add the number of the piece to the object and calculate the position based on this number:
for i in range(8):
WPawn = piece("W", "Pawn", i)
BPawn = piece("B", "Pawn", i)
Pieces.add(WPawn, BPawn)
for p in Pieces:
side = p.get_side()
# [...]
if p.get_name() == "Pawn":
if side == "W":
sx, sy = p.set_position(p.number, 2)
position = sx, sy
elif side == "B":
sx, sy = p.set_position(p.number, 7)
position = sx, sy
class piece(pg.sprite.Sprite):
def __init__(self, side, piece_name, number):
super().__init__()
self.side = side
self.name = piece_name
self.number = number
icon = "images/" + self.side + "/" + self.name + ".png"
self.image = pg.image.load(icon)