5 minute read

옛날 메이플 주사위 4,4 만들기

서론

옛날 메이플은 캐릭터 생성을 할 때 주사위를 굴려 초기 스탯을 정했다.

이 때는 스탯 초기화 같은 게 없었기 때문에

시작 스탯을 자기가 하고싶은 직업에 맞게 맞추고 시작해야했다!

4개의 스탯 중 2개만이 한 직업에 맞는 스탯이고, 나머지는 필요가 없는 스탯이었다.

그렇지만 주사위를 굴려 나오는 스탯의 총합은 25로 고정되어 있었으며,

각 스탯의 최대 값은 10, 최소값은 4로 고정되어 있었다.

그래서 옛날 사람들은 주사위 노가다를 해서 안쓰는 스탯을 4 4 로 만들어 쓸데없는 스탯에 포인트를 낭비하지 않으려 했다.

오늘 날에는 시작스탯이 고정되어 시작을 하기에 그 노가다의 맛을 그리워 하는 옛날 유저들도 생기기도 한다(아마도)..

그들을 위해 주사위 시뮬레이터를 되살려보자!

설계

주사위 돌리기의 조건은 두 가지이다.

  1. 각 스탯은 4 이상 10 이하의 랜덤 숫자이다.

  2. 각 스탯의 합은 25여야만 한다.

의외로 간단해보인다. 시작해보자.

  1. 먼저 각 스탯의 이름을 정해준다
Str =              #힘
Dex =            #민첩
Int =              #지능
Luk =            #행운
  1. 각 스탯의 범위를 지정한다.
import random # 난수 생성을 위한 함수를 불러야 하므로 사용한다!
Str = random.randint(4,10)             #힘
Dex = random.randint(4,10)             #민첩
Int = random.randint(4,10)             #지능
Luk = random.randint(4,10)             #행운

이제 두번째 조건을 적용해야 하는데 생각을 잘 해야한다.

각 스탯이 최소만 나올 경우 4 4 4 4 의 합은 16이다.

각 스탯이 최대만 나올 경우 10 10 10 10 의 합은 40이다.

하지만 두 번째 조건은 합이 25로 제한되어야 한다!

맨 위 두 변수를 랜덤추출 했을때

Str +Dex의 최소값은 8이다.

25에서 8을 빼면 17으로 int에서 7 이상만 나오면 문제가 없다.

Str + Dex의 최대값은 20이다.

이렇게 되면 남은 값은 5가 되어 Int가 최소인 4만 나와도 Luk이 1 이하에 안된다!

두 값만 랜덤추출해도 두번째 조건에 문제가 생긴다!

여기서 우리는 추출된 값에 조건을 걸고 싶기 때문에 조건문을 사용해야 한다!

그리고, 조건문을 걸었을때 문제가 생긴 경우 다시 뽑아내라고 시킬 것이다.

이를 위해서는 반복문 while을 쓸 것이다.

  1. 조건을 건 반복문의 활용!
Str, Dex, Int, Luk = 0, 0, 0, 0,

while (Str + Dex + Int + Luk != 25):
    Str = random.randrange(4,10)

    Dex = random.randrange(4,10)

    Int = random.randrange(4,10)
    
    Luk = random.randrange(4,10)

print(Str, Dex, Int, Luk)

처음에는 이렇게 코드를 짰다.

해석을 하자면,

  1. 각 스탯을 변수로 선언한다. (합이 25만 아닌 아무 수나 넣으면 된다!)

  2. 네 스탯의 합이 25가 아닐 경우

  3. 네 스탯을 계속 난수추출하는걸 반복한다.

  4. 합이 25가 되었을때 그만두고 변수를 뱉어낸다.

  5. 뱉은 변수를 프린트한다.

사람이 직접 한다고 생각해보면 엄청난 노가다를 시키는 것이다.

4~10사이의 숫자가 적힌 Str상자, Dex상자, Int상자, Luk상자에서 뽑기를 하는데

4444? …합이…16? 25가 아니네… 다시! 5295? …………………………….아니네… 다시!

이러다가 딱 합이 25인게 나오면 그때 그만 뽑는것이다.

컴퓨터로 했을때 0.2초가 나왔지만 컴퓨터가 불쌍해서 더 좋은 방법이 없을까 생각해보게 되었다.

while True:
        Str = random.randint(4,10)             #힘
				Dex = random.randint(4,10)             #민첩
				Int = random.randint(4,10)             #지능
        Luk = 25 - Str - Dex - Int             #행운. 여기에 주목!
        if Luk <=0:
            pass

        elif (Luk<=10)and(Lu>=4):
            break
        else:
            pass

어차피 네 종류의 스탯 중 마지막은 합쳤을때 25가 되어야 하므로 25에서 세 스탯을 뺀 값이 되도록 했다. 사람이 한다고 생각해보자

