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

[테트리스] 기본 블록 만들어보기

bay07 2024. 2. 23. 12:13

대략 노트에 한번 그림으로 그려보았다. 블록 모양은 7개인데, 회전해서 바뀌는 것까지 모두 고려했다. 색칠된 부분은 1, 아닌 부분은 0으로 입력할 예정이다. 아래와 같은 느낌으로 블록을 하나하나 입력해보았다. 

block = [
    # 1번 인덱스 ㄴ 모양
    [
        [[0,0,0],[1,0,0],[1,1,1]],
        [[1,1,0],[1,0,0],[1,0,0]],
        [[1,1,1],[0,0,1],[0,0,0]],
        [[0,0,1],[0,0,1],[0,1,1]]
    ]
]
더보기
block = [
    # 0번 인덱스 ㅁ 모양
    [
        [[1,1,0],[1,1,0],[0,0,0]]
    
    ],
    # 1번 인덱스 ㄴ 모양
    [
        [[0,0,0],[1,0,0],[1,1,1]],
        [[1,1,0],[1,0,0],[1,0,0]],
        [[1,1,1],[0,0,1],[0,0,0]],
        [[0,0,1],[0,0,1],[0,1,1]]
        
    ],
    # 2번 인덱스 ㄱ 모양
    [
        [[0,0,0],[0,0,1],[1,1,1]],
        [[0,1,1],[0,0,1],[0,0,1]],
        [[1,1,1],[1,0,0],[0,0,0]],
        [[1,0,0],[1,0,0],[1,1,0]]
        
    ],
    # 3번 인덱스 ㅓ 모양
    [
        [[0,0,0],[0,1,0],[1,1,1]],
        [[1,0,0],[1,1,0],[1,0,0]],
        [[1,1,1],[0,1,0],[0,0,0]],
        [[0,0,1],[0,1,1],[0,0,1]]
        
    ],
    # 4번 인덱스 z 모양
    [
        [[0,0,0],[1,1,0],[0,1,1]],
        [[0,1,0],[1,1,0],[1,0,0]]
    ],
    # 5번 인덱스 z y축 대칭 모양
    [
        [[0,0,0],[0,1,1],[1,1,0]],
        [[0,1,0],[0,1,1],[0,0,1]]
    ],
    # 6번 인덱스 l 모양
    [
        [[1,1,1],[0,0,0],[0,0,0]],
        [[0,0,1],[0,0,1],[0,0,1]]
    ]
]

 

한번 그려보자 

# 블록 한번 그려보기 
for k in range(1,2):
    for i in range(3):
        for j in range(3):
            block_flag = block[k][0][i][j]
            box = pygame.Rect(150+25*i,150+25*j, 20*block_flag, 20*block_flag)
            pygame.draw.rect(background,purple,box,10)
더보기
import sys
import pygame
from pygame.locals import *

# 초기화 & 기능 사용 시작을 알림 
pygame.init()

## 초당 프레임 단위 설정 ##
FPS = 30
FramePerSec = pygame.time.Clock()

# 전체 스크린의 가로, 세로 설정
screen_width = 520
screen_height = 600

# 컬러셋팅
white = (255,255,255)
black = (0,0,0)
organe = (255,204,153)
green = (204,255,229)
blue = (204,229,255)
pink = (255,204,229)
purple = (204,204,255)

# 스크린 생성하기 
background = pygame.display.set_mode((screen_width, screen_height))
background.fill(blue)
print(background)

def background_set():
    # 맨 밑에 바닥깔기
    for i in range(11):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(60 + 25*i,530,20,20)
        pygame.draw.rect(background,pink,box,10)
        
    # 왼쪽벽 만들어보쟈 
    for j in range(18):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(60,530-25*j,20,20)
        pygame.draw.rect(background,pink,box,10)   
        
    # 오른쪽벽 만들어보쟈 
    for j in range(18):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(310,530-25*j,20,20)
        pygame.draw.rect(background,pink,box,10)   
    
block = [
    # 0번 인덱스 ㅁ 모양
    [
        [[1,1,0],[1,1,0],[0,0,0]]
    
    ],
    # 1번 인덱스 ㄴ 모양
    [
        [[0,0,0],[1,0,0],[1,1,1]],
        [[1,1,0],[1,0,0],[1,0,0]],
        [[1,1,1],[0,0,1],[0,0,0]],
        [[0,0,1],[0,0,1],[0,1,1]]
        
    ],
    # 2번 인덱스 ㄱ 모양
    [
        [[0,0,0],[0,0,1],[1,1,1]],
        [[0,1,1],[0,0,1],[0,0,1]],
        [[1,1,1],[1,0,0],[0,0,0]],
        [[1,0,0],[1,0,0],[1,1,0]]
        
    ],
    # 3번 인덱스 ㅓ 모양
    [
        [[0,0,0],[0,1,0],[1,1,1]],
        [[1,0,0],[1,1,0],[1,0,0]],
        [[1,1,1],[0,1,0],[0,0,0]],
        [[0,0,1],[0,1,1],[0,0,1]]
        
    ],
    # 4번 인덱스 z 모양
    [
        [[0,0,0],[1,1,0],[0,1,1]],
        [[0,1,0],[1,1,0],[1,0,0]]
    ],
    # 5번 인덱스 z y축 대칭 모양
    [
        [[0,0,0],[0,1,1],[1,1,0]],
        [[0,1,0],[0,1,1],[0,0,1]]
    ],
    # 6번 인덱스 l 모양
    [
        [[1,1,1],[0,0,0],[0,0,0]],
        [[0,0,1],[0,0,1],[0,0,1]]
    ]
]

