【问题标题】:KeyError when trying to blit image on to screen from Numpy array in Pygame尝试从 Pygame 中的 Numpy 数组将图像blit到屏幕上时出现KeyError
【发布时间】:2023-03-26 08:23:01
【问题描述】:

我已经完成了我的国际象棋游戏,但现在我正在实现一个 numpy 数组作为棋盘,因此我正在处理的国际象棋 AI 计算速度更快。我知道 KeyError 是什么,但我不明白为什么会在这里发生。 错误:

line 86, in drawPieces
screen.blit(IMAGES[piece], p.Rect(c * SQ_SIZE, r * SQ_SIZE, SQ_SIZE, SQ_SIZE))
KeyError: 9

我的代码:

import numpy
import pygame as p

p.init()
BOARD_WIDTH = 512
BOARD_HEIGHT = 512
DIMENSION = 8  # dimensions of a chess board are 8x8
SQ_SIZE = 512 // DIMENSION
MAX_FPS = 60  # for animations later on
screen = p.display.set_mode((BOARD_WIDTH, BOARD_HEIGHT))
IMAGES = {}

class GameState():
    def __init__(self):
        # board is 8x8 2D List, each element of the list has 2 characters
        # initial character == colour (b,w)
        # second character == piece
        # R == rook, N == knight, B == bishop, Q == Queen, K == king, P == pawn
        # -- == empty space
        board = [
            ["bR", "bN", "bB", "bQ", "bK", "bB", "bN", "bR"],
            ["bp", "bp", "bp", "bp", "bp", "bp", "bp", "bp"],
            ["--", "--", "--", "--", "--", "--", "--", "--"],
            ["--", "--", "--", "--", "--", "--", "--", "--"],
            ["--", "--", "--", "--", "--", "--", "--", "--"],
            ["--", "--", "--", "--", "--", "--", "--", "--"],
            ["wp", "wp", "wp", "wp", "wp", "wp", "wp", "wp"],
            ["wR", "wN", "wB", "wQ", "wK", "wB", "wN", "wR"]
        ]

        lookup = {
            "--": 0,
            "wK": 1, "wQ": 2, "wR": 3, "wB": 4, "wN": 5, "wp": 6,
            "bK": 7, "bQ": 8, "bR": 9, "bB": 10, "bN": 11, "bp": 12
        }
        self.board = numpy.array([[lookup[p] for p in row] for row in board])
        print(self.board)


def main():
    gs = GameState()
    clock = p.time.Clock()
    loadImages()  # only do this once, before the while loop
    running = True

    while running:

        for e in p.event.get():
            if e.type == p.QUIT:
                running = False

        drawGameState(screen, gs.board)

        clock.tick(MAX_FPS)
        p.display.update()

def loadImages():
    pieces = ['wp', 'wR', 'wN', 'wB', 'wK', 'wQ', 'bp', 'bR', 'bN', 'bB', 'bK', 'bQ']
    for piece in pieces:
        IMAGES[piece] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))
# Note we can access an image by saying "IMAGES['wp']'


def drawGameState(screen, board):
    drawBoard(screen)  # draw squares on the board
    drawPieces(screen, board)


def drawBoard(screen):
    global colors
    colors = [p.Color("white"), p.Color("gray")]
    for r in range(DIMENSION):
        for c in range(DIMENSION):
            color = colors[((r + c) % 2)]
            p.draw.rect(screen, color, p.Rect(c * SQ_SIZE, r * SQ_SIZE, SQ_SIZE, SQ_SIZE))


def drawPieces(screen, board):
    for r in range(DIMENSION):
        for c in range(DIMENSION):
            piece = board[r][c]
            if piece != "--":  # not empty square
                screen.blit(IMAGES[piece], p.Rect(c * SQ_SIZE, r * SQ_SIZE, SQ_SIZE, SQ_SIZE))


if __name__ == '__main__':
    main()

此代码仅用于显示我需要测试的所有棋盘和棋子。这是我第一次遇到KeyError,因为我不经常使用字典。我得到了字典需要的所有值。我尝试将文件重命名为他们的字典编号,但没有帮助。我不知道该怎么办。您可以在此处获取图像以自己尝试:https://en.wikipedia.org/wiki/Chess_symbols_in_Unicode 并为他们的对应对象重命名图像。例如白车'wR' 等。如果您需要更多信息或任何信息,请告诉我。我很感激。

【问题讨论】:

  • 你能显示完整的错误跟踪吗?你在哪一行代码中得到错误?

标签: python numpy pygame


【解决方案1】:

board 包含从 0 到 12 的数字,但 IMAGES 字典使用字符串键“--”、“bR”、“bN”。因此,您不能直接使用存储在board 中的数字来处理IMAGES 字典中的图像:

使用lookup 表创建IAMGES 字典:

IMAGES[piece] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))

IMAGES[lookup[piece]] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))

需要的更改:

lookup = {
    "--": 0,
    "wK": 1, "wQ": 2, "wR": 3, "wB": 4, "wN": 5, "wp": 6,
    "bK": 7, "bQ": 8, "bR": 9, "bB": 10, "bN": 11, "bp": 12
}
def loadImages():
    pieces = ['wp', 'wR', 'wN', 'wB', 'wK', 'wQ', 'bp', 'bR', 'bN', 'bB', 'bK', 'bQ']
    for piece in pieces:
        IMAGES[lookup[piece]] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))
def drawPieces(screen, board):
    for r in range(DIMENSION):
        for c in range(DIMENSION):
            piece = board[r][c]
            if piece != 0:  # not empty square
                print(piece)
                screen.blit(IMAGES[piece], p.Rect(c * SQ_SIZE, r * SQ_SIZE, SQ_SIZE, SQ_SIZE))

【讨论】:

  • 谢谢。我有:if piece != '0':
  • @Axhul numpy数组中存储的值是整数
猜你喜欢
  • 2022-11-26
  • 1970-01-01
  • 2018-05-09
  • 2020-06-11
  • 1970-01-01
  • 2021-06-25
  • 2020-06-27
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多