5 minute read

✨final project✨

목차

틀린그림찾기 게임 제작

  • 주제를 선정하게 된 이유
  • Pygame 라이브러리
  • 구체적인 게임 구현 방법
  • 느낀점과 아쉬운 점

### 주제를 선정하게 된 이유

실용적인 측면을 강조한 엑셀 자동화 프로그래밍으로 주제를 결정했지만 친구들의 반응도 중요한 이번 기말 프로젝트에서 발표하기엔 퍼포먼스적인 요소가 부족한 것 같았다. 그래서 시각적인 효과를 보여줄 수 있는 프로그램을 만들면 좋을 것 같았고 그동안 궁금했었던 Pygame 패키지를 이용해 ‘틀린그림찾기’게임을 만들기로 결정하게 되었다.

Pygame 라이브러리


Pygame이란?

Pygame Image Python으로 작성 가능한 게임 등의 멀티미디어 표현을 위한 라이브러리이고 SDL 기반이다.

오픈 소스이자 무료 도구이며, Python을 돌릴 수 있는 플랫폼이라면 어디서든 실행할 수 있다. 게임 개발 도구이지만 이미지 프로세스 또는 조이스틱 입력, 음악 재생 등의 기능만 떼어다 쓸 수도 있다.

출처 Cliclk

공식사이트에서 더욱 많은 정보들을 확인해볼 수 있다. Pygame 공식사이트

틀린 그림 찾기 게임 제작


pygame 라이브러리를 사용해서 게임을 만들고자 코드의 알고리즘을 생각해보았다.

  1. pygame 시작 선언
  2. 게임 윈도우(창) 설정 - 프레임, 컬러, 크기 등등
  3. 게임에서 실행될 오브젝트 설정 및 게임루프에서 실행될 이벤트(함수) 설정
  4. 게임 루프 설정 (게임이 진행되는 동안 실행되는 루프 및 게임종료 설정)

이 구조를 따라서 코드를 작성하였다.

  1. pygame 시작 선언
# pygame 선언
import pygame
import sys

# pygame 초기화(init)
pygame.init()
  1. 게임 윈도우(창) 설정
# pygame 게임창 옵션 설정
size = [1400, 800]
screen = pygame.display.set_mode(size)

title = "game"
pygame.display.set_caption(title)
  1. 게임에서 실행될 오브젝트 설정 및 게임루프에서 실행될 이벤트(함수) 설정
# 게임내 필요한 설정
clock = pygame.time.Clock()
black = (0, 0, 0)
white = (255, 255, 255)
font = pygame.font.Font("fonts/Galmuri11.ttf", 30)
font2 = pygame.font.Font("fonts/Galmuri11.ttf", 50)
pygame.mouse.set_visible(False)
yesImg = pygame.image.load("image/yes.png")
noImg = pygame.image.load("image/no.png")
pygame.transform.scale(yesImg, (90, 130))
pygame.transform.scale(noImg, (90, 130))
mySound = pygame.mixer.Sound("bgm/answer.wav")
wr_sound = pygame.mixer.Sound("bgm/worng.wav")
compl = pygame.mixer.Sound("bgm/clear.wav")
loser = pygame.mixer.Sound("bgm/lose.mp3")
cong = pygame.mixer.Sound("bgm/yeah.mp3")
mySound.set_volume(1.0)
wr_sound.set_volume(1.0)

RGB를 설정해서 색을 설정하고, 폰트설정, 이미지 설정, 소리 설정 등 객체를 지정해서 하였다.

# 코드에서 사용할 이미지 불러오는 클래스( 로드 ,사이즈, 위치) 지정
class Obj:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.sx = 0
        self.sy = 0
        self.img = None

    def put_img(self, address):
        if address[-3] == "png":
            self.img = pygame.image.load(address).convert_alpha()
        else:
            self.img = pygame.image.load(address)

    def change_size(self, sx, sy):
        self.img = pygame.transform.scale(self.img, (sx, sy))
        self.sx, self.sy = self.img.get_size()

    def show(self):
        screen.blit(self.img, (self.x, self.y))

‘틀린그림찾기’ 게임이다보니 이미지를 자주 불러 와야해서 이미지를 불러오는 클래스를 만들었다. 위에서부터 매소드를 설명하자면 이미지를 불러오는 메소드, 사이즈를 설정하는 메소드, 위치를 지정해서 출력하는 매소드이다.

pb2 = Obj()
pb2.put_img("image/pb2.png")
pb2.change_size(1200, 620)
pb2.x = round(size[0] / 2 - pb.sx / 2)
pb2.y = round(size[1] - pb.sy + 40)

pb4 = Obj()
pb4.put_img("image/pb3-removebg-preview.png")
pb4.change_size(1200, 700)
pb4.x = round(size[0] / 2 - pb.sx / 2)
pb4.y = round(size[1] - pb.sy - 5)

클래스를 사용해서 간단하게 이미지를 불러왔다

이 클래스를 만드는 것은 유튜브 영상(초보코딩)을 참고 하였다.

초보코딩 링크

그 외에 전체적인 게임 이벤트가 마우스 클릭으로 발생하기 때문에 마우스 클릭 값을 좌표로 나타내주는 pygame.mouse.get_pos() 함수와 마우스 클릭 이벤트를 받을 수 있는 pygame.MOUSEBUTTONUP 함수를 사용하여 게임 루프를 만들었다.

   for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONUP:
                p = pygame.mouse.get_pos()
                if 314 - 40 <= p[0] <= 314 + 40 and 570 - 40 <= p[1] <= 570 + 40 or 873 - 40 <= p[
                    0] <= 873 + 40 and 570 - 40 <= p[1] <= 570 + 40:
                    mySound.play()
                    cr = Obj()
                    cr.put_img("image/123.png")
                    cr.change_size(80, 80)
                    cr.x = 274
                    cr.y = 530
                    cr.show()

                    cr2 = Obj()
                    cr2.put_img("image/123.png")
                    cr2.change_size(80, 80)
                    cr2.x = 833
                    cr2.y = 530
                    cr2.show()

