슈코딩

[Python] 벽돌깨기 미니게임 본문

개발일지/Project

[Python] 벽돌깨기 미니게임

Roshu 2022. 4. 26. 21:57

 

1. 기본틀 배워서 가져오기

 

오늘은 파이썬 미니게임 만들기 프로젝트를 진행했다. 어제는 파이썬 문법에 관한 강의를 듣고

이를 바탕으로 프로젝트를 해보는 시간이었다. 나는 벽돌부수기 게임을 가지고 간단하게 만들어보고

기능을 추가해보는 식으로 프로젝트를 진행하기로 계획을 세웠다.

우선은 파이썬으로 게임을 만들기위해 pygame 패키지를 설치해야 한다.

 

 

패키지 설치가 끝나면 import pygame 을해서 라이브러리를 가져온다.

import pygame

YELLOW = (255, 255, 0)
GREY = (150, 150, 150)  # 색의 RGB 지정
BLACK = (0, 0, 0)

pygame.init()  # 초기화 (반드시 필요)

# 화면 크기 설정
background = pygame.display.set_mode((600, 800))
# 화면 타이틀 설정
pygame.display.set_caption("벽돌 부수기 게임")

 

우선은 기본틀을 만들어놓기위해, 구글링과 유튜브 영상을 다 참고해서 맘에드는 틀을 영상으로 배우고 

코드를 가져와서 코드에 전부 주석을 직접 달아보고 어떠한 이유에서 이코드가 쓰이는지에 대해 하나하나 분석해봤다.

그후에 뼈대가 완성되고 나서 몇가지 기능들을 추가 해보기 위해서 검색을 통해 추가해봤다. 

 

기능 1 : 게임시작시 3,2,1 카운트되는 화면, 게임클리어시 클리어화면 실패시 실패화면 

 

기능 2: 공이 벽돌에 부딪혔을때 진행방향에 어느면에 부딪히냐에 따라 x축 바뀌고 위로부딪혔을때 y축 바뀜

기능 3 : 페달에 부딪히는 면에 따라 공이 튕겨져나가는 방향에 영향끼침

기능 4 : 공이 바닥에 충돌시 공의 위치 패들에서 위로나아가게 초기화

           Life를 3으로 설정하고 카운트해서 0이되면 게임종료 ( 3번까지 되고 4번째에 게임종료) 

           Life : 3 텍스트삽입 

기능 5 : 재시작 동작기능 

 

기능 6 : 페달 마우스 조작 및 양 끝 화면 제한 기능

 

 

 

#기능 1

 

게임 시작시 카운트다운 되는 화면이다. 3, 2, 1 카운트다운후에 게임화면이 나오면서 실행이 된다.

게임 클리어 조건 = 블록의 남은갯수 0

 

#기능 2

 

공이 벽돌에 부딪혔을때 진행방향에 어느면에 부딪히냐에 따라 x축 바뀌고 위로부딪혔을때 y축 바뀌는

기능인데.. 이부분부터는 정말 시간이 오래걸렸다.

 

우선은 초반의 코드를 전부 갈아엎어야 했다.

class를 지정하고 함수를 이용해서 코딩을 해야했다.

 

class Block:
    # 블록, 공, 패들 오브젝트
    def __init__(self, col, rect, speed=0):
        self.col = col  # 채우는 색상
        self.rect = rect  # 그리는 직사각형
        self.speed = speed  # 이동속도, 공만사용, 기본값 0
        self.dir = random.randint(-45, 45) + 270  # 공의 발사각도는 270도를 중심으로 +- 45도가 되도록 난수로 정함

    def move(self):  # 공을 움직인다

        self.rect.centerx += math.cos(math.radians(self.dir)) \
                             * self.speed
        self.rect.centery -= math.sin(math.radians(self.dir)) \
                             * self.speed

        # 방향(dir)을 함수 math.radians()를 사용해 라디안으로 변환하고
        # 그값을 cos/sin에 넘겨서 x축방향과 y축 방향의 성분을 구하며 마지막으로 speed를 곱해서 실제의 이동량을 구한다.
        # pc 화면에서는 y축은 아래방향이 양수이므로, centery 에 값을 더할때 거꾸로 맞추는것에 주의한다.

    def draw(self):  # 블록, 공, 패들을 그림
        if self.speed == 0:
            pygame.draw.rect(SURFACE, self.col, self.rect)  # 블록,패들
        else:
            pygame.draw.ellipse(SURFACE, self.col, self.rect)  # 공

