微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将pygame中的图像转换为numpy数组或数字?

如何解决如何将pygame中的图像转换为numpy数组或数字?

我想知道如何将 pygame 中的图像转换为数字。我正在用python制作国际象棋游戏。我已经做好了一切。我首先用字符串制作了棋盘:

[
        ["bR","bN","bB","bQ","bK","bR"],["bp","bp","bp"],["--","--","--"],["wp","wp","wp"],["wR","wN","wB","wQ","wK","wR"]]

我在开始阶段就这样做了。我现在正在研究一种可以快速计算的国际象棋 AI,但是如果棋盘和图像采用数字形式或 numpy 数组;这将有助于图像的计算速度提高 2 到 3 倍。

这是我加载图像的方式:

IMAGES = {}
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']'

我将图像作为字典加载,这样它们就不会占用更多的 cpu,而且更酷。正如您所看到的,图像加载时带有它们的文件名,它是一个字符串。

上面的棋盘也都串起来了。我正在制作的国际象棋游戏的一点是,棋子的任何移动都不需要弦板,它只是棋盘的表示,因此我可以将其显示在屏幕上。所以如果我可以改变这个板,我所要做的就是改变图像的名称以在代码中匹配它们。例如:黑车(现在:'bR')可以更改为 01(黑色),而车可能是 012 或其他。但我一般不知道如何在 NumPy 或 python 中执行此操作。

我希望人们帮助我。我可以提供更多代码或您需要了解的更多见解。就告诉我嘛。我真的很感激。

解决方法

一种简单的方法是将 numpy.uniquereturn_inverse 选项一起使用:

找出数组的唯一元素。

return_inverse bool,可选:如果为 True,还返回唯一数组的索引

示例:

import numpy

board = [
    ["bR","bN","bB","bQ","bK","bR"],["bp","bp","bp"],["--","--","--"],["wp","wp","wp"],["wR","wN","wB","wQ","wK","wR"]
]

values,indices = numpy.unique(board,return_inverse=True)
indices = indices.reshape((8,8))

print(values,'\n')
print(indices)

输出:

['--' 'bB' 'bK' 'bN' 'bQ' 'bR' 'bp' 'wB' 'wK' 'wN' 'wQ' 'wR' 'wp'] 

[[ 5  3  1  4  2  1  3  5]
 [ 6  6  6  6  6  6  6  6]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [12 12 12 12 12 12 12 12]
 [11  9  7 10  8  7  9 11]]

请注意,值按字母顺序排序。因此,无论棋子如何排列在棋盘上,每颗棋子总是得到相同的索引,因为棋盘上至少有一个棋子。


如果你想定义值,你可以使用字典:

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 
}
indices = numpy.array([[lookup[p] for p in row] for row in board])

print(indices)

输出:

[[ 9 11 10  8  7 10 11  9]
 [12 12 12 12 12 12 12 12]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 6  6  6  6  6  6  6  6]
 [ 3  5  4  2  1  4  5  3]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。