목차 (원하는 부분을 클릭하시면 바로 이동하실 수 있습니다~)
1. 변경사항
2. 탐험진행을 위한 모듈생성(explore.py 코드설명)
3. 코드 및 설명
4. 정리 및 참고사이트
파이썬으로 텍스트기반 간단한 RPG게임 만들기 4번째 글입니다. 모든 내용이 궁금하신 분들은 아래 글 참고해주세요!
2023.01.02 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기#0 | GUI 없이 만드는 게임 계획
2023.01.02 - [[파이썬]Python/TextRPG게임] - [파이썬] TextRPG 게임 만들기#1 | 게임 로고 및 메뉴
1. 변경사항
시작에 앞서 자잘자잘한 변경사항들을 먼저 알려드리려 합니다.
game.py - run()
def run():
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
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)
status += 1
if status == 16:
print("열쇠를 찾았다. 2번 갱도문 열쇠같은데,,")
elif command == '3':
os.system('cls')
print(f"동굴에 들어온 지 {turn}일, 힘듦 수치: {tired}")
run()함수에서 command가 2일 때, 지친 정도가 10초과가 아닌 상황(탐험이 가능한 상황)에서 턴(동굴에 들어온 일 수)이 증가하는 코드가 없어 추가해주었습니다.
기존에는 explore(status) 다음에도 os.system("cls")으로 화면을 지워주는 코드가 있었으나 탐험간의 텍스트들을 읽기도 전에 지워지는 경우가 생겨 해당 코드를 지워주었습니다.
2. 탐험진행을 위한 모듈생성(explore.py 코드 설명)
game.py의 run()함수를 보시면 explore()함수를 통해 탐험을 진행합니다. 탐험부분을 구현하는데 코드가 혹여나 길어질 수 있어, explore.py 모듈을 만들어 주었습니다. 탐험의 모든 것을 담당하는 모듈이라기 보다는 탐험중 발생하는 상황들(몬스터 만남, 탐험의 결과 성장, 탐험 성공 등,,)에 맞는 함수들을 담았습니다.
3. 코드 및 설명 의 game.py를 만들며 추가된 함수들이기 때문에 확인 후 아래 내용을 읽으셔도 좋을 것 같습니다.
explore.py
import time
import os
import random
hp = 10
attack = 4
var = 0
def monster():
global hp, attack
hp = 10 + var
attack = 4 + var * 0.6
monster_hp = random.randrange(6,12+var*0.5)
monster_attack = random.randrange(2,6+var*0.5)
print("갱도의 몬스터를 만났다 무엇을 할까?")
while True:
command = input("1.도망친다 2.공격한다 3.막는다 >>")
if command =='1':
if random.randrange(0,3) == 1:
print("무사히 도망쳤다.")
return
elif command == '2':
monster_hp -= attack
print(f"{attack}데미지를 주었다,,")
time.sleep(1)
if monster_hp <= 0:
print("몬스터를 처치했다.")
time.sleep(1)
return
hp -= monster_attack
print(f"{monster_attack}데미지를 입었다,,")
if hp < 0:
print("게임오버,, 몬스터에게 당하셨습니다..")
time.sleep(2)
exit(1)
time.sleep(1)
elif command == '3':
print("공격을 막았다.. 체력이 조금 회복된 것 같다.")
hp += 2
time.sleep(1)
else:
print("숫자 입력후, Enter키를 눌러주세요.")
def grow():
global var
print(f"열심히 탐험을 했더니 한층 강해진 것 같다. 체력{var}+, 공격력{var*0.7}+")
var += random.randrange(1,3)
def success():
print("탐험을 성공적으로 마쳤다.")
각 변수 및 함수 설명입니다.
변수
hp = 10
attack = 4
var = 0
몬스터를 만났을 때마다 체력은 모두 회복된 상태로 전투한다고 가정하기 위해 체력과 공격력을 고정으로 만들어 두었습니다. class를 이용하지 않고 게임을 만들 목적이기 때문에 플레이어 class의 멤버변수를 사용하지 않아 조금 번거롭게 구현이 되는 부분이 있을 수 있습니다.
var 변수는 플레이어의 성장에 따라 체력과 공격력을 늘려주기 위해 만들어주었습니다.
monster()
def monster():
global hp, attack, var
hp = 10 + var
attack = 4 + var * 0.6
monster_hp = random.randrange(6,12+var*0.5)
monster_attack = random.randrange(2,6+var*0.5)
print("갱도의 몬스터를 만났다 무엇을 할까?")
while True:
command = input("1.도망친다 2.공격한다 3.막는다 >>")
if command =='1':
if random.randrange(0,3) == 1:
print("무사히 도망쳤다.")
return
else:
print(f"{monster_attack}데미지를 입었다,,")
if hp < 0:
print("게임오버,, 몬스터에게 당하셨습니다..")
time.sleep(2)
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)
return
hp -= monster_attack
print(f"{monster_attack}데미지를 입었다,,")
if hp < 0:
print("게임오버,, 몬스터에게 당하셨습니다..")
time.sleep(2)
exit(1)
time.sleep(1)
elif command == '3':
print("공격을 막았다.. 체력이 조금 회복된 것 같다.")
hp += 2
time.sleep(1)
else:
print("숫자 입력후, Enter키를 눌러주세요.")
플레이어가 강해짐에 따라 몬스터도 강해질 수 있도록 var를 이용했고 특히 몬스터의 스탯을 예측할 수 없도록 random을 이용해주었습니다. 운이 나쁘면 어쩔 수 없이 게임오버가 될 수도 있겠죠?
command가 1이면 33% 확률로 도망칠 수 있도록 했습니다. 실패 시 몬스터에게 데미지를 입습니다.
command가 2면 몬스터에게 데미지를 주고 데미지를 입습니다. 데미지를 준 순간에 몬스터가 죽었다면 처지했다는 말과 함께 함수가 끝나게 됩니다. 마찬가지로 데미지를 입은 순간에 hp가 0 이하라면 게임오버되며, 게임오버 시 프로그램이 종료됩니다.
command가 3이면 방어를 하며 체력이 2증가합니다. 방어만 계속하면 언젠가는 몬스터를 잡을 수 밖에 없게 되지만 이것도 하나의 게임 진행방식으로 인정하고 넘어가려 합니다.
grow()
def grow():
global var
print(f"열심히 탐험을 했더니 한층 강해진 것 같다. 증가량: 체력{var}+, 공격력{var*0.7}+")
var += random.randrange(1,3)
f문자열 포매팅을 사용하여 print문을 사용해주었습니다. 랜덤으로 1에서 2만큼 체력이 오르고 그 수치의 0.7배 만큼 공격력이 오릅니다. 랜덤 값은 밸런스를 맞춰가며 조절할 예정입니다.
success()
def success():
print("탐험을 성공적으로 마쳤다.")
탐험 성공시 성공 메세지를 띄우며 종료됩니다. 확률적으로 다른 이벤트를 발생기킬지 여부는 고민중에 있습니다.
3. 코드 및 설명
explore.py의 모듈의 코드들 설명이 이번 글에서 많은 비중을 차지할 것으로 생각되는데, 각 함수들이 어디에서 쓰이는 지 적어보겠습니다.
game.py
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):
command = choice("explore")
if command == '1':
percent = random.randrange(1,11)
if percent>7:
monster()
elif percent > 6:
grow()
else:
success()
def run():
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
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)
status += 1
if status == 16:
print("열쇠를 찾았다. 2번 갱도문 열쇠같은데,,")
elif command == '3':
os.system('cls')
print(f"동굴에 들어온 지 {turn}일, 힘듦 수치: {tired}")
이전과 달라진 부분들을 함수별로 설명하겠습니다.
run()
def run():
status = 0 #갱도나 다른 장소에 들어갈 수 있는 지 없는 지 판단을 위한 변수
turn = 0 #지나간 일 수
tired = 0 #힘듦 수치
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)
status += 1
if status == 16:
print("열쇠를 찾았다. 2번 갱도문 열쇠같은데,,")
elif command == '3':
os.system('cls')
print(f"동굴에 들어온 지 {turn}일, 힘듦 수치: {tired}")
run() 함수에 status 변수를 추가했습니다. 이전에는 갱도에 갈 수 있는 지 없는 지 확인하는 용도였으나 탐험을 얼마나 완료했는지를 나타내도록 탐험시 1씩 더해지도록 만들었습니다. 16회가 되면 열쇠를 찾게 되고 status가 16이상이 되면 choice() 함수에서 탐험-2번 갱도를 선택해도 이동할 수 있게 됩니다.
choice(scene, status=0)
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")
바로 위에서 설명드린 것 처럼 scene이 "explore"이고 2번을 선택했을 때 status가 16이상이라면 2번 갱도를 탐험하게 됩니다.
explore(status = 0)
def explore(status = 0):
command = choice("explore")
if command == '1':
percent = random.randrange(1,11)
if percent>7:
monster()
elif percent > 6:
grow()
else:
success()
random을 이용하여 30%확률로 몬스터를, 10%확률로 성장을, 그리고 60%확률로 탐험 성공을 하게 됩니다.
각 경우에 대한 함수들은 explore.py 모듈에 있으니 혹시 내용이 기억안나시면 다시 확인해보시면 좋을 것 같습니다.
2. 탐험진행을 위한 모듈생성(explore.py 코드설명)
4. 정리 및 참고사이트
게임을 진행하면서 계속 쉬기만 해도 30턴을 보낼 수 있고 탐험을 하며 턴을 보낼 수도 있습니다. 각 경우에 따른 엔딩들을 나누어야 할 것 같습니다. 이번 글에서는 탐험진행을 할 수 있도록 스토리를 진행시켰습니다. 틀이 있다보니 사실상 2번 갱도는 1번 갱도와 거의 비슷하되 난이도가 조금 다를 것으로 예상됩니다. 이 글을 보시고 각자의 아이디어에 맞게 게임을 진행해 나가시면 좋겠습니다.
- https://github.com/junstory/textRPG - TextRPG 코드 업로드 깃허브
위 링크에서 업로드되는 코드들 및 히스토리를 확인 하실 수 있습니다.
'[파이썬]Python > TextRPG게임' 카테고리의 다른 글
[파이썬] TextRPG 게임 만들기 #5.fin | 게임 엔딩, 몬스터 전투, 마무리 (0) | 2023.02.02 |
---|---|
[파이썬] 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 |