Python类/实例/对象组织问题

2024-09-28 17:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我在python中尝试做的事情的一个简化示例(使用pygame,但这可能不相关)。在

我有一个8x8像素JPG的列表,每个JPG都描绘了一个英文字母:

[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]

我想以任何图案排列这些图案的4x4网格,作为更大的32x32图片:

gmmg
gppg
gppg
gmmg

但这只是一个单一的动画帧。 例如,我可能需要4个动画帧,其中b和n交替地左右闪烁,而f向西南移动:

^{pr2}$

我想控制每一帧中每个方块的字母值来制作任何动画,所以我猜基本上有64个独立的变量(对于像上面显示的那样的4帧动画)。每个方块还有一个[x,y]列表位置变量和rbg颜色。在

我的问题是如何用类来组织这一切(我正在尝试学习OOP)。从逻辑上讲,似乎每一帧都包含正方形,而每个方块都包含位置、字母和颜色等变量。但我想你甚至可以把它想象成每一个正方形包含4个框架。。。 我的猜测是创建一个frame类,并将它的4个实例放入一个列表中(如果有4个frames),并以某种方式使每个frame实例包含一个由16个正方形实例组成的列表。也许可以像frames[2].squares[5].letter = f(只是一个模糊的想法;我对OOP太陌生了,不知道这是不是一个好主意)。不过,看看一个知道自己在做什么的人会如何组织这一切,这将是很有帮助的。 谢谢!在


Tags: 实例列表frames颜色字母动画事情frame
3条回答

由于帧的大小是固定的,而帧的数目不是固定的,那么生成class Frame似乎是一个不错的首选。每个Frame将包含一个成员grid,该成员可以是由四个字母组成的四个列表组成的列表。一个由四个字符串组成的列表并不能很好地工作,因为字符串是不可变的,尽管只有一个16个字符的字符串可能会更好。你得侧写才能确定。对于这个答案,我假设您使用的是字符列表。在

然后生成一个class Animation,它有一个frames成员,这是一个帧列表。然后编写如下代码:

myAnimation.frames[10].grid[2][3] = 'f'

如果需要,我可以提供更多细节。在

示例:(尚未对此进行测试,但应该很接近。希望doc注释可以与doctest一起使用。)

^{pr2}$

希望这能让你开始。在

另一种方法是想出一个合适的通用数据结构,它完全由字典、列表、集合等组成,然后编写库方法来操作这些数据。这听起来不是很经典的OOP,也不是,但我发现这种方法更容易处理,也更容易“正确”。您可以清楚地将构建数据容器和定义适当的数据操作代码这两个关注点区分开来。在

正如之前的海报所建议的,动画可以被建模为一个帧列表;每个帧要么包含32个元素的32个列表,要么包含8个元素的8个列表,其中每个元素再次模拟上面显示的4x4网格。当然,你是否真的预先计算(或简单地定义)每一帧,或者你是否在动画过程中操纵一个帧的数据取决于进一步的考虑。在

@迈克 (以上回复仅限于600个字符,所以我想我会在这里显示我的回复) 到目前为止,这是我在Frame类上的尝试。我不知道是否应该在另一个类中定义一个类,或者是否或如何将实例列表发送到动画类或其他类。每个方块可以有一个独特的字母、位置和颜色(位置,因为我希望列或行可以进行位置转换)。所以这就是为什么我在里面放了3种类型的网格(不确定这是否是个好主意,或者一个单独的正方形是否也应该有自己的类或其他)。在

class Frame(object):
    def __init__(self, letterGrid, positionGrid, colorGrid):
        self.letterGrid = letterGrid
        self.positionGrid = positionGrid
        self.colorGrid = colorGrid

class Animation(object):
    def __init__(self, frames):
        self.frames = frames

frames = []
frames.append(Frame( [
                    ['b','b','n','f'],
                    ['b','b','n','n'],
                    ['b','b','n','n'],
                    ['b','b','n','n'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['n','n','b','b'],
                    ['n','n','f','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['b','b','n','n'],
                    ['b','b','n','n'],
                    ['b','f','n','n'],
                    ['b','b','n','n'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['n','n','b','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]] ]
                    ))

print "3rd frame's colorGrid:\n", frames[2].colorGrid

相关问题 更多 >