首页 文章

使用2D数组创建跳棋碎片 - Pygame

提问于
浏览
1

我正在使用库 pygame 在python中制作一个跳棋游戏,我相对较新 . 但是我遇到了程序的问题,其中创建了太多的红色和黑色部分并且它们的布局不正确 .

这些碎片只是用红色或黑色绘制的圆圈 . 为了获得碎片的布局,我在函数 newGameBoard() 中创建了一个2D数组,它放置了碎片的位置,但是当我在函数中迭代游戏板时, drawPieces() 在板的每一侧创建了一个24块的块,而不是片段在游戏板的位置创建 .

这是当前的代码:

import pygame

newGame=True
loggedIn=False
miniGame=False

black=(0,0,0)
white=(255,255,255)
red=(255,0,0)
greyBackground =(203, 206, 203)

# This sets the WIDTH and HEIGHT of each grid location
width=65
height=65
radius=30

margin=0# This sets the margin between each cell

xDistanceFromEdge=220

pygame.init()

gameBoard=[[None]*8]*8

windowSize= [960, 640]
screen = pygame.display.set_mode(windowSize)

pygame.display.set_caption("Draughts Game")

done = False

clock = pygame.time.Clock()



# -------- Main Program Loop -----------
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.MOUSEBUTTONDOWN:

            pos = pygame.mouse.get_pos()

            # Change the x/y screen coordinates to grid coordinates
            column = (pos[0]-xDistanceFromEdge) // (width+margin)
            row = pos[1] // (height+margin)


    screen.fill(greyBackground)

    def boardGui(black,white):
        for boardRow in range(8):
            for boardColumn in range(8):
                xCoordinate=((margin+width) * boardColumn + margin)+xDistanceFromEdge
                yCoordinate=(margin+height) * boardRow + margin
                if boardRow%2==0 and boardColumn%2==0:
                    currentColour = black
                if boardRow%2!=0 and boardColumn%2==0:
                    currentColour = white
                if boardRow%2==0 and boardColumn%2!=0:
                    currentColour = white
                if boardRow%2!=0 and boardColumn%2!=0:
                    currentColour = black
                pygame.draw.rect(screen,currentColour,[xCoordinate,yCoordinate, width, height])

    def piecesGameBoard(gameBoard):
        if newGame==True:
            newGameBoard(gameBoard)

    def newGameBoard(gameBoard):
        for x in range(8):
            for y in range(3):
                if ((x%2!=0) and (y%2==0)) or ((x%2==0) and (y%2!=0)):
                    gameBoard[x][y]="NormalBlack"

            for y in range(5,8):
                if ((x%2==0) and (y%2==0)) or ((x%2!=0) and (y%2!=0)):
                    gameBoard[x][y]="NormalRed"
        print(gameBoard)

        drawPieces(gameBoard,black,red)

    def drawPieces(gameBoard,black,red):
        for x in range(8):
            for y in range(8):
                xCoordinate=((margin+width) * x + margin+32)+xDistanceFromEdge
                yCoordinate=(margin+height) * y + margin+33
                if gameBoard[x][y]=="NormalBlack":
                    pygame.draw.circle(screen,black,(xCoordinate,yCoordinate),radius)

                if gameBoard[x][y]=="kingBlack":
                    pygame.draw.circle(screen,black,(xCoordinate,yCoordinate),radius)
                    #-----put letter k in the middle-----#
                if gameBoard[x][y]=="NormalRed":
                    pygame.draw.circle(screen,red,(xCoordinate,yCoordinate),radius)

                if gameBoard[x][y]=="KingRed":
                    pygame.draw.circle(screen,red,(xCoordinate,yCoordinate),radius)
                    #----put letter k in the middle---#

    boardGui(black,white)
    piecesGameBoard(gameBoard)

    clock.tick(60)

    pygame.display.flip()

pygame.quit()

我试图在 newGameBoard() 函数中创建但确实有效的部分 . 有了这个程序, gameBoard 在每次移动后都会改变,这就是为什么我希望程序以 gameBoard 变量的格式创建碎片 .

