如何解决尝试从 Pygame 中的 Numpy 数组将图像 blit 图像到屏幕上时出现 KeyError
我已经完成了我的国际象棋游戏,但现在我正在实现一个 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","bR"],["bp","bp","bp"],["--","--","--"],["wp","wp","wp"],["wR","wN","wB","wQ","wK","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,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],SQ_SIZE))
if __name__ == '__main__':
main()
此代码仅用于显示我需要测试的所有棋盘和棋子。这是我第一次遇到 KeyError
因为我不经常使用字典。我得到了字典需要的所有值。我试过将文件重命名为他们的字典编号,没有帮助。我不知道该怎么办。您可以在此处获取图像以自行尝试:https://en.wikipedia.org/wiki/Chess_symbols_in_Unicode 并为其对应物重命名图像。例如白车为 'wR'
等。如果您需要更多信息或任何信息,请告诉我。我很感激。
解决方法
board
包含从 0 到 12 的数字,但 IMAGES
字典使用字符串键“--”、“bR”、“bN”。因此,您不能直接使用存储在 IMAGES
中的数字来寻址 board
字典中的图像:
使用 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))
所需的更改:
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))
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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。