1. 실행 코드
import pygame as pg
import math
import random
# 이미지 초기화
def 스프라이트생성(이미지, 위치, 상태=None):
스프라이트 = pg.sprite.Sprite()
스프라이트.image = 이미지
스프라이트.rect = 스프라이트.image.get_rect()
스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1]
if 상태 != None:
스프라이트.상태 = 상태
return 스프라이트
pg.init()
# 게임기본설정
실행여부 = True
화면가로길이, 화면세로길이 = 952, 913
화면 = pg.display.set_mode([화면가로길이, 화면세로길이])
pg.display.set_caption('광석채굴!')
# 색깔 설정
흰색 = (255, 255, 255)
검은색 = (0, 0, 0)
# 글꼴 설정
글꼴 = pg.font.SysFont('hy얕은샘물m', 50)
작은글꼴 = pg.font.SysFont('hy얕은샘물m', 40)
# 게임 요소 초기화
소울곰위치 = [화면가로길이 // 2, 화면세로길이 // 2]
소울곰속도 = 100
소울곰파워 = 1
광석최대상태 = 5
광석자동생성시간 = 8
광석자동생성남은시간 = 0
코인 = 0
전체시간 = 0
배경이미지 = pg.image.load('img/배경.png')
배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이))
시간이미지 = pg.image.load('img/시간-바.png')
시간이미지크기 = (337, 89)
시간이미지 = pg.transform.scale(시간이미지, 시간이미지크기)
코인이미지 = pg.image.load('img/코인-바.png')
코인이미지크기 = (337, 89)
코인이미지 = pg.transform.scale(코인이미지, 코인이미지크기)
게임요소크기 = (152, 152)
소울곰이미지딕셔너리 = {"이동": [], "반대이동" : [], "캐기" : []}
소울곰멈춤이미지 = pg.image.load(f'img/소울곰_멈춘상태.png')
소울곰멈춤이미지 = pg.transform.scale(소울곰멈춤이미지, 게임요소크기)
소울곰이미지딕셔너리["멈춤"] = 소울곰멈춤이미지
for 인덱스 in range(4):
소울곰뛰는모습이미지 = pg.image.load(f'img/소울곰_뛰는모습_{인덱스 + 1}.png')
소울곰뛰는모습이미지 = pg.transform.scale(소울곰뛰는모습이미지, 게임요소크기)
소울곰이미지딕셔너리["이동"].append(소울곰뛰는모습이미지)
소울곰뛰는모습반전이미지 = pg.image.load(f'img/소울곰_뛰는모습_반전_{인덱스 + 1}.png')
소울곰뛰는모습반전이미지 = pg.transform.scale(소울곰뛰는모습반전이미지, 게임요소크기)
소울곰이미지딕셔너리["반대이동"].append(소울곰뛰는모습반전이미지)
for 인덱스 in range(3):
소울곰캐는모습이미지 = pg.image.load(f'img/소울곰_캐는모습_{인덱스 + 1}.png')
소울곰캐는모습이미지 = pg.transform.scale(소울곰캐는모습이미지, 게임요소크기)
소울곰이미지딕셔너리["캐기"].append(소울곰캐는모습이미지)
소울곰이미지상태 = "멈춤"
소울곰이미지인덱스 = 0
소울곰이미지흐름 = 1
소울곰스프라이트 = 스프라이트생성(소울곰이미지딕셔너리[소울곰이미지상태], 소울곰위치)
광석이미지리스트 = []
for 인덱스 in range(5):
광석이미지 = pg.image.load(f'img/광석_{5 - 인덱스}.png')
광석이미지 = pg.transform.scale(광석이미지, 게임요소크기)
광석이미지리스트.append(광석이미지)
광석스프라이트리스트 = []
광석스프라이트리스트.append(스프라이트생성(광석이미지리스트[-1], (200, 200), 광석최대상태))
# 오른쪽 하단 능력치 아이콘 이미지
능력치이미지 = pg.image.load('img/능력치.png')
능력치이미지크기 = (545, 190)
능력치이미지 = pg.transform.scale(능력치이미지, 능력치이미지크기)
시계 = pg.time.Clock()
이미지움직임최대시간 = 0.2
이미지움직임시간 = 0
while 실행여부:
화면.blit(배경이미지, (0, 0))
흐른시간 = 시계.tick(60)/ 1000
전체시간 += 흐른시간
시간문자열 = '%02d:%05.2f' % (전체시간 / 60, 전체시간 % 60)
게임시작시간글자 = 글꼴.render(시간문자열, True, 검은색)
화면.blit(시간이미지, (30, 10))
화면.blit(게임시작시간글자, (시간이미지크기[0] - 21 * len(시간문자열), 40))
코인문자열 = str(코인)
코인글자 = 글꼴.render(코인문자열, True, 검은색)
화면.blit(코인이미지, (화면가로길이 - 30 - 코인이미지크기[0], 10))
화면.blit(코인글자, (화면가로길이 - 70 - 21 * len(코인문자열), 40))
for 광석_스프라이트 in 광석스프라이트리스트:
화면.blit(광석_스프라이트.image, 광석_스프라이트.rect)
소울곰스프라이트.rect.x, 소울곰스프라이트.rect.y = 소울곰위치[0], 소울곰위치[1]
화면.blit(소울곰스프라이트.image, 소울곰스프라이트.rect)
화면.blit(능력치이미지, (화면가로길이 - 능력치이미지크기[0], 화면세로길이 - 능력치이미지크기[1]))
파워글자 = 작은글꼴.render(str(1), True, 검은색)
화면.blit(파워글자, (500, 화면세로길이 - 능력치이미지크기[1] + 55))
속도글자 = 작은글꼴.render(str(1), True, 검은색)
화면.blit(속도글자, (610, 화면세로길이 - 능력치이미지크기[1] + 55))
광석글자 = 작은글꼴.render(str(1), True, 검은색)
화면.blit(광석글자, (720, 화면세로길이 - 능력치이미지크기[1] + 55))
# 광석 자동 생성
광석자동생성남은시간 -= 흐른시간
if 광석자동생성남은시간 <= 0:
생성위치 = [random.random() * (화면가로길이 - 게임요소크기[0]),
random.random() * (화면세로길이 - 시간이미지크기[1] - 능력치이미지크기[1] - 게임요소크기[1]) + 시간이미지크기[1]]
광석스프라이트리스트.append(스프라이트생성(광석이미지리스트[-1], 생성위치, 광석최대상태))
광석자동생성남은시간 = 광석자동생성시간
for 이벤트 in pg.event.get():
if 이벤트.type == pg.QUIT:
실행여부 = False
# 캐릭터 움직이기
keys = pg.key.get_pressed()
if keys[pg.K_SPACE]:
if 소울곰이미지상태 == '캐기':
이미지움직임시간 -= 흐른시간
if 이미지움직임시간 <= 0:
이미지움직임시간 = 이미지움직임최대시간
소울곰이미지인덱스 += 소울곰이미지흐름
소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태][소울곰이미지인덱스]
if 소울곰이미지인덱스 == 0 or 소울곰이미지인덱스 == len(소울곰이미지딕셔너리[소울곰이미지상태]) - 1:
소울곰이미지흐름 *= -1
if 소울곰이미지인덱스 == len(소울곰이미지딕셔너리[소울곰이미지상태]) - 1:
for 광석스프라이트 in 광석스프라이트리스트:
if pg.sprite.collide_mask(소울곰스프라이트, 광석스프라이트):
광석스프라이트.상태 -= 소울곰파워
if 광석스프라이트.상태 <= 0:
코인 += 1
광석스프라이트리스트.remove(광석스프라이트)
else:
광석스프라이트.image = 광석이미지리스트[math.ceil(광석스프라이트.상태) - 1]
break
else:
이미지움직임시간 = 이미지움직임최대시간
소울곰이미지상태 = "캐기"
소울곰이미지인덱스 = 0
소울곰이미지흐름 = 1
소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태][소울곰이미지인덱스]
elif keys[pg.K_LEFT] or keys[pg.K_RIGHT] or keys[pg.K_UP] or keys[pg.K_DOWN]:
이미지움직임시간 -= 흐른시간
if keys[pg.K_LEFT] or keys[pg.K_RIGHT]:
if keys[pg.K_LEFT]:
if 소울곰이미지상태 != '이동':
소울곰이미지상태 = '이동'
이미지움직임시간 = 0
if 소울곰위치[0] >= 0:
소울곰위치[0] -= 소울곰속도 * 흐른시간
if keys[pg.K_RIGHT]:
if 소울곰이미지상태 != "반대이동":
소울곰이미지상태 = "반대이동"
이미지움직임시간 = 0
if 소울곰위치[0] < 화면가로길이 - 게임요소크기[0] + 20:
소울곰위치[0] += 소울곰속도 * 흐른시간
if keys[pg.K_UP] or keys[pg.K_DOWN]:
if 소울곰이미지상태 != '이동' and 소울곰이미지상태 != '반대이동':
소울곰이미지상태 = '이동'
if keys[pg.K_UP] and 소울곰위치[1] >= 시간이미지크기[1]:
소울곰위치[1] -= 소울곰속도 * 흐른시간
elif keys[pg.K_DOWN] and 소울곰위치[1] < 화면세로길이-능력치이미지크기[1] - 게임요소크기[1]:
소울곰위치[1] += 소울곰속도 * 흐른시간
if 이미지움직임시간 <= 0:
이미지움직임시간 = 이미지움직임최대시간
소울곰이미지인덱스 += 소울곰이미지흐름 # 현재1
소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태][소울곰이미지인덱스]
if 소울곰이미지인덱스==0 or 소울곰이미지인덱스==len(소울곰이미지딕셔너리[소울곰이미지상태]) -1:
소울곰이미지흐름 *= -1
else:
이미지움직임시간 = 0
소울곰이미지상태 = '멈춤'
소울곰이미지흐름 = 1
소울곰이미지인덱스 = 0
소울곰스프라이트.image = 소울곰이미지딕셔너리[소울곰이미지상태]
pg.display.update()
pg.display.quit()
2. 상세 내용
import random
- 파이썬에서 랜덤으로 숫자를 주는데 사용하는 라이브러리입니다.
광석자동생성시간 = 8
광석자동생성남은시간 = 0
- 이미지움직임 때처럼 광석이 자동으로 생성될 시간과 그 시간을 측정할 변수입니다.
# 광석 자동 생성
광석자동생성남은시간 -= 흐른시간
if 광석자동생성남은시간 <= 0:
생성위치 = [random.random() * (화면가로길이 - 게임요소크기[0]),
random.random() * (화면세로길이 - 시간이미지크기[1] - 능력치이미지크기[1] - 게임요소크기[1]) + 시간이미지크기[1]]
광석스프라이트리스트.append(스프라이트생성(광석이미지리스트[-1], 생성위치, 광석최대상태))
광석자동생성남은시간 = 광석자동생성시간
- 이미지움직임 때는 특정 동작에 따라 계산이 되었지만 광석은 일정시간마다 늘 생성되기 때문에 계속 흐른시간만큼 빼줍니다.
- 생성위치는 이동할 때와 같은 범위로 생성합니다.
3. 실행 결과