게임 이벤트 중 마우스를 클릭한 곳의 좌표값이 지정되고 만약 클릭한 곳이 그 좌표가 설정(정답) 범위 안에 있으면 효과음이 출력되는 동시에 동그라미 이미지가 출력되는(클래스) 코드이다.

또한 텍스트를 따로따로 불러 오는 것도 번거로워서 함수를 따로 설정하였다.

def draw_text(font_name, text, size, color, x, y):
    ft = pygame.font.Font(font_name, size)
    text_surface = ft.render(text, True, color)
    text_rect = (x, y)
    screen.blit(text_surface, text_rect)

폰트파일, 출력할 글자, 크기, 색상, 좌표값을 입력하면 한번에 글자가 화면에 출력되는 함수이다.

틀린그림찾기 게임의 전체적인 진행 흐름이 틀린 부분을 찾아서 맞추고 다음 스테이지로 넘어가는 것이 반복 되기 때문에 앞서 설명한 코드들로 하나의 스테이지를 먼저 만들고 그 구조를 그대로 약간 변형 시켜서 다음 스테이지를 만드는 방식으로 진행하였다.

느낀점과 아쉬운점😂


우선 느낀점은 하나의 효과를 나타나게 하는 것도 많은 시간이 노력이 들었던 것에서 프로그래밍이 쉽지 않다는 것을 여실히 느꼈다… 그저 게임을 플레이하는 입장에서는 쉬워보였던 것이 만들 때는 계속 오류가 나고… 원하던 대로 실행이 안됬었다.. 처음에 틀린그림찾기도 다른 게임들보다는 보여지는 이펙트가 덜 해서 쉬울 것이라고 생각했지만.. 쉽지 않았다… 코드가 1000줄이 넘어갔다.. 코드를 짤 때도 그냥 코드를 입력하면 화면에 계속 출력 될 것이라고 생각했지만 1초에 몇 번에 화면에 계속 새로 그리는 원리로 게임화면이 출력 되고 있어서 코드를 짤 때 출력될 순서를 고려해서 짜야하는 부분도 굉장히 어려웠다.. 하지만 직접 프로그램 하나를 만들고 나니 파이썬에 대해서 조금은..이해가 갈 것 같기도 하다.. 아쉬웠던 점은 시간상 코드를 축약을 못했다는 것이다. 마우스 클릭에서 좌표를 받아 정답 처리하는 부분이 전부 다 같은 형식이라 반복되는 부분이 굉장히 많다…체감상 한 300줄이상은 되는 것 같다.. 함수를 만들려고 했지만 괜히 잘못짜서 오류가 발생하면 방대한 범위를 수정하기가 매우 겁났다.. 그래서 코드를 집약적으로 쓰지 못한 점이 매우 아쉬웠다.. 그리고 플레이 할 때 마다 점수를 저장되게 해서 첫 번째 플레이는 몇 점, 두 번째 플레이는 몇 점, 이런 식으로 볼 수 있게 하고 싶었지만..이것 역시 시간상..하지 못한 것이 아쉬웠다.

확실히 게임을 만드는 프로젝트였기 때문에 시각적 효과도 매우 중요하다고 생각했다. 그 어떤 글자라도 허투루 쓸 수 없었고, 뭔가 그냥 맹짜로 쓰기에는 심심했다. 뭔가 더 예!쁘!게! 꾸미고 싶었다. 글씨색을 예쁜걸로 바꾸고 싶었고, 예쁜 그림을 넣고 싶었고, 글자를 깜빡이는 효과도 주고싶었다… 하지만 무얼 원하든, 생각보다 내가 원하는데로 구현해내는게 정말 어려웠다. 글자 깜빡이는효과도 장장 3-4시간은 걸린듯 싶다. 하지만 확실히 노력해서 조금이라도 데코를 하니. 그 효과는 예상보다 더 큰 만족으로 다가왔다. Pygame으로 구현해낼 수 있는 효과는 매우 방대하지만 이번 프로젝트에서 그 재미있고 신박한 효과들을 사용하지 못한점이 아쉬움점으로 남는다… 그리고 게임 클리어 창에서 움직이는 사진(gif)를 간절하게 넣고 싶었지만 pygame에서는 gif를 취급하지 못한다고 한다… 연속된 시간으로 있는 여러 사진을 불러와 for문을 이용하여 gif형태로 나타낼 수는 있었지만, 시간상… 하하 아쉽다.. 다음에는 너구리, 테트리스, 날아오는 물체 피하기 등등 한번 더 pygame에 대해 배워볼 수 있는 시간이 있었으면 좋겠다.

그리고 마지막으로, 정말 이번 프로젝트 우여곡절 힘들었고.. 스트레스도 정말 많이 받았지만 인내심과 프로그래밍 능력을 키울 수 있는 기회를 주신 김태곤 교수님께 감사의 말씀 남긴다..

그리고 이 프로젝트를 진행하면서 들었던 얘기 중 가장 기억에 남는 말이다.

“그걸 언제 하나하나 배우면서 구현하고 있어. 너가 필요한 부분의 코드만 발췌해서 쓰는거지.. 개발자들도 다 아는거 아니야. 다들 필요한 코드 배워서 갔다 쓰는거지”

기말 프로젝트를 다 마치고나니.. 저 말씀이 백번 맞는 말이다… 더 잘할 수 있었는데.. 여운이 남는다.

Leave a comment