python으로 게임 만들기/테트리스

[테트리스] 설계 방향 변경

bay07 2024. 2. 26. 11:07

 

▷ 설계 방향 변경 

일단 여기까지 구현을 하고 생각을 해보니, 전체적인 구조에 대해서 조금 다르게 접근할 필요를 느끼게 되었다. 왜냐하면, 지금은 임의의 블록을 하나 생성하고, 블록의 높이가 470을 넘으면 멈추도록 설정을 했는데. 이렇게 하면 다른 블록과의 상호작용을 고려하기가 어렵다. 또, 블록을 멈춰둔 뒤 새로운 블록을 계속 만들어야하는데, 그러면 테트리스의 특성 상 블록을 적어도 50개는 만들어야 충분하지 않을까 싶다. 그런데 다른 사람들의 코드를 잠깐 살펴보니, 그 방법은 아닌 것 같다. 

 

그래서 이 문제를 어떻게 해결할까 생각을 해보다가, 그래픽을 조금 더 나중에 구현을 하고 일단은 뼈대에 집중하자는 생각을 했다. 전체 맵을 0으로 된 2차원 배열로 담고, 여기에 블록을 1로 표현해서 담아야겠다고 생각했다. 그리고 나중에 화면에 표현을 할 때는 그냥 전체 맵을 다 읽어서, 1로된 부분을 블록으로 표시하도록 만들면 된다.  

 

이런 느낌으로 코드를 만들어서 원하는 기능을 먼저 구현한 뒤에, 나중에 그래픽을 덧붙여야겠다. 

 

 

▷ 전체 맵 배열에 블록 표현해보기 

더보기
import random

block = [
    # 0번 인덱스 ㅁ 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[1,1,0,0],2,2],
       # [[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
        # 모양 바꿀 때, 순환이 되도록 똑같은 코드 더 적어주기 
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[1,1,0,0],2,2],
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[1,1,0,0],2,2],
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[1,1,0,0],2,2]
    
    ],
    # 1번 인덱스 ㄴ 모양 , 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[1,0,0,0],[1,1,1,0],2,3],
        [[0,0,0,0],[1,1,0,0],[1,0,0,0],[1,0,0,0],3,2],
        [[0,0,0,0],[0,0,0,0],[1,1,1,0],[0,0,1,0],2,3],
        [[0,0,0,0],[0,0,1,0],[0,0,1,0],[0,1,1,0],3,2]
        
    ],
    # 2번 인덱스 ㄱ 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[0,0,1,0],[1,1,1,0],2,3],
        [[0,0,0,0],[0,1,1,0],[0,0,1,0],[0,0,1,0],3,2],
        [[0,0,0,0],[0,0,0,0],[1,1,1,0],[1,0,0,0],2,3],
        [[0,0,0,0],[1,0,0,0],[1,0,0,0],[1,1,0,0],3,2]
        
    ],
    # 3번 인덱스 ㅓ 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[0,1,0,0],[1,1,1,0],2,3],
        [[0,0,0,0],[1,0,0,0],[1,1,0,0],[1,0,0,0],3,2],
        [[0,0,0,0],[0,0,0,0],[1,1,1,0],[0,1,0,0],2,3],
        [[0,0,0,0],[0,0,1,0],[0,1,1,0],[0,0,1,0],3,2]
        
    ],
    # 4번 인덱스 z 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[0,1,1,0],2,3],
        [[0,0,0,0],[0,1,0,0],[1,1,0,0],[1,0,0,0],3,2],
        # 모양 바꿀 때, 순환이 되도록 똑같은 코드 더 적어주기 
        [[0,0,0,0],[0,0,0,0],[1,1,0,0],[0,1,1,0],2,3],
        [[0,0,0,0],[0,1,0,0],[1,1,0,0],[1,0,0,0],3,2]       
        
    ],
    # 5번 인덱스 z y축 대칭 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[0,1,1,0],[1,1,0,0],2,3],
        [[0,0,0,0],[0,1,0,0],[0,1,1,0],[0,0,1,0],3,2],
        # 모양 바꿀 때, 순환이 되도록 똑같은 코드 더 적어주기         
        [[0,0,0,0],[0,0,0,0],[0,1,1,0],[1,1,0,0],2,3],
        [[0,0,0,0],[0,1,0,0],[0,1,1,0],[0,0,1,0],3,2]
    ],
    # 6번 인덱스 l 모양, 높이, 너비
    [
        [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1],1,4],
        [[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1],4,1],
        # 모양 바꿀 때, 순환이 되도록 똑같은 코드 더 적어주기 
        [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1],1,4],
        [[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1],4,1],        
    ]
]

# 블록 랜덤넘버 & 위치 초기세팅
# 블록을 랜덤하게 지정하고 싶으니까 숫자 하나 가져오자
#block_random_number = random.randint(0, 6)
block_random_number = 1
block_x_pos = 0
block_y_pos = 3
block_speed = 10 

# 전체 맵 설정
# 안쪽 사각형 
arr = [[0]*9 for _ in range(19)]
# 키보드 ↑ 키로 모양을 바꿔주는 변수. 0 부터 3까지 숫자 가능 
change_shape = 1

for i in range(4):
    for j in range(4):
        block_flag = block[block_random_number][change_shape][i][j]
        arr[block_x_pos+i][block_y_pos+j]  += block_flag
        
for i in range(19):
    for j in range(9):
        print(arr[i][j], end=" ")
    print()

 

 

 

tetris_image.zip
0.00MB