목차 (원하는 부분을 클릭하시면 바로 이동하실 수 있습니다~)
1. 오늘의 진행내용
2. 소스코드
3. 코드설명
4. 정리 및 참고사이트
이번에는 게임 엔딩 장면과 갱도2에서의 상호작용 등을 다루며 아직 추가할 여지가 많지만 이번 글을 마지막으로 마무리지으려 합니다.
1. 오늘의 진행내용
-추가된 모듈을 따로 없으며 game.py 와 game.py파일의 수정이 있었습니다.
-갱도2로 들어갈 수 없는 문제가 있어서 수정해주었습니다.
-갱도2의 탐험진행을 위한 함수는 따로 만들지 않았고 갱도2일 때 random을 이용하여 몬스터를 더 강하게 하는 옵션을 추가했습니다.
-위 함수에서 갱도1과 갱도2를 구분하기 위해 monster코드에 매개변수를 추가했습니다.
-갱도 1과 갱도 2의 차이가 크지 않아 갱도 2를 탐험할 목적을 만들었습니다. (갱도 2 탐험 시 스코어 증가.)
-스토리와 메뉴 텍스트의 원활한 전개를 위해 몇몇 함수에 time.sleep() 과 os.system("cls")의 추가 및 삭제가 있었습니다.
-게임종료 코드가 추가되었습니다.
자세한 내용은 아래 코드 참고하시면서 오늘도 화이팅 하시기 바랍니다!
2. 소스코드
game.py
import time
import os
import random
from explore import *
def start():
print("""
▓▓▒▒▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓
░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒▒▒░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░
░░▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒
░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒░░░░▒▒░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒
▒▒▓▓▓▓▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒░░ ░░▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓
░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░ ░░▒▒▒▒░░░░░░░░░░▒▒░░░░
▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓▒▒░░ ░░░░▒▒░░▒▒▒▒▒▒▒▒▓▓▒▒▒▒
▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒░░░░ ░░░░▒▒▒▒▒▒▒▒▒▒▓▓░░▒▒
▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓░░░░ ░░▒▒▓▓▓▓▓▓▓▓▒▒▓▓
░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░▒▒░░ ░░▒▒▒▒░░░░░░░░░░
░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒░░ ░░▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒
░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒░░░░░░░░▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒
▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓
░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░░░░░░░░░▒▒░░████████████░░░░░░░░▒▒░░░░
▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▒▒░░▒▒▓▓▓▓██▓▓▒▒▒▒▒▒▒▒▒▒▓▓░░▒▒
▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▓▓░░░░░░▒▒▒▒▓▓░░▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓██▒▒▓▓▒▒▒▒▒▒▓▓░░▒▒
▒▒▒▒▓▓▒▒▒▒▒▒▒▒▒▒▓▓▒▒░░▒▒▒▒▒▒▓▓▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓████▓▓▓▓▒▒▒▒▒▒▓▓▒▒▒▒
▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒░░░░░░▒▒░░▒▒░░░░░░░░░░░░▒▒▒▒▓▓▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒░░▒▒
""")
print("광산이 무너지면서 완전히 고립된 것 같다..")
time.sleep(2)
print("1시간이 다 되도록 입구 벽을 두드려봤지만 아무 반응도 없는걸 봐선,,")
time.sleep(2)
print("여기에 아무도 없다고 생각하나..?")
time.sleep(2)
print("아무래도 당분간 버텨야겠는데,,")
time.sleep(2)
print("일단 뭘 해야하지..?")
time.sleep(2)
print("듣기로는 2번 갱도부터는 아직 공사가 끝나지 않았다고 하던데,,")
time.sleep(2)
def choice(scene, status=0):
while(True):
if scene == "start":
cmd = input("무엇을 할까? 1.쉰다 2.탐험한다. 3.상태 \n>>")
if cmd == '1' or cmd == '2' or cmd == '3':
return cmd
else:
print("잘못 입력했다. 숫자를 입력하고 Enter")
time.sleep(1.5)
os.system("cls")
elif scene == "explore":
cmd = input("어디로 갈까? 1.갱도1 2.갱도2 \n>>")
if cmd == "2" and status < 15:
print("2번 갱도문이 잠겨있다. 아직은 갈 수 없을 것 같다.")
time.sleep(2)
continue
elif cmd == "2" and status >= 15:
print("열쇠로 갱도문을 열었다.")
time.sleep(1)
return cmd
elif cmd == '1' or cmd == '2' or cmd == '3':
return cmd
else:
print("잘못 입력했다. 숫자를 입력하고 Enter")
time.sleep(1.5)
os.system("cls")
def explore(status = 0,score = 10):
command = choice("explore",status)
if command == '1':
percent = random.randrange(1,11)
if percent>7:
monster(1)
elif percent > 6:
grow()
else:
success()
elif command == "2":
percent = random.randrange(1,11)
if percent>6:
monster(2)
elif percent > 2:
grow()
else:
success()
score += 1
def run():
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
score = 0 #갱도2를 탐험한 횟수
while True:
command = choice("start")
print(command)
if command == '1':
tired -=2
if tired <0:
tired = 0
turn += 1
print("몸이 좀 가벼워진 것 같다.")
time.sleep(1)
os.system("cls")
elif command == '2':
if tired > 10:
turn +=3
print("너무 지친다,, 잠시 쉬어야 할 것 같아...")
time.sleep(2)
print("힘듦 수치가 10을 넘으면 플레이어가 쓰러진 상태로 3일이 지나갑니다.")
time.sleep(2)
os.system("cls")
tired -=3
else:
tired += 1
turn += 1
os.system("cls")
explore(status, score)
status += 1
if status == 15:
print("열쇠를 찾았다. 2번 갱도문 열쇠같은데,,")
elif command == '3':
os.system('cls')
print(f"동굴에 들어온 지 {turn}일, 힘듦 수치: {tired}")
if turn > 30:
total = status*2 + score*4
os.system('cls')
time.sleep(2)
print("...")
time.sleep(1)
print("...")
time.sleep(2)
print(f"동굴에 들어온 지 {turn}일이 되는 날이다.. 드디어 입구에서 빛이 들어온다,,")
time.sleep(4)
print(f"생존에 성공하셨습니다!\n")
time.sleep(1)
print(f"탐험횟수 : {status}")
time.sleep(1)
print(f"2번갱도 탐험 횟수 : {score}")
time.sleep(1)
print(f"종합 플레이 점수 : ", total)
time.sleep(1)
if status <3:
print("\n한 줄 평 : 너무 안전하게 하신건 아닌가요?? :( ")
time.sleep(3)
print("게임이 종료됩니다. 플레이 해주셔서 감사합니다.")
time.sleep(3)
break
if __name__ == "__main__":
run()
explore.py
import time
import os
import random
hp = 10
attack = 4
var = 0
def monster(level):
global hp, attack, var
hp = 10 + var
attack = 4 + var * 0.6
monster_hp = random.randrange(6,int(12+var*0.5))
monster_attack = random.randrange(2,int(6+var*0.5))
if level == 2:
monster_hp += random.randrange(1,var)
monster_attack += random.randrange(1,var)
print("갱도의 몬스터를 만났다 무엇을 할까?")
while True:
command = input("1.도망친다 2.공격한다 3.막는다 >>")
if command =='1':
if random.randrange(0,3) == 1:
print("무사히 도망쳤다.")
time.sleep(1)
os.system("cls")
return
else:
print(f"{monster_attack}데미지를 입었다,,")
if hp < 0:
print("게임오버,, 몬스터에게 당하셨습니다..")
time.sleep(2)
print("게임이 종료됩니다.. 감사합니다.")
time.sleep(3)
exit(1)
time.sleep(1)
elif command == '2':
monster_hp -= attack
print(f"{attack}데미지를 주었다,,")
time.sleep(1)
if monster_hp <= 0:
print("몬스터를 처치했다.")
time.sleep(1)
print("조금 강해졌디.")
var += random.randrange(1,3)
time.sleep(2)
os.system("cls")
return
hp -= monster_attack
print(f"{monster_attack}데미지를 입었다,,")
if hp < 0:
print("게임오버,, 몬스터에게 당하셨습니다..")
time.sleep(2)
print("게임이 종료됩니다.. 감사합니다.")
time.sleep(3)
exit()
time.sleep(1)
elif command == '3':
print("공격을 막았다.. 체력이 조금 회복된 것 같다.")
hp += 2
time.sleep(1)
else:
print("숫자 입력후, Enter키를 눌러주세요.")
def grow():
global var
temp = random.randrange(2,7)
var += temp
print(f"열심히 탐험을 했더니 한층 강해진 것 같다. 증가략 : 체력{temp}+, 공격력{temp*0.7}+")
time.sleep(2)
os.system("cls")
def success():
print("탐험을 성공적으로 마쳤다.")
time.sleep(1)
os.system("cls")
3. 코드설명
먼저 game.py 파일부터 설명하겠습니다.
explore(status = 0, score = 0)
우선 매개변수로 score가 생겼습니다. score변수는 아래에서 설명하겠습니다.
def explore(status = 0,score = 0):
command = choice("explore",status)
if command == '1':
percent = random.randrange(1,11)
if percent>7:
monster(1)
elif percent > 6:
grow()
else:
success()
elif command == "2":
percent = random.randrange(1,11)
if percent>6:
monster(2)
elif percent > 2:
grow()
else:
success()
score += 1
우선 이전에 만들었던 갱도2에 접근하는 방법이었던 status변수를 choice(scene, status = 0)함수 에 넘기지 않아 갱도2를 탐험하지 못하는 문제가 있었습니다.
#기존 command 입력 시 choice함수
command = choice("explore")
#수정 후 command 입력 시 choice함수
command = choice("explore",status)
기존에 갱도1만 코딩을 하면서 갱도 2를 갈 일이 없다보니 choice의 status 기본값을 0으로 해주어서 모험을 아무리 많이 해도 갱도를 선택할 때의 status값이 계속 0으로 되는 문제였습니다. 이전에 찾았어야 하는데 오류로 혼란드려 죄송합니다,,
elif command == "2":
percent = random.randrange(1,11)
if percent>6:
monster(2)
elif percent > 2:
grow()
else:
success()
score += 1
2번 선택지(2번 갱도)를 입력했을 때 몬스터를 만나고 성장하는 확률을 높였습니다. 또한 갱도 2를 탐험하는 목적이 생기도록 갱도2를 클리어하는 경우 score가 높아집니다. score는 게임 클리어시 점수 계산시 큰 비중을 차지하도록 되어 있습니다.
run()
def run():
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
score = 0 #갱도2를 탐험한 횟수
while True:
command = choice("start")
print(command)
if command == '1':
tired -=2
if tired <0:
tired = 0
turn += 1
print("몸이 좀 가벼워진 것 같다.")
time.sleep(1)
os.system("cls")
elif command == '2':
if tired > 10:
turn +=3
print("너무 지친다,, 잠시 쉬어야 할 것 같아...")
time.sleep(2)
print("힘듦 수치가 10을 넘으면 플레이어가 쓰러진 상태로 3일이 지나갑니다.")
time.sleep(2)
os.system("cls")
tired -=3
else:
tired += 1
turn += 1
os.system("cls")
explore(status, score)
status += 1
if status == 15:
print("열쇠를 찾았다. 2번 갱도문 열쇠같은데,,")
elif command == '3':
os.system('cls')
print(f"동굴에 들어온 지 {turn}일, 힘듦 수치: {tired}")
if turn > 30:
total = status*2 + score*4
os.system('cls')
time.sleep(2)
print("...")
time.sleep(1)
print("...")
time.sleep(2)
print(f"동굴에 들어온 지 {turn}일이 되는 날이다.. 드디어 입구에서 빛이 들어온다,,")
time.sleep(4)
print(f"생존에 성공하셨습니다!\n")
time.sleep(1)
print(f"탐험횟수 : {status}")
time.sleep(1)
print(f"2번갱도 탐험 횟수 : {score}")
time.sleep(1)
print(f"종합 플레이 점수 : ", total)
time.sleep(1)
if status <3:
print("\n한 줄 평 : 너무 안전하게 하신건 아닌가요?? :( ")
time.sleep(3)
print("게임이 종료됩니다. 플레이 해주셔서 감사합니다.")
time.sleep(3)
break
이번에 설명할 함수는 run()입니다.
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
score = 0 #갱도2를 탐험한 횟수
우선 위에서 말씀드린 바와 같이 선언된 변수들을 보면 score변수가 추가되었습니다.
이번에 큰 변화는 이 함수에 게임 종료 코드를 포함했다는 점인데요,
if turn > 30:
total = status*2 + score*4
os.system('cls')
time.sleep(2)
print("...")
time.sleep(1)
print("...")
time.sleep(2)
print(f"동굴에 들어온 지 {turn}일이 되는 날이다.. 드디어 입구에서 빛이 들어온다,,")
time.sleep(4)
print(f"생존에 성공하셨습니다!\n")
time.sleep(1)
print(f"탐험횟수 : {status}")
time.sleep(1)
print(f"2번갱도 탐험 횟수 : {score}")
time.sleep(1)
print(f"종합 플레이 점수 : ", total)
time.sleep(1)
if status <3:
print("\n한 줄 평 : 너무 안전하게 하신건 아닌가요?? :( ")
time.sleep(3)
print("게임이 종료됩니다. 플레이 해주셔서 감사합니다.")
time.sleep(3)
break
30턴이 되었다면 그 다음턴인 31턴에 입구가 열리며 탈출하게 됩니다. 동시에 총 탐험횟수와 갱도2 탐험횟수가 뜨며 종합점수가 나오게 됩니다. 점수 계산방법은 (총 탐험 횟수 * 2) + (갱도2 탐험 횟수 * 4) 입니다.
#함수 내 점수 계산 부분
if turn > 30:
total = status*2 + score*4
print(f"동굴에 들어온 지 {turn}일이 되는 날이다.. 드디어 입구에서 빛이 들어온다,,")
time.sleep(4)
print(f"생존에 성공하셨습니다!\n")
time.sleep(1)
print(f"탐험횟수 : {status}")
time.sleep(1)
print(f"2번갱도 탐험 횟수 : {score}")
time.sleep(1)
print(f"종합 플레이 점수 : ", total)
time.sleep(1)
게임 클리어 코드에서 print문은 대부분 f포매팅을 이용하여 출력하였습니다.
문자열포매팅 방법은 f" 를 이용한 방법, %서식을 이용한 방법, .format을 이용한 방법 총 세개 입니다!
if status <3:
print("\n한 줄 평 : 너무 안전하게 하신건 아닌가요?? :( ")
time.sleep(3)
마지막으로 여러 조건에 맞춰서 플레이어에게 소소한 즐거움을 주도록 게임클리어 종류에 따라 여러 메세지를 주려고 했습니다. (현재는 1개지만 추가해보시면 좋을 것 같습니다.)
게임 클리어 종류로 생각해본 것은 탐험없이 클리어, 탐험을 너무 적게 한 경우, 점수가 N점 이상, 파일 입출력을 이용한 최고점수 갱신,,,등등
다음으로 explore.py입니다.
monster(level)
monster_hp = random.randrange(6,int(12+var*0.5))
monster_attack = random.randrange(2,int(6+var*0.5))
if level == 2:
monster_hp += random.randrange(1,var)
monster_attack += random.randrange(1,int(var*0.8))
우선 random의 경우 범위가 int였어야 하는데 var*0.5를 하면서 정수가 아니게 되는 문제가 있어 int()로 감싸주어 문제를 해결했습니다.
매개변수로 받는 level은 갱도 번호를 나타냅니다. 갱도가 1, 2밖에 없기 때문에 level이 2인 경우,, 즉 갱도가 2인 경우 기존에 설정된 몬스터의 hp(체력)와 attack(공격력)을 한 번더 강하게 만드는 방식으로 작성했습니다.
if monster_hp <= 0:
print("몬스터를 처치했다.")
time.sleep(1)
print("조금 강해졌디.")
var += random.randrange(1,3)
time.sleep(2)
os.system("cls")
return
그리고 몬스터를 처치했을 때에도 강해지는 것이 좋을 것 같아 처치 시에도 랜덤으로 var를 증가시킴으로써 플레이어가 강해지도록 해주었습니다.
grow() , success()
def grow():
global var
temp = random.randrange(2,7)
var += temp
print(f"열심히 탐험을 했더니 한층 강해진 것 같다. 증가략 : 체력{temp}+, 공격력{temp*0.7}+")
time.sleep(2)
os.system("cls")
def success():
print("탐험을 성공적으로 마쳤다.")
time.sleep(1)
os.system("cls")
grow() 와 success() 의 경우 큰 변화보다는 출력되었을 때의 모습의 변화가 있어 동시에 설명하겠습니다. 탐험을 마친 뒤 바로 "무엇을 할까?" 텍스트가 출력되는 점이 깔끔하지 않은 것 같아 탐험을 맟치고 time.sleep(1) / 1초 뒤, 화면을 지우는 코드를 추가해주었습니다.
-
4. 정리 및 참고사이트
이로써 하나의 작은 게임이 완성되었습니다. class를 사용하지 않은 만큼 굳이? 스러운 부분도 있고 제작 자체가 빠르게 진행되었던 것 같습니다. 게임을 좋아하는 분들이라면 이제 막 파이썬에 입문하시면서 가볍게 도전해보시면 좋을 것 같습니다.
아래 접은 글에 관련 글들 첨부하며 파이썬, 도트아트를 이용하여 만든 TextRPG였습니다. 감사합니다.
2023.01.02 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기#0 | GUI 없이 만드는 게임 계획
2023.01.02 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기#1 | 게임 로고 및 메뉴
2023.01.04 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기#2 | 모듈 나누기, 튜토리얼, 스토리
2023.01.15 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기 #3 | 게임 변수 선언, 스토리 진행
2023.01.18 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기 #4 | 탐험 진행 모듈, 튜토리얼, 스토리
https://github.com/junstory/textRPG
위 링크를 통해 포스팅을 하며 진행된 코드를 확인하실 수 있습니다. (깃허브)
'[파이썬]Python > TextRPG게임' 카테고리의 다른 글
[파이썬] TextRPG 게임 만들기 #4 | 탐험 진행 모듈, 튜토리얼, 스토리 (0) | 2023.01.18 |
---|---|
[파이썬] TextRPG 게임 만들기 #3 | 게임 변수 선언, 스토리 진행 (0) | 2023.01.15 |
[파이썬] TextRPG 게임 만들기#2 | 모듈 나누기, 튜토리얼, 스토리 (3) | 2023.01.04 |
[파이썬] TextRPG 게임 만들기#1 | 게임 로고 및 메뉴 (0) | 2023.01.02 |
[파이썬] TextRPG 게임 만들기#0 | GUI 없이 만드는 게임 계획 (0) | 2023.01.02 |