그리고 삼각함수가 등장하는데.. 정말 당황스러웠다. 

어째서 공하나 튀기는게임이 이렇게 복잡한건가.. 머릿속도 복잡해지기 시작한 부분이다.

가장 처음한건 우선 코드를 가져와서 옆창에 띄워놓고 기존의 틀에서 가져올부분은 가져와서 추가 해보고 

오류나면 수정하려고 구글링하면서 열심히 수정하고의 무한 반복이었다.

 

 

#기능 3

 

페달에 공이 부딪히는 면에 따라 공이 튕겨져나가는 방향에 영향끼치게 하는 기능이다.

이기능도 많은 수정이 필요했다. 

 

기존

수정

사진 속 코드부분을 연결시키기 위해 함수부터, 전역변수, 패들의 명칭, 블록의 명칭 모든걸 수정해주었고

당연히 한번에 잘되지도 않았었다. 그래도 끈질기게 달라붙어서 수정하고 또 수정하다 보니 하나 둘씩 생각했던 대로

작동하는 재미가 쏠쏠했다.

 

#기능 4

 

공이 바닥에 닿을시 공의 위치 패들로 초기화 및 위 방향으로 진행하게 하고 Life 카운트 줄어드는 기능

 

이 기능은 어떠한 자료에도 없어서 개인적으로 코드자료없이 만든 부분인데 그래서 더 애를 먹었었다.

우선 life가 카운트 되는것까지는 잘됐었는데, 공이 다시 위로 생성되질않아서 어떠한 방법을 찾아봐도 시간만

계속 흘르고 해결이 되질않았다. 그래서 튜터님께 가서 조언을 듣고 조언한방에 바로 해결이 되었던 기능이다.

 

#기능 5

 

재시작 r키 기능

게임이 클리어 되거나, 게임 오버 됐을때 종료되지않고, r키를 눌러서 재시작 할 수 있는 기능이다.

 

#기능 6

 

페달 마우스 조작 및 화면 양끝 제한 기능

이 기능도 정말 애를 많이 먹은부분중 하나인데, 기존의 키보드조작에서 마우스조작으로 바꾸기 위해서 단순히 복붙이아닌, 명칭에 대한 수정을 정말 많이 해야했었다. 명칭마다 변수를 다 설정하고, 변경하고 오류도 수십번 나던 끝에

완성이 되었을때의 쾌감은 정말 잊을 수가 없었다. 

 

 

2. 느낀점

이렇게 원하는 기능들을 찾아서 적용 해보면서 느낀점은..

기본문법만 배운걸로는 절대 구현 할 수 없겠다는 점이다.
코드에 이해가 안가는 부분들도 정말 많았고 하나하나 다 검색을해서 어떤 문법인지 찾아봐도 
겨우 이해할까 말까한게 대다수였다.

 

그래서 아직 구현 못한 기능들을 더 구현을 시키고, 완성돼었을때 작성한 코드안에 이해 못하는 부분들을

전부다 정리를 해서 따로 공부를 해야겠다고 느꼈다. 아직은 영상이나 코드자료들이 없으면 이렇게 간단한 게임도

못만드니 정말 갈길이 멀겠구나 느껴지면서도, 코드를 합치는 과정에서 처음에 안됐던 것들이 이렇게 해보고 저렇게 해보고 바꿔가면서 계속 수정하다가 딱 되는 그 순간에 진짜 코딩이 재밌구나 라는걸 느꼈다. 

이것이 코딩인가?

 

3. 구현한 게임 영상주소 

https://www.youtube.com/watch?v=5EK37Iz7Ubk&ab_channel=%EB%A1%9C%EC%8A%88

 

Comments