본문 바로가기

Programming/Python

파이썬 무료 강의 (활용편1) - 추억의 오락실 게임 만들기 (3시간)

기본편

-기본 문법

-실상활 기반 예제(스타크래프트)

-퀴즈

 

활용편

-라이브러리 기초 사용법

-8개의 실전 프로젝트

(머신러닝, 데이터 분석, 업무 자동화, 아두이노 RC Car, 얼굴 인식)

#1_create_frame.py
import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
pygame.display.set_mode((screen_width, screen_height))

#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#이벤트 루프
running =True #게임이 진행중인가?
while running :
	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

# pygame 종료
pygame.quit()
#2_background.py
import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")



#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#이벤트 루프
running =True #게임이 진행중인가?
while running :
	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

	screen.blit(background, (0, 0)) #배경 그리기

	pygame.display.update() #게임 화면을 다시 그리기!

# pygame 종료
pygame.quit()

ㅇ 이미지 불러오기 말고 RGB로 직접 색깔 지정할 수도 있어요

   screen.fill((0, 0, 255)) ->파란색

 

 

 

  • 배경 생성 후 캐릭터 위치 설정하기

 

배경 높이에서 캐릭터 위치 만큼 빼주기

 

character_y_pos = screen_height에서 

character_y_pos = screen_height - charcter_height 해주니깐 캐릭터 나타남~

 

 

 

 

중간에 위치 하기위해서

character_x_pos = (screen_width / 2) - (character_width/2)  빼줌

 

 

 

3.

#3_main_sprite.py
import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/character.png")
character_size=character.get_rect().size #이미지 크기를 구해옴
character_width = character_size[0] #캐릭터의 가로 크기
character_height=character_size[1] #캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos=screen_height - character_height #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)






#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#이벤트 루프
running =True #게임이 진행중인가?
while running :
	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

	screen.blit(background, (0, 0)) #배경 그리기
	screen.blit(character, (character_x_pos, character_y_pos)) #캐릭터 그리기

	pygame.display.update() #게임 화면을 다시 그리기!

# pygame 종료
pygame.quit()

4.

#4_keyboard_event.py

#3_main_sprite.py
import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/character.png")
character_size=character.get_rect().size #이미지 크기를 구해옴
character_width = character_size[0] #캐릭터의 가로 크기
character_height=character_size[1] #캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos=screen_height - character_height #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)


#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#이동할 좌표
to_x = 0
to_y = 0


#이벤트 루프
running =True #게임이 진행중인가?
while running :
	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

		if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인
			if event.key==pygame.K_LEFT : #캐릭터를 왼쪽으로
				to_x -= 5 #to_x = to_x=5
			elif event.key==pygame.K_RIGHT: #캐릭터를 오른쪽으로
				to_x += 5
			elif event.key==pygame.K_UP: #캐릭터를 위로
				to_y -=5
			elif event.key==pygame.K_DOWN:#캐릭터를 아래로
				to_y +=5

		if event.type == pygame.KEYUP: #뱡향키를 떼면 멈춤
			if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
				to_x=0
			elif event.key ==pygame.K_UP or event.key == pygame.K_DOWN:
				to_y = 0

	character_x_pos += to_x
	character_y_pos +=to_y

#가로 경계값 처리
	if character_x_pos <0:
		character_x_pos = 0
	elif character_x_pos> screen_width - character_width:
		character_x_pos = screen_width - character_width
#세로 경계값 처리
	if character_y_pos < 0 :
		character_y_pos = 0
	elif character_y_pos > screen_height - character_height:
		character_y_pos = screen_height - character_height

	screen.blit(background, (0, 0)) #배경 그리기
	screen.blit(character, (character_x_pos, character_y_pos)) #캐릭터 그리기

	pygame.display.update() #게임 화면을 다시 그리기!

# pygame 종료
pygame.quit()

 

 

 

5. 

프레임 높으면 화면, 캐릭터 이동이 좀 더 부드러움

#5_frame_per_second.py

import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/character.png")
character_size=character.get_rect().size #이미지 크기를 구해옴
character_width = character_size[0] #캐릭터의 가로 크기
character_height=character_size[1] #캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos=screen_height - character_height #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)


#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#FPS
clock = pygame.time.Clock()

#이동할 좌표
to_x = 0
to_y = 0

