2011-02-06 3 views
1

다음은 파이썬에서 수행하려고 시도하는 간단한 예제입니다 (파이 게임과 함께 사용하지만 이는 별 도움이되지 않습니다). 더 큰 32 × 32 사진으로,Python 클래스/인스턴스/개체 조직 질문

[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 그리드를 배치 할, 내가 원하는 패턴 :

내가 8 × 8 픽셀 JPG를의 목록을 가지고, 각각의 영어 편지를 묘사 :

gmmg 
gppg 
gppg 
gmmg 

그러나 그 패턴은 애니메이션의 단일 프레임 일뿐입니다. B 년대와 N의 플래시 측 남서 F로 이동하면서 교대로 좌우로 예를 들어, I는 할 수 4 애니메이션 프레임 : 어떤 애니메이션을 만들기 위해 각 프레임에서 각 사각형의 문자 값을 제어 할

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 개의 인스턴스를 넣고 (어떻게 4 개의 프레임이 있는지) 어떻게 든 각 프레임 인스턴스를 만듭니다 16 개의 정사각형 인스턴스 목록을 포함합니다. 아마도 frames[2].squares[5].letter = f처럼 쓸모가있을 것입니다. (너무 퍼지기 때문에 OOP에서 너무 새로 작성되어 원격으로 정확하거나 좋은 아이디어인지 알 수 없습니다.) 그러나 그들이하는 일을 아는 사람이 어떻게이 모든 것을 조직 하는지를 보는 것이 도움이 될 것입니다. 감사합니다.

+1

빠른 팁, 4x4 그리드의 경우 목록 목록을 사용하십시오. 따라서 사각형 대신 [3] [0]을 사용할 수 있습니다 [8]. –

답변

1

프레임 크기가 고정되어 있고 프레임 수가 아니기 때문에 class Frame을 만드는 것이 가장 좋은 방법입니다. 각 Frame에는 grid 구성원이 포함될 수 있으며이 목록은 네 개의 문자 목록 네 개 목록이 될 수 있습니다. 문자열이 불변이기 때문에 4 개의 문자열 목록이 잘 작동하지 않을 것입니다. 단 하나의 16 자 문자열을 사용하면 성능이 향상 될 수 있습니다. 확실하게 프로필을 작성해야합니다. 이 대답을 위해, 나는 당신이 문자 목록의 목록을 가지고 있다고 가정 할 것이다.

그런 다음 프레임 목록 인 frames 구성원이있는 class Animation을 만드십시오. 그러면 다음과 같은 코드를 작성하게됩니다 :

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 [] 

희망이 당신이 시작 가져옵니다.

+0

나는 다음과 같은 프레임 클래스에서 내 시도를 게시했다. 귀하의 의사 코드 또는 무언가를 보는 것이 좋을 지 확신하지 못한다면 귀찮아 질 수 있다면 인터넷 검색보다 훨씬 빨리 학습하는 데 도움이 될 것입니다. – cheeser

0

대체 접근법은 사전, 목록, 집합 등으로 구성된 적절한 일반 데이터 구조를 작성한 다음 해당 데이터를 조작하는 라이브러리 메소드를 작성하는 것입니다. 그것은 매우 클래식 한 OOP로 들리지는 않습니다. 그렇지만 저는 그렇게 쉽게 다루기 쉬우 며 쉽게 얻을 수 있습니다. 데이터 컨테이너를 구축하고 다른 데이터 조작 코드를 정의하는 두 가지 관심사를 분명히 구분할 수 있습니다.

이전 포스터에서 제안한 것처럼 애니메이션을 프레임 목록으로 모델링 할 수 있습니다. 각 프레임은 각각 32 개의 요소가있는 32 개의 목록을 포함하거나 8 개의 요소가있는 8 개의 목록을 포함하며 각 요소는 위에 표시된 4x4 격자를 다시 모델링합니다. 물론, 실제로 미리 각 프레임을 사전 계산 (또는 단순히 정의)했는지 아니면 애니메이션 중에 단일 프레임의 데이터를 조작하는지 여부는 추가 고려 사항에 달려 있습니다.

+0

나는리스트만을 사용했지만 OOP를 배우려고 노력하고 있는데, 나는 물건을 잘 조직하고 인간이 이해할 수있게 만들 수 있는지 알아보기 위해 노력하고있다. 목록은 종종 작동 할 수는 있었지만 생각을하기에는 오랜 시간이 걸렸으며, 물건을 제어하는 ​​능력은 낮은 복잡성으로 제한되었습니다. 내가 잘못했을 지 모르지만, 종종 반복되는 혼란스럽고 myList [3] [5] [8]와 같은 숫자가 사람이 읽을 수있는 것이 아닌 매우 중첩 된 목록으로 끝나기도합니다. – cheeser

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 
+0

'positionGrid'가 필요 없습니다; 그것은 일정하고 필요에 따라 계산 될 수 있습니다. 맞습니까? 그래서 메소드 'def position (row, col) : return (row * 16, col * 16)' –