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

时间:2011-02-06 17:34:20

标签: python class object instance pygame

以下是我在python中尝试做的事情的简化示例(使用pygame,但这可能无关紧要)。

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

[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向西南移动:

bbnf nnbb bbnn nnbb
bbnn nnfb bbnn nnbb
bbnn nnbb bfnn nnbb
bbnn nnbb bbnn fnbb

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

我的问题是如何用课程组织这一切(我正在努力学习OOP)。从逻辑上讲,似乎每个框架都包含正方形,每个正方形包含位置,字母和颜色等变量。但我想你甚至可以把它想象成每个方格'包含'4帧...... 我的猜测是制作一个帧类,并将它的4个实例放在一个列表中(如果有4个帧),并以某种方式使每个帧实例包含16个平方实例的列表。可能像frames[2].squares[5].letter = f一样有用(只是一个模糊的想法;我在OOP上太新了,不知道这是远程正确还是好主意)。但是,看看知道自己正在做什么的人如何组织所有这些将会很有帮助。 谢谢!

3 个答案:

答案 0 :(得分:1)

由于帧的大小是固定的,而帧的数量不是,因此class Frame似乎是一个不错的首选。每个Frame都包含一个成员grid,该成员可以是四个四个字母列表的列表。由于字符串是不可变的,因此四个字符串的列表也不会起作用,尽管它具有单个16个字符的字符串可能表现更好。你必须要确定一下。对于这个答案,我假设你要使用一系列字符列表。

然后创建一个class Animation成员frames成员,这是一个框架列表。然后你将编写如下代码:

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

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

示例:(尚未对此进行测试,但应该关闭。文档评论应该可以与doctest一起使用。)

import string

class Frame(object):
    """This is a single frame in an animation."""
    def __init__(self, fill=None, color=None):
        """Initializes the frame.

        >>> f = Frame()
        >>> f.print()
        aaaa
        aaaa
        aaaa
        aaaa
        >>> g = Frame(fill='c', color=(0, 255, 0))
        >>> g.print()
        cccc
        cccc
        cccc
        cccc
        """
        if fill is None:
            fill = 'a' # Or whatever default you want
        self.letterGrid = []
        for row in range(4):
            self.letterGrid.append([fill for col in range(4)])

        if color is None:
            color = (0, 0, 0)
        self.colorGrid = []
        for row in range(4):
            self.letterGrid.append([fill for col in range(4)])

    def set_grid(self, row, col, letter=None, color=None):
        """Sets the letter and/or color at the given grid.

        >>> f.set_grid(1, 1, 'b', (255, 0, 0))
        >>> f.print()
        aaaa
        abaa
        aaaa
        aaaa
        >>> f.set_grid(1, 3, letter='x')
        >>> f.print()
        aaaa
        abax
        aaaa
        aaaa
        >>> f.set_grid(3, 3, color=(255, 0, 0))
        """
        if letter is not None:
            self.letterGrid[row][col] = letter
        if color is not None:
            self.colorGrid[row][col] = color

    def position(row, col):
        return (row * 16, col * 16)

    def print(self):
        """Simple routine to print a frame as text."""
        for row in self.letterGrid:
            print(''.join(row))

class Animation(object):
    def __init__(self, frames=None):
        """Initializes an animation."""
        self.frames = frames or []

希望这能让你开始。

答案 1 :(得分:0)

替代方法是提出一个合适的通用数据结构,仅由字典,列表,集等组成,然后编写库方法来操作该数据。这听起来并不是非常经典的OOP,但事实并非如此,但我发现这种方式更容易处理,更容易“正确”#。你可以清楚地分开构建数据容器的两个问题,另一方面定义合适的数据操作代码。

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

答案 2 :(得分:0)

@Mike (上面回复你只限600个字符所以我想我会在这里回复你) 到目前为止,这是我对Frame类的尝试。我不知道是否应该在另一个类中定义一个类,或者是否或如何将实例列表发送到Animation类或其他东西。每个正方形可以具有唯一的字母,位置和颜色(位置因为我打算使列或行在位置上可移动)。所以这就是为什么我在那里放了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