Tiny Bunny
본문 바로가기
Python

Python - pygame

by 내이름효주 2024. 4. 29.
import pygame
import random
import time
  • pygame 설치, 게임에 쓰일 random, time 모듈 설치
# 1. 초기화 -> 변수 선언
pygame.init()

# 2. 게임 화면 설정 -> 크기 고정
size = [400, 900]
screen = pygame.display.set_mode(size)
title = "pygame_exam"
pygame.display.set_caption(title)

# 3. 게임 화면 내에서 설정 -> 변수
clock = pygame.time.Clock()
black = (0,0,0)
grey = (131, 131, 131)

class Object: # 게임 객체가 늘어날 때 마다 해당 클래스 이용
    def __init__(self):
        self.x = 0
        self.y = 0
        self.distance = 0

    def add_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, width, height):
        self.img = pygame.transform.scale(self.img, (width, height))
        self.width, self.height = self.img.get_size()

    def show(self): # 화면 안에 이미지 복사해서 넣기
        screen.blit(self.img, (self.x, self.y))

def crash(a, b):
    if (a.x - b.width <= b.x) and (b.x <= a.x + a.width):
        if (a.y - b.height <= b.y) and (b.y <= a.y + a.height):
            return True
        else:
            return False
    else:
        return False

player = Object()
player.add_img("/player.png")
player.change_size(50, 50)
player.x = round(size[0] / 2) - round(player.width / 2)
player.y = size[1] - player.height - 30
player.distance = 8 # 숫자가 높아질수록 빠르게 움직임

left_move = False # 처음은 안눌렸다고 가정
right_move = False
space_move = False

k = 0
score = 0
miss = 0

missile_list = []
enemy_list = []
  • Clock() - FPS(초당 프레임) 설정
  • image.load - 이미지 로딩 후 저장
  • transform.scale() - 이미지 크기 조정
  • get_size() - 이미지 폭, 높이 반환
  • blit( img, (x, y) ) - 이미지를 SCREEN 객체로 저장
  • distance = x - 이미지의 상하좌우 이동 거리 설정
# 4. 메인 이벤트
system_exit = 0
while system_exit == 0:
#     print("score : {}".format(score))
#     print("miss : {}".format(miss))
    #  4-1) FPS 설정
    clock.tick(60)

    #  4-2) 입력(키보드, 마우스) 감지
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            system_exit = 1

        if event.type == pygame.KEYDOWN: # 키가 눌렸을 때
            if event.key == pygame.K_LEFT:
                left_move = True
            if event.key == pygame.K_RIGHT:
                right_move = True
            if event.key == pygame.K_SPACE:
                space_move = True
                k = 0

        elif event.type == pygame.KEYUP: # 키가 떼졌을 때
            if event.key == pygame.K_LEFT:
                left_move = False
            if event.key == pygame.K_RIGHT:
                right_move = False
            if event.key == pygame.K_SPACE:
                space_move = False

    #  4-3) 입력, 시간에 따른 변화
    if left_move == True: # 왼쪽누르면 x축 -
        player.x -= player.distance
        if player.x <= 0:
            player.x = 0

    elif right_move == True: # 오른쪽누르면 x축 +
        player.x += player.distance
        if player.x >= size[0] - player.width: # x좌표를 제한하여 화면 안에 가둠(못벗어나게)
            player.x = size[0] - player.width

    if space_move == True and k % 6 == 0:
        missile = Object()
        missile.add_img("/rocket.png")
        missile.change_size(25, 25)
        missile.x = player.x + round(player.width / 2 - missile.width / 2)
        missile.y = player.y - missile.height - 10
        missile.distance = 15
        missile_list.append(missile)

    k += 1

    delete_list = []
    for i in range(len(missile_list)):
        m = missile_list[i]
        m.y -= m.distance
        if m.y <= -m.height:
            delete_list.append(m)

    try:
        delete_list.reverse()
        for d in delete_list:
            del missile_list[d]
    except:
        pass

    if random.random() > 0.96:
        enemy = Object()
        enemy.add_img("/apple.png")
        enemy.change_size(30, 30)
        enemy.x = random.randrange(0, size[0] - enemy.width - round(player.width / 2))
        enemy.y = 20
        enemy.distance = 5
        enemy_list.append(enemy)

    for i in range(len(enemy_list)):
        e = enemy_list[i]
        e.y += e.distance
        if e.y >= size[1]:
            delete_list.append(i)

    try:
        delete_list.reverse()
        for d in delete_list:
            del enemy_list[d]
            miss += 1
    except:
        pass

    delete_missile_list = []
    delete_enemy_list = []
    for i in range(len(missile_list)):
        for j in range(len(enemy_list)):
            m = missile_list[i]
            e = enemy_list[j]
            if crash(m, e) == True:
                delete_missile_list.append(i)
                delete_enemy_list.append(j)

    delete_missile_list = list(set(delete_missile_list))
    delete_enemy_list = list(set(delete_enemy_list))

    try:
        delete_missile_list.reverse()
        delete_enemy_list.reverse()
        for dm in delete_missile_list:
            del missile_list[dm]
        for de in delete_enemy_list:
            del enemy_list[de]
            score += 1
    except:
        pass

    for i in range(len(enemy_list)):
        e = enemy_list[i]
        if crash(e, player) == True:
            system_exit = 1
            time.sleep(1)

    #  4-4) 전사작업(그리기)
    screen.fill(black)
    player.show()
    for m in missile_list:
        m.show()

    for e in enemy_list:
        e.show()

    font = pygame.font.Font("C:/Windows/Fonts/PERTILI.TTF", 20)

    text_score = font.render('score : {}'.format(score), True, (255,255,255)) # 얻은 점수
    screen.blit(text_score, (10, 10))

    text_miss = font.render('miss : {}'.format(miss), True, (255,255,255)) # 잃은 점수
    screen.blit(text_miss, (size[0] - 80, 10))

    #  4-5) 업데이트
    pygame.display.flip()

# 5. 종료
pygame.quit()​

'Python' 카테고리의 다른 글

python - MQTT  (0) 2024.08.20
Django Channels & Web socket  (0) 2024.08.16
알고리즘 - python  (0) 2024.08.08