# 블록 한번 그려보기 
for k in range(1,2):
    for i in range(3):
        for j in range(3):
            block_flag = block[k][0][i][j]
            box = pygame.Rect(150+25*i,150+25*j, 20*block_flag, 20*block_flag)
            pygame.draw.rect(background,purple,box,10)   

# 게임창 이름 설정
pygame.display.set_caption("PYGAME Example") 
background_set()

# 아하 ! 연습할 때, 게임을 종료시키는 함수가 있어야 실행이 된다. 
# 아래 코드 계속 적어줘야함. 
# 게임을 종료시키는 함수
while True:
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    FramePerSec.tick(FPS)

 

 

 

블럭이 이렇게 잘 표현되는 걸 알 수 있다. 

이제 내려오는 기능과 회전하는 기능을 추가하면 된다. 

 

 

* 친구 피드백

블록 중에서 ㅁㅁㅁ 이 블록이 왜 3개 밖에 없는지 물어보았다. 

아차, 깜빡하고 3개로 만들어버렸네...

블록을 3*3에서 4*4로 바꿔야겠다. 

 

▷ 바꾼 코드

더보기
import sys
import pygame
from pygame.locals import *

# 초기화 & 기능 사용 시작을 알림 
pygame.init()

## 초당 프레임 단위 설정 ##
FPS = 30
FramePerSec = pygame.time.Clock()

# 전체 스크린의 가로, 세로 설정
screen_width = 520
screen_height = 600

# 컬러셋팅
white = (255,255,255)
black = (0,0,0)
organe = (255,204,153)
green = (204,255,229)
blue = (204,229,255)
pink = (255,204,229)
purple = (204,204,255)

# 스크린 생성하기 
background = pygame.display.set_mode((screen_width, screen_height))
background.fill(blue)
print(background)

def background_set():
    # 맨 밑에 바닥깔기
    for i in range(11):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(60 + 25*i,530,20,20)
        pygame.draw.rect(background,pink,box,10)
        
    # 왼쪽벽 만들어보쟈 
    for j in range(18):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(60,530-25*j,20,20)
        pygame.draw.rect(background,pink,box,10)   
        
    # 오른쪽벽 만들어보쟈 
    for j in range(18):
    # (100,50) 는 스크린에서의 위치
        box = pygame.Rect(310,530-25*j,20,20)
        pygame.draw.rect(background,pink,box,10)   
    
block = [
    # 0번 인덱스 ㅁ 모양
    [
        [[1,1,0,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]]
    
    ],
    # 1번 인덱스 ㄴ 모양
    [
        [[0,0,0,0],[1,0,0,0],[1,1,1,0],[0,0,0,0]],
        [[1,1,0,0],[1,0,0,0],[1,0,0,0],[0,0,0,0]],
        [[1,1,1,0],[0,0,1,0],[0,0,0,0],[0,0,0,0]],
        [[0,0,1,0],[0,0,1,0],[0,1,1,0],[0,0,0,0]]
        
    ],
    # 2번 인덱스 ㄱ 모양
    [
        [[0,0,0,0],[0,0,1,0],[1,1,1,0],[0,0,0,0]],
        [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]],
        [[1,1,1,0],[1,0,0,0],[0,0,0,0],[0,0,0,0]],
        [[1,0,0,0],[1,0,0,0],[1,1,0,0],[0,0,0,0]]
        
    ],
    # 3번 인덱스 ㅓ 모양
    [
        [[0,0,0,0],[0,1,0,0],[1,1,1,0],[0,0,0,0]],
        [[1,0,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]],
        [[1,1,1,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]],
        [[0,0,1,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]]
        
    ],
    # 4번 인덱스 z 모양
    [
        [[0,0,0,0],[1,1,0,0],[0,1,1,0],[0,0,0,0]],
        [[0,1,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]]
    ],
    # 5번 인덱스 z y축 대칭 모양
    [
        [[0,0,0,0],[0,1,1,0],[1,1,0,0],[0,0,0,0]],
        [[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]]
    ],
    # 6번 인덱스 l 모양
    [
        [[1,1,1,1],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
        [[0,0,1,0],[0,0,1,0],[0,0,1,0],[0,0,1,0]]
    ]
]

# 블록 한번 그려보기 
for k in range(1,2):
    for i in range(4):
        for j in range(4):
            block_flag = block[k][0][i][j]
            box = pygame.Rect(150+25*i,150+25*j, 20*block_flag, 20*block_flag)
            pygame.draw.rect(background,purple,box,10)   

# 게임창 이름 설정
pygame.display.set_caption("PYGAME Example") 
background_set()

# 아하 ! 연습할 때, 게임을 종료시키는 함수가 있어야 실행이 된다. 
# 아래 코드 계속 적어줘야함. 
# 게임을 종료시키는 함수
while True:
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    FramePerSec.tick(FPS)