코딩이 장난?! - 옛날 메이플 주사위 굴리기!
옛날 메이플 주사위 4,4 만들기
서론
옛날 메이플은 캐릭터 생성을 할 때 주사위를 굴려 초기 스탯을 정했다.
이 때는 스탯 초기화 같은 게 없었기 때문에
시작 스탯을 자기가 하고싶은 직업에 맞게 맞추고 시작해야했다!
4개의 스탯 중 2개만이 한 직업에 맞는 스탯이고, 나머지는 필요가 없는 스탯이었다.
그렇지만 주사위를 굴려 나오는 스탯의 총합은 25로 고정되어 있었으며,
각 스탯의 최대 값은 10, 최소값은 4로 고정되어 있었다.
그래서 옛날 사람들은 주사위 노가다를 해서 안쓰는 스탯을 4 4 로 만들어 쓸데없는 스탯에 포인트를 낭비하지 않으려 했다.
오늘 날에는 시작스탯이 고정되어 시작을 하기에 그 노가다의 맛을 그리워 하는 옛날 유저들도 생기기도 한다(아마도)..
그들을 위해 주사위 시뮬레이터를 되살려보자!
설계
주사위 돌리기의 조건은 두 가지이다.
-
각 스탯은 4 이상 10 이하의 랜덤 숫자이다.
-
각 스탯의 합은 25여야만 한다.
의외로 간단해보인다. 시작해보자.
- 먼저 각 스탯의 이름을 정해준다
Str = #힘
Dex = #민첩
Int = #지능
Luk = #행운
- 각 스탯의 범위를 지정한다.
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을 쓸 것이다.
- 조건을 건 반복문의 활용!
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)
처음에는 이렇게 코드를 짰다.
해석을 하자면,
-
각 스탯을 변수로 선언한다. (합이 25만 아닌 아무 수나 넣으면 된다!)
-
네 스탯의 합이 25가 아닐 경우
-
네 스탯을 계속 난수추출하는걸 반복한다.
-
합이 25가 되었을때 그만두고 변수를 뱉어낸다.
-
뱉은 변수를 프린트한다.
사람이 직접 한다고 생각해보면 엄청난 노가다를 시키는 것이다.
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

코드를 공유합니다!
완성된 코드
### 문이세의 메이플 주사위 코드!!
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