绘制存储在元组列表中的正方形颜色?

Drawing square colour stored in a list of tuples?

我想画一个棋盘。但是,当我调用 'drawBoard' 函数时,它 returns 出现黑屏。我认为问题可能出在这一行:

colour = con.BOARD_COLOURS[((r+c) % 2)]

我试图使用 0 或 1 索引不同的颜色值,以便在绘制方块时交替使用它们的颜色。谁能解释我哪里出错了。以下是完整代码:

#Defining constants

# RGB colours
BOARD_COLOURS = [(245, 222, 179),(34, 139, 34)]

# Dimensions
ROWS = 8
COLS = 8
DIMS = 600
SQUARE = 600 // 8

class Board:

    def __init__(self):
        pass

    def drawBoard(self, screen):
        for r in range(con.ROWS):
            for c in range(con.ROWS):
                colour = con.BOARD_COLOURS[((r+c) % 2)]
                pg.draw.rect(screen, colour, pg.Rect(c*con.SQUARE, r*con.SQUARE, con.SQUARE, con.SQUARE))

def main():
    t = 60
    clock = pg.time.Clock()
    interface = pg.display.set_mode((con.DIMS, con.DIMS))

    pg.init()
    run = True

    while run:
        clock.tick(t)

        for ev in pg.event.get():
            if ev.type == pg.QUIT:
                run = False

        b = Board()
        b.drawBoard(interface)

    pg.quit()
main()

您需要更新显示。在绘制场景后调用 pygame.display.update() or pygame.display.flip() 更新显示:

def main():
    t = 60
    clock = pg.time.Clock()
    interface = pg.display.set_mode((con.DIMS, con.DIMS))

    pg.init()
    b = Board()

    run = True
    while run:
        clock.tick(t)
        for ev in pg.event.get():
            if ev.type == pg.QUIT:
                run = False

        interface.fill(0)
        b.drawBoard(interface)
        pygame.display.flip()

    pg.quit()
main()

典型的 PyGame 应用程序循环必须:


要拖动对象,您必须实现 MOUSEBUTTONDOWNMOUSEBUTTONUPMOUSEMOTION 事件:

def main():
    t = 60
    clock = pg.time.Clock()
    interface = pg.display.set_mode((DIMS, DIMS))

    pg.init()
    pg.display.set_caption("Checkers Game")

    dragitem = None
    run = True
    b = Board()
    while run:
        clock.tick(t)

        for ev in pg.event.get():
            if ev.type == pg.QUIT:
                run = False

            if ev.type == pg.MOUSEBUTTONDOWN:
                col = ev.pos[0] * COLS // DIMS
                row = ev.pos[1] * ROWS // DIMS
                if b.board[row][col] > 1:
                    dragitem = (row, col, b.board[row][col])
                    b.board[row][col] = (row + col) % 2 == 0
                    dragpos = ev.pos
            if ev.type == pg.MOUSEBUTTONUP:
                new_col = ev.pos[0] * COLS // DIMS
                new_row = ev.pos[1] * ROWS // DIMS
                if b.board[new_row][new_col] < 2:
                    b.board[new_row][new_col] = dragitem[2]
                else:
                    b.board[dragitem[0]][dragitem[1]] = dragitem[2]
                dragpos = None
                dragitem = None
            if ev.type == pg.MOUSEMOTION and dragitem:
                dragpos = ev.pos

        interface.fill(0)
        b.drawBoard(interface)
        b.drawPiece(interface)
        if dragitem:
            pg.draw.circle(interface, PIECE_COLOUR[dragitem[2]-2], dragpos, RADIUS)
        pg.display.flip()

    pg.quit()