#이동 속도
character_speed = 0.6


#이벤트 루프
running =True #게임이 진행중인가?
while running :
	dt = clock.tick(10) #r게임 화면의 초당 프레임 수 설정


#캐릭터가 100만큼 이동을 해야함
#10 fps : 1초 동안에 10번 동작 -> 1번에 몇 만큼 이동 ? 10만큼! 10*10 = 100
#20 fps : 1초 동안에 20번 동작 -> 1번에 5만큼 ! 5 * 20 = 100

	print("fps :" + str(clock.get_fps()))

	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

		if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인
			if event.key==pygame.K_LEFT : #캐릭터를 왼쪽으로
				to_x -= character_speed
			elif event.key==pygame.K_RIGHT: #캐릭터를 오른쪽으로
				to_x += character_speed
			elif event.key==pygame.K_UP: #캐릭터를 위로
				to_y -= character_speed
			elif event.key==pygame.K_DOWN:#캐릭터를 아래로
				to_y += character_speed

		if event.type == pygame.KEYUP: #뱡향키를 떼면 멈춤
			if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
				to_x=0
			elif event.key ==pygame.K_UP or event.key == pygame.K_DOWN:
				to_y = 0

	character_x_pos += to_x *dt
	character_y_pos +=to_y *dt

#가로 경계값 처리
	if character_x_pos <0:
		character_x_pos = 0
	elif character_x_pos> screen_width - character_width:
		character_x_pos = screen_width - character_width
#세로 경계값 처리
	if character_y_pos < 0 :
		character_y_pos = 0
	elif character_y_pos > screen_height - character_height:
		character_y_pos = screen_height - character_height

	screen.blit(background, (0, 0)) #배경 그리기
	screen.blit(character, (character_x_pos, character_y_pos)) #캐릭터 그리기

	pygame.display.update() #게임 화면을 다시 그리기!

# pygame 종료
pygame.quit()

6. 충돌 처리

#6.collision

import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/character.png")
character_size=character.get_rect().size #이미지 크기를 구해옴
character_width = character_size[0] #캐릭터의 가로 크기
character_height=character_size[1] #캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos=screen_height - character_height #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)


#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#FPS
clock = pygame.time.Clock()

#이동할 좌표
to_x = 0
to_y = 0

#이동 속도
character_speed = 0.6


# 적 enemy 캐릭터

enemy = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/enemy.png")
enemy_size=enemy.get_rect().size #이미지 크기를 구해옴
enemy_width = enemy_size[0] #캐릭터의 가로 크기
enemy_height=enemy_size[1] #캐릭터의 세로 크기
enemy_x_pos = (screen_width / 2) - (enemy_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
enemy_y_pos=(screen_height/2) - (enemy_height/2) #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)


#이벤트 루프
running =True #게임이 진행중인가?
while running :
	dt = clock.tick(60) #r게임 화면의 초당 프레임 수 설정


	print("fps :" + str(clock.get_fps()))

	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

		if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인
			if event.key==pygame.K_LEFT : #캐릭터를 왼쪽으로
				to_x -= character_speed
			elif event.key==pygame.K_RIGHT: #캐릭터를 오른쪽으로
				to_x += character_speed
			elif event.key==pygame.K_UP: #캐릭터를 위로
				to_y -= character_speed
			elif event.key==pygame.K_DOWN:#캐릭터를 아래로
				to_y += character_speed

		if event.type == pygame.KEYUP: #뱡향키를 떼면 멈춤
			if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
				to_x=0
			elif event.key ==pygame.K_UP or event.key == pygame.K_DOWN:
				to_y = 0

	character_x_pos += to_x *dt
	character_y_pos +=to_y *dt

#가로 경계값 처리
	if character_x_pos <0:
		character_x_pos = 0
	elif character_x_pos> screen_width - character_width:
		character_x_pos = screen_width - character_width
#세로 경계값 처리
	if character_y_pos < 0 :
		character_y_pos = 0
	elif character_y_pos > screen_height - character_height:
		character_y_pos = screen_height - character_height

	#충돌 처리를 위한 rect정보 업데이트
	character_rect = character.get_rect()
	character_rect.left = character_x_pos
	character_rect.top = character_y_pos

	enemy_rect = enemy.get_rect()
	enemy_rect.left = enemy_x_pos
	enemy_rect.top = enemy_y_pos

	# 충돌 체크
	if character_rect.colliderect(enemy_rect): #사각형 기준으로 충돌이 있었는지
		running = False

	screen.blit(background, (0, 0)) #배경 그리기
	screen.blit(character, (character_x_pos, character_y_pos)) #캐릭터 그리기

	screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) #적 그리기
	pygame.display.update() #게임 화면을 다시 그리기!