4 4 4가 나왔고… 25에서 12빼면 13이니까? 4~10이 아니네? Luk상자는 귀찮게 뽑지 말고 다시하자!

Luk상자를 뽑을 필요도 없어졌다!

컴퓨터는 우리에겐 엄청난 경우의 수 노가다를 이제 하지 않아도 되는 것이다.

꾸미기

몰입도를 놉혀주기 위해 자신의 닉네임을 적을 수 있게 하고,

한번 나온 스탯이 마음에 안들면 다시 재분배할 수 있게 만들었다!

print("닉네임 입력")
 = input()
time.sleep(1)
print(f"캐릭터 닉네임 : {}")
time.sleep(1)
print(f"{}의 메이플 주사위 굴리기!.")

# 스탯 설정
기본체력 = 10
기본mp   = 10
기본물리공격력 = 1
기본마법공격력 = 1
기본명중 = 0
기본회피 = 0
기본방어력 = 0

물리공격력 = 0
마법공격력 = 0
명중 = 0
회피 = 0

while 1:
    Str, Dex, Int, Luk = 0, 0, 0, 0,

    while True:
        Str = random.randint(4,10)             #힘
        물리공격력 = 기본물리공격력+ Str
        Dex = random.randint(4,10)             #민첩
        명중 = 기본명중 + Dex
        Int = random.randint(4,10)             #지능
        마법공격력 = 기본마법공격력 + Int
        Luk = 25 - Str - Dex - Int             #행운. 여기에 주목!
        회피 = 기본회피 + Luk
        if Luk <=0:
            pass

        elif (Luk<=10)and(Luk>=4):
            break
        else:
            pass
    
    print(f"[초기 스탯을 설정합니다.] \n Str = {Str}, Dex = {Dex}, Int = {Int}, Luk = {Luk}")
    time.sleep(0.5)
    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":
            time.sleep(0.5)
            print("\n 결정되었습니다")
            print(f"""
            [스테이터스]
            이름 = {}
            직업 = 초보자
            HP = {기본체력}
            MP = {기본mp}
            Str = {Str} 
            Dex = {Dex}
            Int = {Int}
            Luk = {Luk}
            """)
            break

닉네임 입력

캐릭터 닉네임 : 이세

이세의 메이플 주사위 굴리기!.

[초기 스탯을 설정합니다.]

Str = 9, Dex = 7, Int = 5, Luk = 4

재분배하시겠습니까? : a = 네, b = 아니오

입력 : a

[초기 스탯을 설정합니다.]

Str = 8, Dex = 4, Int = 8, Luk = 5

재분배하시겠습니까? : a = 네, b = 아니오

입력 : b

정말 결정하셨습니까? : a = 네, b = 아니오

입력 : a

결정되었습니다

        [스테이터스]
        이름 = 이세
        직업 = 초보자
        HP = 10
        MP = 10
        Str = 8
        Dex = 4
        Int = 8
        Luk = 5

image

코드를 공유합니다!

완성된 코드

### 문이세의 메이플 주사위 코드!!

import random
import time

print("닉네임 입력")
 = input()
time.sleep(1)
print(f"캐릭터 닉네임 : {}")
time.sleep(1)
print(f"{}의 메이플 주사위 굴리기!.")

# 스탯 설정
기본체력 = 10
기본mp   = 10
기본물리공격력 = 1
기본마법공격력 = 1
기본명중 = 0
기본회피 = 0
기본방어력 = 0

물리공격력 = 0
마법공격력 = 0
명중 = 0
회피 = 0

while 1:
    Str, Dex, Int, Luk = 0, 0, 0, 0,

    while True:
        Str = random.randint(4,10)             #힘
        물리공격력 = 기본물리공격력+ Str
        Dex = random.randint(4,10)             #민첩
        명중 = 기본명중 + Dex
        Int = random.randint(4,10)             #지능
        마법공격력 = 기본마법공격력 + Int
        Luk = 25 - Str - Dex - Int             #행운. 여기에 주목!
        회피 = 기본회피 + Luk
        if Luk <=0:
            pass

        elif (Luk<=10)and(Luk>=4):
            break
        else:
            pass
    
    print(f"[초기 스탯을 설정합니다.] \n Str = {Str}, Dex = {Dex}, Int = {Int}, Luk = {Luk}")
    time.sleep(0.5)
    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":
            time.sleep(0.5)
            print("\n 결정되었습니다")
            print(f"""
            [스테이터스]
            이름 = {}
            직업 = 초보자
            HP = {기본체력}
            MP = {기본mp}
            Str = {Str} 
            Dex = {Dex}
            Int = {Int}
            Luk = {Luk}
            """)
            break

Updated: