20260113
#임포트 받기
import pygame, sys
from pygame.locals import *
import random, time
'''
프로젝트 설명서 [ 포트폴리오 ]
I. 게임 방법
1)우주선을 ->,<-, 위쪽 화살표키를 활용해 움직임니다.
2)위쪽 하늘에서 우주선이 날아오면 스페이스바를 눌러 공격 할 수 있습니다.
3)스코어가 0이 되면 게임이 끝남니다. 제한시간은 1분 30초 이고 그 안에 점수
50을 넘으면 클리어 입니다.
II. 사용 문법
while -> 게임진행
pressedkeys -> 키를 눌렀을때(공격이나 특수 능력 사용시)
class -> 악당이나 플레이어 등을 정의하고 기능을 구현 할때
- 이외에도 있지만 대표적인 것만 작성하고 나머지는 생략하였습니다 -
III.추가 계획
start page, end page,
특수 능력(필살기 등..) 추가 및 버그 수정을 진행 할 계획 입니다.
이외에도 새로운 기능을 기획, 생각 중입니다.
'''
#필요한 색 정의
red = (255, 0, 0)
orange = (255, 153, 51)
yellow = (255, 255, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
white = (255, 255, 255)
black = (0, 0, 0)
#타이머 1분 설정
pygame.init()
fps = 60
FramePerSec = pygame.time.Clock()
#폰트 정의
myfont = pygame.font.SysFont('@Times New Roman', 20)
WIDTH = 700
HEIGHT = 625
#배경 이름 및 배경 색 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("SPACE WAR_0")
background = pygame.image.load('location.png')
screen.fill(blue)
#변수
ren = random.randint(1, 2)
sp2=3
score=3
sp=5
change=0
spee=4
elapsed_time = pygame.time.get_ticks() / 1000
def game_intro() :
intro=True
while intro :
pressedKeys = pygame.key.get_pressed()
for event in pygame.event.get() :
if event.type == pygame.QUIT :
pygame.quit()
quit()
screen.blit(background, (0, 0))
pen = myfont.render("How to play",True,red)
pen1 = myfont.render("Use <-, -> to move",True,orange)
pen2 = myfont.render("press Spacebar yo attack enemies",True,orange)
pen3 = myfont.render("Press 's' to start and press 'k' to stop",True,orange)
pen4 = myfont.render("Made and designed by JunwooRhee( TMcoding Academy's Student ) ",True,orange)
screen.blit(pen, [10, 10])
screen.blit(pen1, [10, 40])
screen.blit(pen2, [10, 70])
screen.blit(pen3, [10, 100])
screen.blit(pen4, [10, 600])
pygame.display.update()
if pressedKeys[K_s] :
Game()
#클래스 모음
#1. 플레이어 우주선 클래스
class SpaceShip(pygame.sprite.Sprite) :
def __init__(self):
super().__init__()
self.image = pygame.image.load('spaceship.png')
self.rect = self.image.get_rect()
self.rect.center = (WIDTH//2, HEIGHT-self.rect.height//2-10)
self.sp = spee
def move(self):
global change
prssdKeys = pygame.key.get_pressed()
if self.rect.left > 30:
if prssdKeys[K_LEFT]:
self.rect.move_ip(-1 * self.sp, 0)
position_P = self.rect.center
return position_P
if self.rect.right < WIDTH-30:
if prssdKeys[K_RIGHT]:
self.rect.move_ip(self.sp, 0)
position_p = self.rect.center
return position_p
if self.rect.top > 400:
if prssdKeys[K_UP] :
self.rect.move_ip(0, -1 * self.sp)
position_p = self.rect.center
return position_p
if self.rect.bottom < 615:
if prssdKeys[K_DOWN] :
self.rect.move_ip(0, self.sp)
position_p = self.rect.center
return position_p
if pygame.time.get_ticks() / 1000 >= 30 :
print("ready to change!")
if prssdKeys[K_e]:
self.image = pygame.image.load('jet (1).png')
change=1
self.rect.size = (64, 64)
self.rect.move_ip(0, -3)
self.sp=3
#2. 적 우주선 클래스
class Enemy(pygame.sprite.Sprite) :
def __init__(self, sp2):
super().__init__()
self.image = pygame.image.load('spaceship (2).png')
self.rect = self.image.get_rect()
self.rect = self.rect.inflate(-20, -20)##
self.rect.center = (random.randint(40, 600), 0)
self.speed = sp2
def init_position(self):
self.rect.top = 0
self.rect.center = (random.randint(30, 610), 0)
def move(self):
global score
self.rect.move_ip(0, self.speed)
if (self.rect.bottom > 615):
self.init_position()
score -=2
return self.rect.center
#3. 적 우주선 클래스 2
class Enemy2(pygame.sprite.Sprite) :
def __init__(self, sp2):
super().__init__()
self.image = pygame.image.load('spaceship (3).png')
self.rect = self.image.get_rect()
self.rect = self.rect.inflate(-20, -20)##
self.rect.center = (random.randint(40, 600), 0)
self.speed = sp2
def init_position(self):
self.rect.top = 0
self.rect.center = (random.randint(30, 610), 0)
def move(self):
global score
self.rect.move_ip(0, self.speed)
if (self.rect.bottom > 615):
self.init_position()
score -=2
return self.rect.center
#4. 플레이어 우주선에서 발포되는 미사일 클래스
class Bomb(pygame.sprite.Sprite) :
def __init__(self):
super().__init__()
self.image = pygame.image.load('bomb4.png')
self.rect = self.image.get_rect()
self.rect = self.rect.inflate(-20, -20)##
self.rect.center = (WIDTH//2, HEIGHT-self.rect.height//2-10)
self.speed = sp
def init_posi(self):
self.rect.center = (-100,-100)
def move(self, space):
global change
prssdKeys = pygame.key.get_pressed()
self.rect.move_ip(0, -1 * self.speed)
if prssdKeys[K_SPACE] :
self.rect.move_ip(0, -1 * self.speed)
self.rect.top = 0
self.rect.center = space.rect.center
return self.rect.center
#각 클래스를 변수로 설정
S1 = SpaceShip() # 플레이어
E1 = Enemy(2)
E2=Enemy2(1)
B1 = Bomb()
#그룹 생성
Enemies = pygame.sprite.Group()
Enemies.add(E1, E2)
Bombs = []#미사일 중복 버그 고칠 예정
#또 변수
flag = 0
flag1 = 0
def Game() :
global score
global change
S1 = SpaceShip() # 플레이어
E1 = Enemy(2)
E2 = Enemy2(1)
B1 = Bomb()
# 그룹 생성
Enemies = pygame.sprite.Group()
Enemies.add(E1, E2)
Bombs = [] # 미사일 중복 버그 고칠 예정
# 또 변수
flag = 0
flag1 = 0
# 게임진행
# pk = pygame.key.get_pressed()
# while not pk[K_s]:
# screen.fill(white)
# gin = font.render(" to start, press the 'S'key and to stop at the middle of a game, press 'K'key" , True, black)
# screen.blit(gin, [30, 30])
# pygame.display.update()
while True:
# screen.fill(white) ########배경흰색으로칠하기
prssdKeys = pygame.key.get_pressed()
####### 아래 코드는 개발자용이므로 사용하면 안됩니다. 개발자용!!!!!!!!!!!!
#######->
if prssdKeys[K_k]:
E1.speed = 0
E2.speed = 0
if prssdKeys[K_l]:
E1.speed = 1
E2.speed = 1
if prssdKeys[K_j]:
E1.speed = -1
E2.speed = -1
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
screen.blit(background, (0, 0))
elapsed_time = pygame.time.get_ticks() / 1000
gwn = myfont.render("YOUR TIME : " + str(int(elapsed_time)) + "/70 ", True, black)
screen.blit(gwn, [495, 50])
if change == 1:
B1.image = pygame.image.load('nuclear-bomb.png')
B1.image = pygame.transform.scale(B1.image, (100, 100))
B1.rect.size = (64, 128)
if flag1 > 0: # flag1 = hit 할때마다 충전됨.
gen = myfont.render("-2 POINTS!", True, red)
screen.blit(gen, [170, 30])
flag1 -= 1
if flag > 0: # flag = hit 할때마다 충전됨.
gan = myfont.render("+1 POINTS! GREAT!", True, yellow)
screen.blit(gan, [170, 30])
flag -= 1
if elapsed_time >= 70:
if score >= 50:
running = False
screen.fill(blue)
gqn = myfont.render("YOU'VE DONE IT!!! YEAH!!! YOUR SCORE IS " + str(score), True, black)
screen.blit(gqn, [200, 300])
pygame.display.update()
time.sleep(5)
pygame.quit()
elif score < 50:
screen.fill(blue)
gqn = myfont.render("YOU FAILED!!! OOOOOOOOHH.. ", True, black)
screen.blit(gqn, [200, 300])
pygame.display.update()
time.sleep(5)
pygame.quit()
if score <= 0:
screen.fill(blue)
gqn = myfont.render("YOU FAILED!!! OOOOOOOOHH.. ", True, black)
screen.blit(gqn, [200, 300])
pygame.display.update()
time.sleep(5)
pygame.quit()
screen.blit(E1.image, E1.rect)
E1.move()
screen.blit(E2.image, E2.rect)
E2.move()
screen.blit(S1.image, S1.rect)
S1.move()
# space 눌리면 Bomb 객체 생성해서 Bombs에 추가
screen.blit(B1.image, B1.rect)
B1.move(S1)
# Enemies 그룹에 속한 애와 B1이 충돌했다면, 충돌한 애들을 iscollide에 저장
iscollide = pygame.sprite.spritecollide(B1, Enemies, False)
for x in iscollide:
flag = 50
x.init_position()
B1.init_posi()
score += 1
print(score)
iscollide = pygame.sprite.spritecollide(S1, Enemies, False)
for x in iscollide:
flag1 = 50
x.init_position()
score -= 2
print(score)
fen = myfont.render("YOUR SCORE :", True, green)
pin = myfont.render(str(score), True, green)
screen.blit(fen, [30, 30])
screen.blit(pin, [30, 50])
pygame.display.update()
game_intro()