# pygame 종료
pygame.quit()

7. 텍스트 

#7.text.py

import pygame

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#배경 이미지 불러오기
background=pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/character.png")
character_size=character.get_rect().size #이미지 크기를 구해옴
character_width = character_size[0] #캐릭터의 가로 크기
character_height=character_size[1] #캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos=screen_height - character_height #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)


#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#FPS
clock = pygame.time.Clock()

#이동할 좌표
to_x = 0
to_y = 0

#이동 속도
character_speed = 0.6


# 적 enemy 캐릭터

enemy = pygame.image.load("C:/Users/alswj/Desktop/python/pygame_basic/enemy.png")
enemy_size=enemy.get_rect().size #이미지 크기를 구해옴
enemy_width = enemy_size[0] #캐릭터의 가로 크기
enemy_height=enemy_size[1] #캐릭터의 세로 크기
enemy_x_pos = (screen_width / 2) - (enemy_width/2) #화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
enemy_y_pos=(screen_height/2) - (enemy_height/2) #화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)

#폰트 정의
game_font = pygame.font.Font(None, 40) #(폰트, 크기)

#총 시간
total_time = 10

#시작 시간 정보
start_ticks = pygame.time.get_ticks() #시작(현재) tick 을 받아옴


#이벤트 루프
running =True #게임이 진행중인가?
while running :
	dt = clock.tick(60) #r게임 화면의 초당 프레임 수 설정


	print("fps :" + str(clock.get_fps()))

	for event in pygame.event.get(): #어떤 이벤트가 발생하였는가?
		if event.type == pygame.QUIT: #창이 닫히는 이벤트가 발생하였는가?
			running =False #게임이 진행중이 아님

		if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인
			if event.key==pygame.K_LEFT : #캐릭터를 왼쪽으로
				to_x -= character_speed
			elif event.key==pygame.K_RIGHT: #캐릭터를 오른쪽으로
				to_x += character_speed
			elif event.key==pygame.K_UP: #캐릭터를 위로
				to_y -= character_speed
			elif event.key==pygame.K_DOWN:#캐릭터를 아래로
				to_y += character_speed

		if event.type == pygame.KEYUP: #뱡향키를 떼면 멈춤
			if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
				to_x=0
			elif event.key ==pygame.K_UP or event.key == pygame.K_DOWN:
				to_y = 0

	character_x_pos += to_x *dt
	character_y_pos +=to_y *dt

#가로 경계값 처리
	if character_x_pos <0:
		character_x_pos = 0
	elif character_x_pos> screen_width - character_width:
		character_x_pos = screen_width - character_width
#세로 경계값 처리
	if character_y_pos < 0 :
		character_y_pos = 0
	elif character_y_pos > screen_height - character_height:
		character_y_pos = screen_height - character_height

	#충돌 처리를 위한 rect정보 업데이트
	character_rect = character.get_rect()
	character_rect.left = character_x_pos
	character_rect.top = character_y_pos

	enemy_rect = enemy.get_rect()
	enemy_rect.left = enemy_x_pos
	enemy_rect.top = enemy_y_pos

	# 충돌 체크
	if character_rect.colliderect(enemy_rect): #사각형 기준으로 충돌이 있었는지
		running = False

	screen.blit(background, (0, 0)) #배경 그리기
	screen.blit(character, (character_x_pos, character_y_pos)) #캐릭터 그리기

	screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) #적 그리기

	#타이머 집어 넣기
	#경과 시간 계산
	elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
	#경과 시간(ms) 을 1000으로 나누어서 초(s) 단위로 표시

	timer = game_font.render(str(int(total_time - elapsed_time)), True, (255,255,255))
	#출력할 글자, True, 글자 색상

	screen.blit(timer, (10, 10))

	#만약 시간이 0 이하이면 게임 종료
	if total_time - elapsed_time <=0:
		print("타임 아웃")
		running = False

	pygame.display.update() #게임 화면을 다시 그리기!

