반응형
목차 (원하는 부분을 클릭하시면 바로 이동하실 수 있습니다~)
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점 이상, 파일 입출력을 이용한 최고점수 갱신,,,등등

휴식만 취하며 30일을 보낸 경우 게임엔딩

 

 

다음으로 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였습니다. 감사합니다.

 

https://github.com/junstory/textRPG

 

GitHub - junstory/textRPG: TextRPG by Python with basic syntax.

TextRPG by Python with basic syntax. Contribute to junstory/textRPG development by creating an account on GitHub.

github.com

위 링크를 통해 포스팅을 하며 진행된 코드를 확인하실 수 있습니다. (깃허브)

반응형
Dvlp.Jun