1 回答

  • 1

    这是我认为你的代码的一个版本 . 我认为主要的问题是你如何初始化 gameboard 变量:

    gameBoard=[[None]*8]*8
    

    我改为:

    gameBoard=[[None]*8 for _ in range(8)]  # Proper initialization.
    

    因此,它会为每一行创建一个新的 None 值列,而不是在每一行中放置相同的列表 . 这是一个常见的Python新手"gotcha" .

    我还尝试在某种程度上清理,简化和组织代码结构 . 一个值得注意的变化是我将所有这些函数定义移到了主循环之外 - 因为没有理由不止一次这样做,它只会减慢执行速度 .

    还有许多其他的优化可以完成,但是因为你还不适合这里 - 有另一个名为Code Review的网站用于那种事情),我没有实现其中的任何一个......

    import pygame
    
    newGame=True
    loggedIn=False
    miniGame=False
    
    black=(0,0,0)
    white=(255,255,255)
    red=(255,0,0)
    greyBackground=(203, 206, 203)
    
    # This sets the WIDTH and HEIGHT of each grid location
    width=65
    height=65
    radius=30
    
    margin=0# This sets the margin between each cell
    xDistanceFromEdge=220
    #gameBoard=[[None]*8]*8
    gameBoard=[[None]*8 for _ in range(8)]  # Proper initialization.
    windowSize=[960, 640]
    
    pygame.init()
    screen = pygame.display.set_mode(windowSize)
    pygame.display.set_caption("Draughts Game")
    done = False
    clock = pygame.time.Clock()
    
    # Added helper function.
    def square_colour(row, col):
        """ Determine colour of game board square from its position. """
        return white if (row + col) % 2 == 0 else black  # Makes upper-left corner white.
    
    def boardGui(black,white):
        for boardRow in range(8):
            for boardColumn in range(8):
                xCoordinate=((margin+width) * boardColumn + margin)+xDistanceFromEdge
                yCoordinate=(margin+height) * boardRow + margin
                currentColour = square_colour(boardRow, boardColumn)
                pygame.draw.rect(screen,currentColour,[xCoordinate,yCoordinate, width, height])
    
    def piecesGameBoard(gameBoard):
        if newGame:
            newGameBoard(gameBoard)
    
    def newGameBoard(gameBoard):
        gameBoard[:] = [[None]*8 for _ in range(8)]  # Empty the game board.
    
        for x in range(8):
            for y in range(8):
                if square_colour(x, y) == black:
                    if y in range(3):
                        gameBoard[x][y]="NormalBlack"
                    if y in range(5,8):
                        gameBoard[x][y]="NormalRed"
    
        drawPieces(gameBoard,black,red)
    
    def drawPieces(gameBoard,black,red):
        for x in range(8):
            for y in range(8):
                xCoordinate=((margin+width) * x + margin+32)+xDistanceFromEdge
                yCoordinate=(margin+height) * y + margin+33
                if gameBoard[x][y]=="NormalBlack":
                    pygame.draw.circle(screen,black,(xCoordinate,yCoordinate),radius)
                    # Draw a white outline around edge of black pieces so they are visible
                    # when placed on black game board squares.
                    pygame.draw.circle(screen,white,(xCoordinate,yCoordinate),radius, 1)
                if gameBoard[x][y]=="KingBlack":
                    pygame.draw.circle(screen,black,(xCoordinate,yCoordinate),radius)
                    #-----put letter k in the middle-----#
                if gameBoard[x][y]=="NormalRed":
                    pygame.draw.circle(screen,red,(xCoordinate,yCoordinate),radius)
                if gameBoard[x][y]=="KingRed":
                    pygame.draw.circle(screen,red,(xCoordinate,yCoordinate),radius)
                    #----put letter k in the middle---#
    
    # -------- Main Program Loop -----------
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.MOUSEBUTTONDOWN:
    
                pos = pygame.mouse.get_pos()
    
                # Change the x/y screen coordinates to grid coordinates
                column = (pos[0]-xDistanceFromEdge) // (width+margin)
                row = pos[1] // (height+margin)
    
        screen.fill(greyBackground)
        boardGui(black,white)
        piecesGameBoard(gameBoard)
        clock.tick(60)
        pygame.display.flip()
    
    pygame.quit()
    

    棋盘格显示:

    screenshot of checkerboard displayed

相关问题