ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬/Python] 텍스트 RPG(1): 이름, 기본 스텟
    깜빡의 취미/파이썬을 합니다. 2021. 9. 19. 11:30
    728x90

    # 벼르고 별러서 가지고 왔습니다. 지난 7월부터 8월 중순까지 함께 파이썬 공부를 한 친구와 함께 텍스트 RPG를 만들었습니다.

    # 열심히 탐구해서 적어 두었던 코드들을 조금씩 소개해드리는 방식으로 갈까 합니다 (친구 허락도 받았답니다~). 

    반응형

    이 글을 언제 완료할 수 있을지는 모르겠지만... 아마 완료될 때 즈음에는 가장 기초적인 형태의 턴제 RPG를 만들어볼 수 있을 것이다. 물론 가장 기초적인 형태라 실제 그래픽 구현 등은 거의 되어 있지 않다. 그래도 파이썬으로 무언가 해보고 싶은데 무엇부터 해야할지 모르겠어 막막한 초심자라면, 한 번쯤 도전해볼 만하다.

     

    모든 모험의 출발은 플레이어의 이름과 스텟을 정하는 것이니, 우선 이번 시간에는 산뜻하게, 이름 설정 및 초기 스테이터스 분배에 대해 간단히 소개해보고자 한다.

     

    #이름

    print("당신의 이름을 선택하세요.")
    나 = input()

    간단하다. input 함수를 이용한다. 이 때 출력값을 이후에 활용할 수 있도록 와 같이 기억하기 쉬운 단어로 이름을 지정해주는 것이 좋다. 아래의 예시를 통해 좀 더 이해해볼 수 있다.

     

    print(f"{나}는 말하기 전에 행동해야 했다. 그래야 살 수 있었으니까.")

    문자열 포맷팅 기법을 이용하면, 앞서 input함수를 이용해 설정한 이름을 실제 문장에 적용할 수 있다. 즉 위와 아래 코딩을 합치면 이런 것이 가능하다.

    # 추가로 문장을 출력할 때 print함수 대신 input함수를 이용하면, 문장이 바로 출력되지 않으며, 엔터키 등을 쳤을 때 출력된다.

     

    #능력치 정리해두기

    이번에는 본격적으로 전투 등을 구상하기 전에, 기초 스텟을 설정하는 법을 확인하겠다. 우선 요소들을 직접 설정해 주어야 한다.

    [기본] # 전투 시 실제로 적용되는 요소들
    기초체력 = 75
    방어력 = 0
    공격력 = 0
    
    [스텟] # 전투력: 공격력, 체력 상승 / 정신력: 방어력, 스킬 강해짐 / 운: 도주 확률 증가
    전투력 = 0
    정신력 = 0
    운 = 0
    
    [부가요소] # 기: 스킬을 위해 필요 / 도주: 보스를 위한 숨겨진 요소  
    기 = 0
    도주 = 0

    [기본]은 전투가 일어났을 때 실제로 작동하는 요소다. 여기에 꼭 써주지 않아도 좋지만, 그래도 이해를 돕기 위해 정리 차원에서 적어 보았다. 이후 길게 코딩하며 구분할 자신만 있다면, 처음에 필자가 했던 것처럼 hp, d, r과 같은 방식으로 이름을 지어주어도 좋다.

     

    사실 [스텟]이 우리가 흔히 생각하는 스테이터스다. 스텟이 오르면 기초체력, 방어력, 공격력이 영향을 받아 오르게 된다. 

    # '#' 기호를 이용하면 코딩에 직접 추가하지 않고 일종의 주(?)를 달 수 있다. 이후 코딩 과정에서 헷갈리지 않게 미리 설명을 적어 두자.

     

    마지막으로 [부가요소]같은 경우 이후의 이벤트를 위한 요소다. 의 경우 스킬 발동에 필요한 턴 수를 지정하기 위해 미리 설정했다(드래곤볼 게임...의 '기~'를 상상하면 된다). 도주의 경우 이벤트를 위한 준비다. 운이 높으면 전투에서 달아날 수 있는데, 그 경우 도주가 붙어 이후 플레이에 영향을 주게 된다.

     

    # 본격적인 능력치 분배

    모든 설정이 끝났으니 게임을 시작하며 주사위를 굴려 보자. 매번 똑같은 능력치로 게임을 시작하는 건 재미 없으니!

    # 식이 작동하기 위해서는 import random을 맨 위에 써 주어야 한다. random 라이브러리는 내장되어 있긴 하지만, import를 이용해 불러주어야 작동한다. random 함수를 적용하기 전에만 입력하면 되는 식이라, 아예 코딩 시작 부분(!줄)에 적어두는 게 편하다.

    while 1:
        전투력 = random.randrange(5, 11)
        체력 = 기초체력 + 전투력*1
        공격력 = 전투력
        정신력 = random.randrange(1, 6)
        운 = random.randrange(1, 6)
        print(f"전투력 = {전투력}, 국방력= {정신력}, 열외력={운}")
        print("다시 하겠습니까: a = 네, b = 아니오")
        A = input()
        if A == "a":
            continue
        if A == "b":
            print("\n정말 결정하셨습까?: a = 네, b = 아니오")
            B = input()
            if B == "b":
                continue
            elif B == "a":
                print("\n결정되었습니다.")
                print(f"""
            [스테이터스]
            이름 = {나}
            직업 = 훈련병
            체력=  {체력}
            전투력 = {전투력}
            국방력 = {정신력}
            열외력 = {운}""")
                break

    우선 여러 번 랜덤 스텟 설정을 가능하게끔 만들어주는 것이 좋을 것 같아 while문을 사용했다. 이제 while문 속의 각 줄을 좀 더 세부적으로 살펴보자.

     

    while 1:

        전투력 = random.randrange(5, 11)
        체력 = 기초체력 + 전투력*1
        공격력 = 전투력
        정신력 = random.randrange(1, 6)
        운 = random.randrange(1, 6)

    random.randrange(a,b)는 a이상 b미만의 수를 랜덤으로(!) 출력한다. 체력 공격력은 전투력에 의해 두 요소가 영향을 받는다는 점을 강조하기 위해 넣었다.

     

        print(f"전투력 = {전투력}, 국방력= {정신력}, 열외력={운}")

    위에서 결정된 스텟값을 보여주는 줄이다. 설명을 위해 모든 세부설정을 변경해 두었지만, 슬쩍 원래 설정의 일부를 가져왔다. 원래 게임은 전역을 위해 분투하는 군인의 이야기를 담았고, 그래서 국방력과 열외력이라는 요소를 이용하여 게임을 설명하고자 했다.

     

        print("다시 하겠습니까: a = 네, b = 아니오")

        A = input()

    당연하게도 처음에 나온 랜덤값이 마음에 들지 않을 수 있으니 다시 할 수 있는 기회를 준다. 여기서 주의할 점. int(input()) 함수를 이용하면 식의 a,b를 1,2로 바꿀 수 있다. 그러나 이 경우 엔터키를 잘못 쳤을 때 오류가 발생한다는 문제점이 있다. input 함수만을 이용하면 엔터키 또한 하나의 선택으로 받아들여 오류가 발생하지 않는다 (대신 continue 함수가 쓰인 것마냥 while문 처음으로 돌아간다)


        if A == "a":
            continue

    a를 누르면 continue함수를 이용해 while문의 처음, 즉 스텟을 설정하는 줄로 돌아간다.


        if A == "b":
            print("\n정말 결정하셨습까?: a = 네, b = 아니오")
            B = input()

    혹시 잘못 눌렀을 경우를 위해 친절하게 만들어둔 정말 결정하셨습니까?이다. 오타가 났었는데 재미있어보여서(???) 가져왔다. 참고로 여기서 엔터키를 잘못 눌렀을 경우, 마찬가지로 아예 while문 처음으로 올라가버린다.


            if B == "b":
                continue

            elif B == "a":
                print("\n결정되었습니다.")

    최종적으로 결정을 마치면, 결정이 완료된다. 이 때 \n은 이스케이프 코드로, 줄바꿈을 의미한다. 

     

                print(f"""
            [스테이터스]
            이름 = {나}
            직업 = 훈련병
            체력=  {체력}
            전투력 = {전투력}
            국방력 = {정신력}
            열외력 = {운}""")
                break

    복잡한 모양새를 하고 있지만 사실 여러 줄 print 함수를 이용하고 싶지 않아 삼 연속 따옴표(""")를 이용했다. 앞서 이미 설명했지만, 문자열 포맷팅으로 따옴표 앞에 f를 입력한 뒤 문장 밖의 값을 가져오고 싶은 곳에 중괄호({})를 이용하면 성공적으로 앞서 설정한 값이 반영되는 것을 확인할 수 있다.

    # 삼 연속 따옴표에 대해 궁금하다면 아래의 링크를!

     

    [파이썬/Python] 백준 10718번(We love kriii) - 단계별로 풀어보기

    문제는 아래와 같다 10718번: We love kriii ACM-ICPC 인터넷 예선, Regional, 그리고 World Finals까지 이미 2회씩 진출해버린 kriii는 미련을 버리지 못하고 왠지 모르게 올해에도 파주 World Finals 준비..

    ccamppak.tistory.com

     

    이렇게 조금은 복잡한 식이 완성되었다. 여기까지 오면 이런 결과물이 만들어진다.

    import random
    print("당신의 이름을 선택하세요.")
    나 = input()
    # 전투 시 실제로 적용되는 요소들
    기초체력 = 75
    방어력 = 0
    공격력 = 0
    # 전투력: 공격력, 체력 상승 / 정신력: 방어력, 스킬 강해짐 / 운: 도주 확률 증가
    전투력 = 0
    정신력 = 0
    운 = 0
    
    # 기: 스킬을 위해 필요 / 도주: 보스를 위한 숨겨진 요소
    기 = 0
    도주 = 0
    
    while 1:
        전투력 = random.randrange(5, 11)
        체력 = 기초체력 + 전투력*1
        공격력 = 전투력
        정신력 = random.randrange(1, 6)
        운 = random.randrange(1, 6)
        print(f"전투력 = {전투력}, 국방력= {정신력}, 열외력={운}")
        print("다시 하겠습니까: a = 네, b = 아니오")
        A = input()
        if A == "a":
            continue
        if A == "b":
            print("\n정말 결정하셨습까?: a = 네, b = 아니오")
            B = input()
            if B == "b":
                continue
            elif B == "a":
                print("\n결정되었습니다.")
                print(f"""
            [스테이터스]
            이름 = {나}
            직업 = 훈련병
            체력=  {체력}
            전투력 = {전투력}
            국방력 = {정신력}
            열외력 = {운}""")
                break

    정말 마지막으로, 실제 작동 사진을 보여드리며 마무리하고자 한다.

    저 포함 두 명이서 식을 짜고 고민하면서 알아낸 사실들, 그리고 그렇게 해서 나온 결과물을 최대한 자세하게 설명드리고 싶었습니다. 말하다보니 생각보다 더 길어졌군요...ㅎㅎ 이번에는 분량 조절에 실패했다고 볼 수도 있겠어요... 이 글을 통해 조금이나마 기초 개념의 사용 선택지를 늘려 가신다면 좋겠습니다. 방문 감사합니다~ 구독 공감도 감사히 받고 있습니다!(꾸벅)

    댓글

Designed by Tistory.