AI 웹 개발 과정/개인 프로젝트

개인 프로젝트 01 : pygame으로 간단한 게임 만들기

만 기 2022. 4. 27. 23:46

개인 프로젝트 : pygame을 이용해서 간단한 게임 만들기

 

4월 25일 부터 2.5일간, 그동안 배운 파이썬 문법을 이용해서 간단한 게임을 만드는 프로젝트를 진행하였다. 처음엔 내 수준을 너무 과대평가하여 팩맨을 만들어보려 했으나, 맵을 그리며 장애물 처리와 맵에 뿌려져있는 팩맨의 먹이를 코딩하다 큰 벽을 느끼고 주제를 바꿨다.. 팩맨에 이미 2.5일중 절반을 넘게 소모했기에 급하게 벌레잡기 게임으로 주제를 바꿔 진행하였다. 

 

 

- 규칙 : 먼저 간단하게 규칙을 정했다. 시간내에 사방으로 움직이는 벌레들을 마우스 클릭으로 제거하며, 제한시간동안 스코어를 쌓는 것이 게임방식이다.

 

- 구현할 기능 : 규칙을 보며 필요한 기능들을 쪼개보았다. 핵심기능들이 다섯가지정도가 되었다. 기능 하나하나 완성된 코드를 보며 어떤 방법을 사용했는지 보자.

 

 

1. 게임 시작시 타임 카운트 

import time   

 

타임 모듈은 임포트 해주어야 사용 가능하다.

start_time = int(time.time())       # time라이브러리 time 사용
time_left = 0 

 

메인 함수에 현재 시간을 받는 변수와 남은시간의 변수를 정의했다.

time_left = 20 - (int(time.time()) - start_time)

# 남은시간 0 되면 게임오버
if time_left <= 0:
    game_over = 1

 

time.time() - start_time 을 하면 타임모듈이 시작되고부터 현재 시간까지 사용 시간을 구할 수 있다고 한다.

20 에서 사용시간을 빼니까 시간이 줄어 0이 되면 game_over에 1을 저장한다.

time_left_img = S_font.render('Time {}'.format(time_left), True, WHITE)
screen.blit(time_left_img, (screen_width - 10 - time_left_img.get_width(), 10))

time_left 에 글씨체를 정해주고 지정한 위치에 디스플레이 한다.

 

 

2. 랜덤으로 생성되는 벌레들

import random 

 

랜덤 모듈도 마찬가지로 임포트가 필요하다.

for b in range(5):                              # range()마리 생성
    bug = pygame.Rect(bug_img.get_rect())     # 이미지에 사각형 범위설정
    bug.left = random.randint(0, screen_width)  # bug rect 의 좌표 설정 # x축
    bug.top = random.randint(0, screen_height)  # y축 # 0~screen_height 사의 값이 임의로 정해진다.

for문을 돌며 벌레들을 랜덤으로 찍어내는 코드이다.  bug_img 에 rect 를 주고 left 와 top 좌표에 랜덤값을 넣는 것이다.

주석에도 나와있다싶이 random.randint(0, screen_width) 는 0 좌표 부터 screen_width(400 넣어둠) 중 랜덤으로 x 좌표값이 결정되는 것이다. y 좌표도 마찬가지이고 랜덤의 (x, y)에 bug_img rect 가 생성 되는 것이다.

 

 

3. 무작위로 움직이는 벌레들

dx = random.randint(-9, 9)                  # 벌레 속도도 -9~9까지 랜덤지정
dy = random.randint(-9, 9)

 

마찬가지로 random.randint() 를 이용하였고 같은 for문에 들어간다. -9에서 9까지의 숫자가 dx와 dy 로 저장되며

for (bug, dx, dy) in bugs:      # dx, dy 를 rect 좌표에 적용
    bug.left += dx
    bug.top += dy

bug의 rect 값에 지속적으로 영향을 준다.

 

 

4. 마우스가 클릭되면 사라지는 벌레

elif event.type == pygame.MOUSEBUTTONDOWN and game_over == 0:   # 마우스클릭 이벤트와 게임상태 보고
    print(event.pos[0], event.pos[1])
    for (bug, dx, dy) in bugs:
        if bug.collidepoint(event.pos):     # collidepoint() 클릭 이벤트 발생하면 .remove
            # print(bug)
            bugs.remove((bug, dx, dy))
            bug = pygame.Rect(bug_img.get_rect())  # 다른 벌레 생성
            bug.left = random.randint(0, screen_width)
            bug.top = random.randint(0, screen_height)
            dx = random.randint(-9, 9)
            dy = random.randint(-9, 9)
            bugs.append((bug, dx, dy))
            score += 1      # 점수 추가

pygame.MOUSEBUTTONDOWN 으로 클릭 이벤트를 받고, .collidepoint( ) 를 이용해 bug rect에 마우스 클릭이되면 if문을 실행하여 해당 bug를 삭제하고 랜덤값을 새로 받아서 새 bug 를 생성하는 코드이다. 마지막줄에 score도 1점 올려준다.

 

이렇게 주요 기능들을 구성하였고 동영상으로 실행 결과를 보자.

 

 

 

이번 프로젝트를 진행하면서

for문과 if문을 많이 사용하게 되어 익숙해질 수 있었다. 또한 pygame, random, time과 같이 아직 써보지 못한 모듈을 사용해보며 새로운 기능들을 많이 알아가는 시간이 되었다.

실패한 팩맨은 아쉽지만 함수와 class 를 좀 더 공부한 후에 도전해보고싶다.!