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()