#잠시 대기
pygame.time.delay(2000) #2초 정도 대기(ms)

# pygame 종료
pygame.quit()

10초 시간이 지나면 2초 정도 대기 했다가 타임 아웃 뜨면서 종료됨.

 

 

 

8. 게임 개발 프레임-게임 개발 틀

#8_frame.py

import pygame
#######################################################################
#기본 초기화(반드시 해야 하는 것들)

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#화면 타이틀 설정
pygame.display.set_caption("minjeong Game") #게임 이름

#FPS
clock = pygame.time.Clock()
#######################################################################




# 1. 사용자 게임 초기화(배경화면 , 게임 이미지, 좌표, 속도, 폰트 등)

running =True 
while running :
	dt = clock.tick(30)  


	#2. 이벤트 처리(키보드, 마우스 등)
	for event in pygame.event.get(): 
		if event.type == pygame.QUIT: 
			running =False 

	#3. 게임 캐릭터 위치 정의

	#4. 충돌 처리

	#5. 화면에 그리기 
	

	pygame.display.update() #게임 화면을 다시 그리기!



# pygame 종료
pygame.quit()

ㅂquiz.py

#quiz.py
import random
import pygame
#######################################################################
#기본 초기화(반드시 해야 하는 것들)

pygame.init() #초기화(반드시 필요)

#화면 크기 설정
screen_width=480 #가로 크기
screen_height=640 #세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))


#화면 타이틀 설정
pygame.display.set_caption("코로나 피하기 게임") #게임 이름

#FPS
clock = pygame.time.Clock()
#######################################################################




# 1. 사용자 게임 초기화(배경화면 , 게임 이미지, 좌표, 속도, 폰트 등)
#배경 만들기
background=pygame.image.load("C:\\Users\\alswj\\Desktop\\python\\pygame_basic\\coronaback.png")

#캐릭터 만들기
character = pygame.image.load("C:\\Users\\alswj\\Desktop\\python\\pygame_basic\\person.png")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width / 2) - (character_width / 2)
character_y_pos = (screen_height - character_height)

#이동 위치
to_x = 0 
character_speed = 10

#똥 만들기
ddong = pygame.image.load("C:\\Users\\alswj\\Desktop\\python\\pygame_basic\\corona.png")
ddong_size = ddong.get_rect().size
ddong_width = ddong_size[0]
ddong_height = ddong_size[1]
ddong_x_pos = random.randint(0, screen_width - ddong_width)
ddong_y_pos = 0
ddong_speed = 10



running =True
while running :
	dt = clock.tick(30)


	#2. 이벤트 처리(키보드, 마우스 등)
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			running =False

		if event.type == pygame.KEYDOWN:
			if event.key == pygame.K_LEFT:
				to_x -= character_speed
			elif event.key == pygame.K_RIGHT:
				to_x += character_speed

		if event.type == pygame.KEYUP:
			if event.key == pygame.K_LEFT or event.key==pygame.K_RIGHT:
				to_x = 0


	#3. 게임 캐릭터 위치 정의
	character_x_pos += to_x

	if character_x_pos < 0:
		character_x_pos =0
	elif character_x_pos > screen_width - character_width:
		character_x_pos = screen_width - character_width

	ddong_y_pos += ddong_speed

	if ddong_y_pos > screen_height:
		ddong_y_pos = 0
		ddong_x_pos = random.randint(0, screen_width - ddong_width)


	#4. 충돌 처리
	character_rect=character.get_rect()
	character_rect.left = character_x_pos
	character_rect.top = character_y_pos

	ddong_rect = ddong.get_rect()
	ddong_rect.left = ddong_x_pos
	ddong_rect.top = ddong_y_pos

	if character_rect.colliderect(ddong_rect):
		print("충돌 했어요")
		running=False

	#5. 화면에 그리기
	screen.blit(background, (0, 0))
	screen.blit(character, (character_x_pos, character_y_pos))
	screen.blit(ddong, (ddong_x_pos, ddong_y_pos))

	pygame.display.update() #게임 화면을 다시 그리기!



# pygame 종료
pygame.quit()

 

  

'Programming > Python' 카테고리의 다른 글