이번에는 게임에서 선택할 수 있는 술식 중 하나인 '좌살박도'에 대해 작성했습니다.
좌살박도는 주술회전의 등장인물 '하카리 킨지'가 사용하는 술식으로
1/239의 확률로 대박을 뽑으면 엄청난 버프 효과를 얻는 운에 의존하는 술식입니다.
자세한 설정을 알고 싶다면 아래 링크를 참조해주세요.
https://namu.wiki/w/%ED%95%98%EC%B9%B4%EB%A6%AC%20%ED%82%A8%EC%A7%80
하카리 킨지
난 「열기」 를 사랑한다. 만화 주술회전 의 등장인물. 상세 작중 처음으로 등장한 도쿄 도립 주술고전의 3학년
namu.wiki
술식 알고리즘
좌살박도는 술식의 작동 자체가 상당히 복잡한 알고리즘을 가지고 있어, 처음 보는 사람은 쉽게 이해하기가 어려운 술식입니다.
우선 기본 전제조건이 있습니다.
* 반전술식 : 신체의 손상을 회복할 수 있는 술식정도로 생각하면 편합니다.
술식 전개 과정을 도식화하면 아래와 같습니다.
영역전개를 하면 예고 단계로 넘어갑니다
예고 단계에선 총 3가지 요소가 33.333...%로 뽑히는데, 바로 "green", "red", "Hit"입니다.
아래 사진처럼 "green"이 가장 적은 대박 확률을 예고, "red"가 중간, "Hit"가 가장 큰 확률을 예고합니다.
세부적인 확률은 알지 못하기에 임의로 각각 (0.0041 (약 1/239) / 0.05 / 0.1)의 확률로
당첨뽑기에서 대박이 뽑히게 됩니다.
당첨 단계에서는 7개의 숫자가 랜덤으로 선택되는데, 예고 단계에서 얻은 가중치만큼 대박 확률이 보정됩니다.
같은 숫자 3개가 나오면 대박 당첨인데, 만약 당첨 숫자가 짝수라면 '시간 단축 영역전개'가 발동됩니다.
시간 단축 영역전개는 예고 없이 30 ~ 70회의 뽑기만 자동으로 빠르게 돌아가며 대박을 뽑게 됩니다.
이때 보정은 Hit 단계로 설정됩니다.
만약 당첨 숫자가 홀수라면 다음 영역전개는 무조건 확정 대박인 '확률변동 영역전개'가 발동됩니다.
대박에 당첨되면 당첨시 효과인 4분 11초간의 무제한 반전술식과 무제한의 주력이 주어지게 됩니다.
4분 11초가 끝나도 무제한의 주력이 주어져 있었기 때문에 즉시 영역전개가 가능합니다.
** 다른 술식의 경우 영역전개를 하게 되면 일정 시간동안 술식을 사용할 수 없는 패널티가 있습니다.
코드
import random
import time
import pygame
# 초기화
pygame.init()
# 화면 설정
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Idle Death Gamble")
# 색상 정의
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 전역 변수
Goal = "no"
running = True
processing = False
def evenGoal():
global Goal
for i in range(30):
Goal = random.choices(["1","0"], weights=[0.1,0.9], k=1)[0]
if Goal == "1":
num = random.choice([1, 2, 3, 4, 5, 6, 7])
print(num, num, num)
if num %2 == 0:
print("대박")
evenGoal()
Goal = "yes"
break
else:
print("대박")
Goal = "yes"
break
else:
num1 = random.choice([1, 2, 3, 4, 5, 6, 7])
num2 = random.choice([1, 2, 3, 4, 5, 6, 7])
num3 = random.choice([1, 2, 3, 4, 5, 6, 7])
if num1 == num2 == num3:
num1 = 5
num2 = 2
num3 = 7
print(num1, num2, num3)
def winTheGoal():
global Goal
if Goal == "yes":
num = random.choice([1,2,3,4,5,6,7])
print(num, num, num)
print("대박 당첨")
if num % 2 == 0:
Goal = "no"
evenGoal()
else:
num1 = random.choice([1, 2, 3, 4, 5, 6, 7])
num2 = random.choice([1, 2, 3, 4, 5, 6, 7])
num3 = random.choice([1, 2, 3, 4, 5, 6, 7])
if num1 == num2 == num3:
num1 = 5
num2 = 2
num3 = 7
print(num1, num2, num3)
time.sleep(0.5)
def idleDeathGamble():
global Goal, processing
processing = True # 함수가 실행 중임을 나타냄
print("영역전개")
print("좌살박도")
while Goal != "yes":
ball = ["green", "red", "Hit"]
adn = random.choice(ball)
print(adn)
time.sleep(0.5)
if adn == "green":
weight = 0.0041 # 대충 1/239
elif adn == "red":
weight = 0.05
else:
weight = 0.1
probability = [weight, 1 - weight]
Goal = random.choices(["yes", "no"], weights=probability, k=1)[0]
winTheGoal()
print("4분 11초동안 대박 효과가 지속된다.")
print("효과 : 무제한 주력 & 자동 반전술식")
processing = False # 함수 실행이 완료됨을 나타냄
# 게임 루프
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and not processing:
if event.key == pygame.K_SPACE:
Goal = "no"
idleDeathGamble()
screen.fill(BLACK)
pygame.display.flip()
pygame.quit()
코드를 실행하면
이런식으로 영역전개 선언 후 0.5초 간격으로 예고, 뽑기가 진행됩니다.
홀수 당첨이 되는 경우 위 그림처럼 대박 당첨 효과를 받습니다.
만약 짝수 당첨이 되는 경우
위의 사진처럼 30~70(레벨에 의한 변동)회의 뽑기가 진행됩니다.
'SSU::DoCode 프로젝트 1' 카테고리의 다른 글
[SSU::DoCode] #05 전투 UI 업데이트 및 여러가지 (0) | 2024.09.11 |
---|---|
[SSU::DoCode] # 04 타이틀 화면과 버튼 - 1 (0) | 2024.08.24 |
[SSU::DoCode] # 03 전투 UI 업데이트 (0) | 2024.08.08 |
[SSU::DoCode] # 01게임 제작 시작 및 세부 설정 기획 (0) | 2024.08.06 |