⛏️

005 능력 업그레이드

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 소울곰속도업그레이드최대횟수 = 10 소울곰파워 = 1 소울곰파워업그레이드횟수 = 1 소울곰파워업그레이드최대횟수 = 10 광석최대상태 = 5 광석자동생성시간 = 8 광석자동생성남은시간 = 0 광석자동생성업그레이드횟수 = 1 광석자동생성업그레이드최대횟수 = 7 코인 = 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(소울곰파워업그레이드횟수), True, 검은색) 화면.blit(파워글자, (500, 화면세로길이 - 능력치이미지크기[1] + 55)) 속도글자 = 작은글꼴.render(str(소울곰속도업그레이드횟수), True, 검은색) 화면.blit(속도글자, (610, 화면세로길이 - 능력치이미지크기[1] + 55)) 광석글자 = 작은글꼴.render(str(광석자동생성업그레이드횟수), 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 elif 이벤트.type == pg.KEYDOWN: if 이벤트.key == pg.K_z: if 소울곰파워업그레이드횟수 <= 소울곰파워업그레이드최대횟수 and 코인 >= 소울곰파워업그레이드횟수 ** 2: 코인 -= 소울곰파워업그레이드횟수 ** 2 소울곰파워업그레이드횟수 += 1 소울곰파워 += 0.4 elif 이벤트.key == pg.K_x: if 소울곰속도업그레이드횟수 <= 소울곰속도업그레이드최대횟수 and 코인 >= 소울곰속도업그레이드횟수 ** 2: 코인 -= 소울곰속도업그레이드횟수 ** 2 소울곰속도업그레이드횟수 += 1 소울곰속도 += 40 elif 이벤트.key == pg.K_c: if 광석자동생성업그레이드횟수 <= 광석자동생성업그레이드최대횟수 and 코인 >= 광석자동생성업그레이드횟수 ** 2: 코인 -= 광석자동생성업그레이드횟수 ** 2 광석자동생성업그레이드횟수 += 1 광석자동생성시간 -= 1 # 캐릭터 움직이기 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. 상세 내용

소울곰속도업그레이드횟수 = 1 소울곰속도업그레이드최대횟수 = 10 소울곰파워업그레이드횟수 = 1 소울곰파워업그레이드최대횟수 = 10 광석자동생성업그레이드횟수 = 1 광석자동생성업그레이드최대횟수 = 7
  • 각 능력치에 따른 업그레이드 횟수와 관련된 변수들입니다.
 
파워글자 = 작은글꼴.render(str(소울곰파워업그레이드횟수), True, 검은색) 화면.blit(파워글자, (500, 화면세로길이 - 능력치이미지크기[1] + 55)) 속도글자 = 작은글꼴.render(str(소울곰속도업그레이드횟수), True, 검은색) 화면.blit(속도글자, (610, 화면세로길이 - 능력치이미지크기[1] + 55)) 광석글자 = 작은글꼴.render(str(광석자동생성업그레이드횟수), True, 검은색) 화면.blit(광석글자, (720, 화면세로길이 - 능력치이미지크기[1] + 55))
  • 이전에 1로만 표시해주었던 업그레이드 횟수 글자를 변수로 바꾸어줍니다.
 
elif 이벤트.type == pg.KEYDOWN: if 이벤트.key == pg.K_z: if 소울곰파워업그레이드횟수 <= 소울곰파워업그레이드최대횟수 and 코인 >= 소울곰파워업그레이드횟수 ** 2: 코인 -= 소울곰파워업그레이드횟수 ** 2 소울곰파워업그레이드횟수 += 1 소울곰파워 += 0.4 elif 이벤트.key == pg.K_x: if 소울곰속도업그레이드횟수 <= 소울곰속도업그레이드최대횟수 and 코인 >= 소울곰속도업그레이드횟수 ** 2: 코인 -= 소울곰속도업그레이드횟수 ** 2 소울곰속도업그레이드횟수 += 1 소울곰속도 += 40 elif 이벤트.key == pg.K_c: if 광석자동생성업그레이드횟수 <= 광석자동생성업그레이드최대횟수 and 코인 >= 광석자동생성업그레이드횟수 ** 2: 코인 -= 광석자동생성업그레이드횟수 ** 2 광석자동생성업그레이드횟수 += 1 광석자동생성시간 -= 1
  • pg.KEYDOWN은 키보드의 키가 눌렸을 때를 의미합니다.
  • 업그레이드를 할 때에는 연속적인 키 입력보다는 키를 누를 때 마다의 조건이 좋으므로 pg.event.get()를 이용합니다.
    • 업그레이드 횟수에 따른 코인 지불은 횟수의 제곱으로 하였습니다. 이는 밸런스나 원하는 대로 조정하시면 됩니다.
    • 업그레이드가 된 후에는 업그레이드 횟수를 1 증가시키고 각 능력에 따른 능력치를 조정합니다.
    • 위의 예시는 업그레이드 최대 횟수 10을 기준으로 (광석은 7) 전부 업그레이드 되었을 때 파워는 광석이 한번에 캐지고 속도는 처음 속도의 5배 광석 생성속도는 1초 기준입니다.
    • 또한 업그레이드 키보드 값울 바꾸고 싶다면 아래의 사이트를 참고해주세요.(pygame에서 각 키에 관련된 상수를 나타낸 공식문서입니다.)
 

3. 실행 결과

notion imagenotion image