why are some of the pieces not being drawn where expected? I've been through my code so many times and I cant find the reason. help would be great

Question:

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.

Asked By: shayafreedman

||

Answers:

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) 
Answered By: Rabbid76
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.