티스토리 뷰
반응형
강의동영상
아래 재생목록으로 재행해주세요.(5부로 이루어져있습니다.)
www.youtube.com/watch?v=Sgf7lvYaJ9k&list=PLGIdZwF4u1lSexzBv9Kqo-79QztuPULxK
모든 강의 자료 : www.codingnow.co.kr/
pygame 인터페이스를 사용하여 게임을 제작하였습니다.
우선 pip를 통해 pygame을 설치해야합니다.
pip install pygame
게임에 사용된 이미지 파일입니다.
출처 : pixabay.com/ko/
우주선과 행성 이미지입니다.
소스 설명은 첨부된 동영상을 참고해주세요.
1. 소스코드 : 강의에 사용된 코드
import pygame
from pygame.rect import *
import random
###################################################################
###################################################################
def restart():
global isGameOver, score
isGameOver = False
score = 0
for i in range(len(star)):
recStar[i].y = -1
###################################################################
###################################################################
def eventProcess():
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
if event.key == pygame.K_LEFT:
move.x = -1
if event.key == pygame.K_RIGHT:
move.x = 1
if event.key == pygame.K_UP:
move.y = -1
if event.key == pygame.K_DOWN:
move.y = 1
if event.key == pygame.K_r:
restart()
###################################################################
###################################################################
def movePlayer():
if not isGameOver:
recPlayer.x += move.x
recPlayer.y += move.y
if recPlayer.x < 0:
recPlayer.x = 0
if recPlayer.x > SCREEN_WIDTH-recPlayer.width:
recPlayer.x = SCREEN_WIDTH-recPlayer.width
if recPlayer.y < 0:
recPlayer.y = 0
if recPlayer.y > SCREEN_HEIGHT-recPlayer.height:
recPlayer.y = SCREEN_HEIGHT-recPlayer.height
SCREEN.blit(player, recPlayer)
###################################################################
###################################################################
def timeDelay500ms():
global time_delay_500ms
if time_delay_500ms > 5:
time_delay_500ms = 0
return True
time_delay_500ms += 1
return False
def makeStar():
if isGameOver:
return
if timeDelay500ms():
idex = random.randint(0, len(star)-1)
if recStar[idex].y == -1:
recStar[idex].x = random.randint(0, SCREEN_WIDTH)
recStar[idex].y = 0
def moveStar():
makeStar()
for i in range(len(star)):
if recStar[i].y == -1:
continue
if not isGameOver:
recStar[i].y += 1
if recStar[i].y > SCREEN_HEIGHT:
recStar[i].y = 0
SCREEN.blit(star[i], recStar[i])
###################################################################
###################################################################
def CheckCollision():
global score, isGameOver
if isGameOver:
return
for rec in recStar:
if rec.y == -1:
continue
if rec.top < recPlayer.bottom \
and recPlayer.top < rec.bottom \
and rec.left < recPlayer.right \
and recPlayer.left < rec.right:
print('충돌')
isGameOver = True
break
score += 1
###################################################################
###################################################################
def blinking():
global time_dealy_4sec, toggle
time_dealy_4sec += 1
if time_dealy_4sec > 40:
time_dealy_4sec = 0
toggle = ~toggle
return toggle
def setText():
mFont = pygame.font.SysFont("arial",20, True, False)
SCREEN.blit(mFont.render(
f'score : {score}', True, 'green'), (10, 10, 0, 0))
if isGameOver and blinking():
SCREEN.blit(mFont.render(
'Game Over!!', True, 'red'), (150, 300, 0, 0))
SCREEN.blit(mFont.render(
'press R - Restart', True, 'red'), (140, 320, 0, 0))
###################################################################
###################################################################
#1.변수초기화
isActive = True
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
move = Rect(0,0,0,0)
time_delay_500ms = 0
time_dealy_4sec = 0
toggle = False
score = 0
isGameOver = False
#2.스크린생성
pygame.init()
SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('CodingNoew!!')
#3. player 생성
player = pygame.image.load('player.png')
player = pygame.transform.scale(player,(20,30))
recPlayer = player.get_rect()
recPlayer.centerx = (SCREEN_WIDTH/2)
recPlayer.centery = (SCREEN_HEIGHT/2)
#4. 유성 생성
star = [pygame.image.load('star.png') for i in range(40)]
recStar = [None for i in range(len(star))]
for i in range(len(star)):
star[i] = pygame.transform.scale(star[i], (20, 20))
recStar[i] = star[i].get_rect()
recStar[i].y = -1
#5. 기타
clock = pygame.time.Clock()
#####반복####
while isActive:
#1.화면 지움
SCREEN.fill((0,0,0))
#2.이벤트처리
eventProcess()
#3.플레이어 이동
movePlayer()
#4.유성 생성 및 이동
moveStar()
#5.충돌 확인
CheckCollision()
#6.text업데이트
setText()
#7.화면 갱신
pygame.display.flip()
clock.tick(100)
#####반복####
2. 소스코드 : 약간 정리한 코드
import pygame
from pygame.rect import *
import random
#########################################################
def restart():
global score, isGameOver
for i in range(len(star)):
rectStar[i].y = -1
score = 0
isGameOver = False
def eventProcess(move):
global isActive
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
isActive = False
if event.key == pygame.K_LEFT:
move.x = -1
if event.key == pygame.K_RIGHT:
move.x = 1
if event.key == pygame.K_UP:
move.y = -1
if event.key == pygame.K_DOWN:
move.y = 1
if event.key == pygame.K_r:
restart()
#########################################################
def movePlayer(player, current, move, isGameOver):
global SCREEN_WIDTH, SCREEN_HEIGHT
if not isGameOver:
current.x += move.x
current.y += move.y
#### limit
if current.y > SCREEN_HEIGHT - current.height:
current.y = SCREEN_HEIGHT - current.height
if current.x > SCREEN_WIDTH-current.width:
current.x = SCREEN_WIDTH - current.width
if current.y < 0:
current.y = 0
if current.x < 0:
current.x = 0
SCREEN.blit(player, current)
#########################################################
def timeUpdate50ms():
global time500ms
time500ms += 1
if time500ms > 5:
time500ms = 0
return True
return False
def makeStar(rec):
if timeUpdate50ms():
idex = random.randint(0, len(star)-1)
if rec[idex].y == -1:
rec[idex].x = random.randint(0, SCREEN_WIDTH)
rec[idex].y = 0
def moveStar(star, current, isGameOver):
global SCREEN_HEIGHT
for i in range(len(star)):
if current[i].y == -1:
continue
if not isGameOver:
current[i].y += 1
if current[i].y > SCREEN_HEIGHT:
current[i].y = -1
SCREEN.blit(star[i], current[i])
#########################################################
def CheckCollision(player, star):
global isGameOver, score
if isGameOver:
return
for rec in star:
if rec.top < player.bottom \
and player.top < rec.bottom \
and rec.left < (player.right-8) \
and (player.left+8) < rec.right:
isGameOver = True
break
score += 1
#########################################################
def timeUpdate4sec(isGameOver):
global time4Sec, time4SecToggle
if not isGameOver:
return False
time4Sec += 1
if time4Sec > 40:
time4Sec = 0
time4SecToggle = (~time4SecToggle)
return time4SecToggle
def setText(isupdate=False):
global score
myFont = pygame.font.SysFont("arial", 20, True, False)
SCREEN.blit(myFont.render(
f'score : {score}', True, 'green'), (10, 10, 0, 0))
if isupdate:
SCREEN.blit(myFont.render(
f'Game Over!!', True, 'red'), (150, 300, 0, 0))
SCREEN.blit(myFont.render(
f'press R - Restart', True, 'red'), (140, 320, 0, 0))
#########################################################
#########################################################
##1. 변수 선언
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
score = 0
isActive = True
isGameOver = False
move = Rect(0, 0, 0, 0)
time500ms = 0
time4Sec = 0
time4SecToggle = False
#########################################################
##2. 스크린
pygame.init()
SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("CodingNow!!")
#########################################################
##3. player
player = pygame.image.load("Player.png")
player = pygame.transform.scale(player, (20, 30))
rectPlayer = player.get_rect()
rectPlayer.centerx = (SCREEN_WIDTH / 2)
rectPlayer.centery = (SCREEN_HEIGHT / 2)
#########################################################
##4. 유성
star = [pygame.image.load("star.png") for i in range(20)]
rectStar = [None for i in range(len(star))]
for i in range(len(star)):
star[i] = pygame.transform.scale(star[i], (20, 20))
rectStar[i] = star[i].get_rect()
rectStar[i].y = -1
#########################################################
##5. time
clock = pygame.time.Clock()
while isActive:
#1. 화면 검정색으로 지우기
SCREEN.fill((0, 0, 0))
#2. 이번트처리
eventProcess(move)
#3. 플레이어
movePlayer(player, rectPlayer,move,isGameOver)
#4. 유성만들기
makeStar(rectStar)
moveStar(star, rectStar,isGameOver)
#5. 충돌
CheckCollision(rectPlayer, rectStar)
#6. Text 업데이트
setText(timeUpdate4sec(isGameOver))
#7.화면업데이트
pygame.display.flip()
clock.tick(100)
반응형
'파이썬 강의' 카테고리의 다른 글
파이썬 기초 활용편 pygame을 사용하여 삼각형별과 다이아몬드별 출력하기 (0) | 2021.02.15 |
---|---|
파이썬 기초 활용 :: 유성피하기 게임 만들기 #우주선에서 미사일발사 추가하기 (0) | 2021.01.29 |
파이썬 기초 활용 #간단한 숫자맞추기 게임 만들기 (0) | 2021.01.18 |
파이썬 기초 활용 #키보드 입력을 사용하여 초간단 갤러그 스타워즈 게임 #2탄 (0) | 2021.01.14 |
파이썬 기초 활용 #키보드 입력으로 별이동하기 게임 #1탄 pynput (0) | 2021.01.14 |