'떨어질 때까지'


17

Dungeons & Dragons 5th edition (및 대부분의 다른 에디션)에는 Deck of Many Things 라는 마법 아이템이 있습니다 . 카드는 모두 매우 강한 긍정적 또는 부정적 영향을 미치기 때문에 엄청나게 강력한 아이템입니다. 데크를 사용하기 위해 캐릭터는 숫자를 선언 한 다음 그 효과를 순서대로 적용하여 그 수의 카드를 그립니다. 캐릭터가 선언 한 모든 카드를 뽑지 않고 마지막 카드를 뽑은 후 최소 1 시간이 지난 경우 나머지 카드는 자동으로 그려져 효과가 적용됩니다. 각 카드를 뽑은 후에는 덱으로 돌아와 덱을 섞습니다.

다음은 각 카드 1 을 그리는 효과의 목록입니다 .

  • 균형 : 당신의 마음은 렌치로 바뀌어 정렬이 변경됩니다. 합법은 혼돈이되고 선은 악이되며 그 반대도 마찬가지입니다. 당신이 진정한 중립적이거나 정렬되지 않은 경우,이 카드는 당신에게 영향을 미치지 않습니다.
  • 혜성 : 다음 적대적인 몬스터 나 당신이 만나는 몬스터 그룹을 한 손으로 물리 치면, 한 레벨을 얻을 수있을만큼의 경험치를 얻습니다. 그렇지 않으면이 카드는 효과가 없습니다.
  • Donjon : 당신은 사라져서 외 차원 구체에서 정지 된 애니메이션 상태에 갇히게됩니다. 당신이 입고 다니는 모든 것은 당신이 사라 졌을 때 차지했던 공간에 남아 있습니다. 구에서 발견되어 제거 될 때까지 수감되어 있습니다. 점술 마법으로 찾을 수는 없지만 소원 마법으로 감옥의 위치를 ​​알 수 있습니다. 더 이상 카드를받지 않습니다.
  • Euryale . 카드의 메두사 같은 얼굴이 당신을 저주합니다. 이런 식으로 저주를받는 동안 투척을 저장하면 -2의 페널티를받습니다. 운명 카드의 신이나 마법 만이이 저주를 끝낼 수 있습니다.
  • 운명 : 현실의 직물은 새로운 사건을 풀어 내고 새로운 사건을 일으켜 한 사건이 발생하지 않은 것처럼 피하거나 지울 수 있습니다. 카드를 뽑는 즉시 또는 죽기 전에 언제든지 카드의 마법을 사용할 수 있습니다.
  • 불꽃 : 강력한 악마가 당신의 적이됩니다. 악마는 당신의 파멸을 찾고 당신의 삶을 괴롭 히고, 당신을 죽이려고 시도하기 전에 고통을 맛볼 수 있습니다. 이 적의는 당신이나 악마가 죽을 때까지 지속됩니다.
  • 바보 : 당신은 10,000 XP를 잃고,이 카드를 버리고, 덱에서 다시 뽑습니다. 선언 된 드로우 중 하나입니다. XP를 많이 잃으면 레벨을 잃을 수 있고, 레벨을 유지하기에 충분한 XP 만 남게되는 금액을 잃게됩니다.
  • 보석 : 각 2,000gp 가치의 보석 25 개 또는 각각 1,000gp 가치의 보석 50 개가 발에 나타납니다.
  • 바보 : 지능을 1d4 + 1만큼 영구적으로 줄입니다 (최소 점수 1). 당신은 당신의 선언 된 드로우 이외의 추가 카드를 하나 그릴 수 있습니다.
  • 광대 : 당신은 10,000 XP를 얻거나 선언 된 추첨을 넘어 두 개의 추가 카드를 그릴 수 있습니다. 이 카드를 뽑은 후 폐기하십시오.
  • 열쇠 : 숙련 된 희귀하거나 희귀 한 마법 무기가 당신의 손에 나타납니다. GM은 무기를 선택합니다.
  • 기사 : 당신은 30 피트 이내에서 선택한 공간에 등장하는 4 급 전투기의 서비스를받습니다. 전투기는 당신과 같은 종족이며, 죽음이 끝날 때까지 충성스럽게 섬기며, 운명이 그를 당신에게 이끌었다 고 믿습니다. 이 캐릭터를 제어합니다.
  • : 소원 주문을 1d3 번 시전하는 능력이 부여됩니다.
  • Rogue : GM이 선택한 비 플레이어 캐릭터가 적대적입니다. NPC 나 다른 누군가가 그것을 밝힐 때까지 새로운 적의 신원을 알 수 없습니다. 소원이나 신의 개입만으로 NPC의 적대감을 종식시킬 수 있습니다.
  • 파멸 : 마법 아이템 이외의, 소유하거나 소유 한 모든 형태의 부를 잃게됩니다. 휴대용 속성이 사라집니다. 소유 한 사업체, 건물 및 토지는 현실을 가장 적게 변화시키는 방식으로 손실됩니다. 이 카드에서 잃어버린 물건을 소유하고 있음을 증명하는 문서도 사라집니다.
  • 해골 . 너는 죽음의 아바타를 소환한다-너덜 너덜 한 검은 가운에 입히고 스펙트럼 낫을 들고있는 유령 같은 인간 골격. 그것은 당신이 10 피트 이내에 GM이 선택한 공간에 나타나 당신을 공격하며, 다른 모든 사람들은 당신이 혼자서 전투에서 이겨야한다고 경고합니다. 아바타는 죽을 때까지 싸우거나 적중률이 0이되어 사라집니다. 누군가 당신을 도와 주려고하면, 도우미는 자신의 죽음의 아바타를 소환합니다. 죽음의 아바타가 죽인 생물은 생명으로 회복 될 수 없습니다.
  • 별표 : 능력치 중 하나를 2만큼 증가시킵니다. 점수는 20을 초과 할 수 있지만 24를 초과 할 수 없습니다.
  • 태양 : 경험치가 50,000이며, GM이 무작위로 결정하는 놀라운 아이템이 당신의 손에 나타납니다.
  • 탈론 : 착용하거나 운반하는 모든 마법 아이템이 쇠약 해 집니다. 소유 한 인공물은 파괴되지 않지만 사라집니다.
  • 왕좌 : 설득 기술에 능통하며 그 기술로 얻은 수표에 능숙 보너스가 두 배가됩니다. 또한, 당신은 세계 어딘가에 작은 보관소의 정당한 소유권을 얻습니다. 그러나, 요새는 현재 몬스터의 손에 달려 있으며, 당신은 당신의 것으로 주장하기 전에 반드시 정리해야합니다.
  • 고관 :이 카드를 후 1 년 이내에 선택하면 명상에 관한 질문을하고 정신적으로 그 질문에 대한 정답을받을 수 있습니다. 정보 외에도 답은 수수께끼 같은 문제 나 다른 딜레마를 해결하는 데 도움이됩니다. 다시 말해, 지식은 그것을 적용하는 방법에 대한 지혜와 함께 온다.
  • 무효 :이 블랙 카드는 재앙을 일으 킵니다. 당신의 영혼은 당신의 몸에서 끌어와 GM의 선택 장소에있는 물건에 담겨 있습니다. 하나 이상의 강력한 존재가 장소를 보호합니다. 당신의 영혼이 이런 식으로 갇혀있는 동안, 당신의 몸은 무능력합니다. 소원의 주문은 영혼을 회복시킬 수 없지만, 그 주문은 그것을 보유한 물체의 위치를 ​​나타냅니다. 더 이상 카드를받지 않습니다.

( D & D 5 판 SRD 에서 복사 한 카드 설명 )

특히 어리석은 플레이어는 한 번에 많은 수의 카드를 뽑아서 최소한 하나의 강력한 카드로 해로운 카드의 균형을 잡기를 바랍니다. 예상대로, 이것은 종종 캐릭터가 사망하거나 카드를 계속 뽑을 수 없게 만듭니다.

도전

22 개 카드 의 Many of Deck 에서 반복 된 그리기를 시뮬레이션하여 각 카드를 출력하고 다음 조건 중 하나가 충족 될 때만 중지합니다.

  • 캐릭터는 죽습니다 ( Fate 또는 Moon active 2 의 혜택을받지 않고 Skull 그리기 또는 Flames 또는 Rogue 그리기 후 5 장의 카드 그리기 를 통해 ).
  • 캐릭터는 Donjon , Talons , The Void 3 또는 Idiot 4 를 통해 캐릭터의 지능 점수가 3 이하로 떨어지는 효과를 통해 더 많은 카드를 뽑을 수 없습니다 .

규칙

  • 데크 이외의 캐릭터의 정렬, 레벨, XP 및 소유물은 중요하지 않습니다.
  • 캐릭터의 지능 점수는 10에서 시작합니다.
  • 캐릭터의 지능 또는 비축 된 소원의 사용에는 최대 제한이 없습니다 .
  • 운명의 사용은 쌓이지 않습니다.
  • 소원의 마법은 캐릭터가 사용할 수 없을 원인의 1에서 3 기회가 소원 정기 효과에 추가하여, 다시 주문을. 이 경우 캐릭터는 더 이상 주문을 사용하여 불꽃 , 도적 또는 해골 을 무효화 할 수 없습니다 . 운명 의 힘은 유일한 수단입니다.
  • 캐릭터는 항상 다음을 선택합니다.
    • 운명 은 전적으로 해골 , 화염 , 도적 에서 캐릭터를 곤경에 빠뜨리는 데 사용됩니다 . 캐릭터는 결코 탈론 효과를 되돌 리거나 소원 주문을 다시 시전 할 수 없으며, 돈존공허 효과를 되돌릴 수 없습니다 . 캐릭터는 즉시 하나의 소원 주문을 사용하여 그중 하나 를 그릴 때 Skull , Flames 또는 Rogue 의 효과를 무효화하고 항상 성공합니다. 캐릭터는 항상 운명의 하기 전에 을 사용합니다소원을 사용 합니다.
    • 캐릭터는 항상 바보광대 의 효과로 더 많은 카드를 뽑으려고 선택합니다 (적절하게).
    • 의 효과 스타는 항상 효과를 통해 카드를 그리기 중지하는 것을 방지하기 위해, 2 지능을 향상하는 데 사용됩니다 바보 .
  • Knight 가 소환 한 NPC 는 적시의 죽음에서 캐릭터를 구할만큼 강력하지 않습니다.
  • 인텔리전스의 증가 또는 감소 ( 각각 Star 또는 Idiot 를 통해 )는 출력에 반영되어야합니다 (변경 사항 ( +2또는 -(1d4+1))을 기록하거나 효과가 발생한 후 현재 인텔리전스 점수를 출력하여).
  • 캐릭터가 비축 한 소원 사용 횟수에 대한 변경 사항 은 캐릭터가 더 이상 소원 을 사용할 수 없도록 하는 소원 을 포함하여 출력에 유사하게 반영되어야합니다 .
  • 모든 무작위 선택은 균일 한 이산 분포에서 이루어집니다.
  • 뽑은 카드에 대해 출력 할 22 개의 개별 출력 세트를 선택할 수 있습니다. 카드 이름을 사용할 필요는 없습니다.
  • 인텔리전스, 소원 사용 및 원하는 일관되고 모호하지 않은 방식으로 변경 사항을 사용할 수 없도록 변경 사항을 출력 할 수 있습니다 .
  • 도적 이나 화염을 뽑은 후 적절한 카드를 다섯 번째 카드로 뽑으면 캐릭터는 죽음을 피하기 위해 소원 이나 운명 의 힘을 사용할 수 있습니다 . 경우에만 소원은 사용할 수 없습니다 또는 사용의 모든뿐만 아니라 같이 사용되어왔다 운명 , 문자 다이를하지 않습니다 시간에 그려지는 이미 사용되고있다.
  • 바보광대 는 뽑은 후에 버립니다. 다른 모든 카드는 즉시 덱으로 돌아간 다음 덱을 섞습니다.
  • 다수의 도적 및 / 또는 불꽃이 활성화 된 경우, 운명을 한 번만 사용 하거나 소원 을 제거해야합니다.
  • Jester 또는 Fool을 통해 한 번에 여러 카드를 뽑아도 Flames 및 / 또는 Rogue 의 턴 카운터가 진행되지 않습니다 .

각 선은 연속 된 추첨을 나타냅니다. 인텔리전스 및 소원 사용에 대한 변경 사항 은 현재 값으로 괄호 안에 표시됩니다. CA와 다음 소원의 사용은 그 의미 소원은 더 이상 사용할 수 없습니다. A 는 운명F 의 힘이 죽음을 피하기 위해 사용 되었음을 나타냅니다 . 추가 주석은 설명을 위해 Python 스타일 주석의 형태로 제공됩니다.

Void # Can't draw with your soul ripped out of your body.
Throne, Euryale, Rogue, Star (12), Donjon # Can't draw while in suspended animation.
Moon (3), Throne, Sun, Flames (2), Fool, Idiot (6), Flames (1 C), The Fates, Skull (F), Skull # Two uses of wish were used on the two Flames draws. The second use rendered the character unable to use wish again. The Fates was used on the first Skull. When the second Skull came up, there was no way for the character to save himself, so he died.
Idiot (5), Star (7), Idiot (3) # Too dumb to draw.
Sun, Star (12), Talons # Talons destroys the deck.
Fates, Throne, Moon (2), Fates, Skull (F), Skull # Fates doesn't stack
Fates, Flames, Euryale, Fates, Skull, Void
Flames, Comet, Euryale, Gem, Knight, Key # 5 draws after Flames, the hero dies
Rogue, Balance, Throne, Gem, Idiot (8), Vizier, Sun # 5 draws plus one extra from Idiot

참조 구현

#!/usr/bin/env python3

import random

deck="""Sun
Moon
Star
Throne
Key
Knight
Void
Flames
Skull
Ruin
Euryale
Rogue
Jester
Vizier
Comet
Fates
Gem
Talons
Idiot
Donjon
Balance
Fool""".split()

random.shuffle(deck)

int_stat = 10
wish_uses = 0
wish_expired = False
fates = False
turn_count = None

while True:
    card = deck.pop()
    if card == "Fates":
        if turn_count is None:
            fates = True
            print(card)
        else:
            turn_count = None
            fates = False
            print("{} (F)".format(card))
    elif card == "Moon":
        wish_uses += random.randint(1, 3)
        if turn_count is None:
            print("{} ({})".format(card, wish_uses))
        else:
            turn_count = None
            wish_uses -= 1
            print("{} ({}) ({})".format(card, wish_uses+1, wish_uses))
    elif card in ["Flames", "Rogue"]:
        if turn_count is None:
            turn_count = 5
        if fates:
            fates = False
            turn_count = None
            print("{} (F)".format(card))
        elif wish_uses > 0 and not wish_expired:
            wish_uses -= 1
            turn_count = None
            wish_now_expired = random.choice([False, False, True])
            print("{} ({}{})".format(card, wish_uses, " C" if wish_expired else ""))
            wish_expired = wish_now_expired
        else:
            print("{}".format(card))
    elif card == "Idiot":
        int_stat -= random.randint(2, 5)
        print("{} ({})".format(card, int_stat))
        if turn_count is not None:
          turn_count += 1
        if int_stat <= 3:
            break
    elif card == "Star":
        int_stat += 2
        print("{} ({})".format(card, int_stat))
    elif card == "Skull":
        if fates:
            fates = False
            turn_count = None
            print("{} (F)".format(card))
        elif wish_uses > 0 and not wish_expired:
            wish_uses -= 1
            turn_count = None
            wish_now_expired = random.choice([False, False, True])
            print("{} ({}{})".format(card, wish_uses, " C" if wish_expired else ""))
            wish_expired = wish_now_expired
        else:
            print(card)
            break
    elif card in ["Donjon", "Void", "Talons"]:
        print(card)
        break
    elif card == "Fool":
        print(card)
        if turn_count is not None:
            turn_count += 1
    elif card == "Jester":
        print(card)
        if turn_count is not None:
            turn_count += 2
    else:
        print(card)
    if card not in ["Fool", "Jester"]:
        deck.append(card)
        random.shuffle(deck)
    if turn_count is not None:
        turn_count -= 1
    if turn_count == 0:
        break

[1] : 기술적으로 두 가지 변형이 있습니다. 하나는 13 개의 카드가 있고 다른 하나는 22 개의 카드가 있습니다. 우리는 풀 22 카드 버전에 대해서만 걱정합니다.

[2] : 화염도적 은 일반적으로 캐릭터를 완전히 죽이지 않지만 적대적인 NPC는 어리석은 캐릭터를 찾아 5 장 더 뽑을 시간이있는 것으로 추정됩니다. 스컬 이 소환 한 스펙터는 싸우기가 매우 어렵고 캐릭터가 이기지 못한다고 가정합니다. 운명 이나 달을 통한 신성하고 마법적인 개입 만이이 3 장의 카드로 어리석은 캐릭터를 죽일 수 있습니다.

[3] : 캐릭터의 친구가 캐릭터를 구출하려고하지 않고 더 많은 카드를 뽑을 수 없을 정도로 똑똑하다고 가정합니다.

[4] : 지능 점수 3은 야생 동물과 거의 동일하며 카드를 뽑는 데 적극적으로 선택할 수 없습니다.



a) 5 턴이 만료되고 이상적으로는 보너스 카드를 사용하는 것이 이상적입니다. b) 사이에 카드를 사용하거나 사용하지 않고 운명을 두 번 당깁니다.
Martin Ender

당신의 참조 구현은 Moon이 그려지는 순간에 소원이 사용된다면 소원이 만료되지 않도록합니다. 또한 이미 만료되었는지 확인하지 않습니다.
Martin Ender

한 가지 더 : 원래의 D & D 규칙은 모든 바보, 바보 및 광대에 대한 추가 카드를 언급합니다. 당신의 규칙은 먼저 플레이어가 바보와 광대에 대한 추가 카드를 뽑은 다음 바보와 광대에 대한 규칙 카운터를 명확히하고, 참조 구현은 바보와 광대에 대한 추가 카드를 그리는 것으로 나타납니다. 이것을 명확하게하거나 고칠 수 있습니까?
Martin Ender

2
@steenbergh 나는 또한 처음에는 그것을 지나쳐 읽었지만 " 각 카드를 뽑은 후에는 덱으로 돌아가고 덱이 뒤섞입니다. ". 바보와 광대 만 뽑을 때 제거되며, 그 밖의 모든 것은 다시 갑판에 놓이고 새로운 카드를 뽑을 때마다 다시 섞습니다.
케빈 크루이 센

답변:


4

자바 스크립트 (ES6), 379 바이트

for(D=[...Array(21)].map((a,b)=>b),d={},i=10,w=e=f=t=0,F=_=>f=t=o=0,W=_=>{w--,t=0,o=w+(e?' C':''),e=1>r(2)},r=a=>0|Math.random()*a,$=1;$;){for(;d[c=r(22)];);o='',c?3>c?(t&&(t+=c),d[c]=1):4>c?f?F():0<w&&!e?W():$=0:7>c?$=0:9>c?(!t&&(t=5),f?F():0<w&&!e&&W()):10>c?(w+=1+r(2),t?(t=0,o=[w,--w]):o=w):11>c?(i-=2+r(3),o=i,$=3<i):12>c&&(i+=2,o=i):t?F():f=1,console.log(c,o),t&&(t--,$=t)}

언 골프

출력 설명

카드의 범위는 다음과 같이 0-21입니다.

  • 0 : 운명
  • 1 : 바보
  • 2 : 광대
  • 3 : 해골
  • 4 : 돈존
  • 5 : 무효
  • 6 : 발톱
  • 7 : 화염
  • 8 : 도적
  • 9 : 달
  • 10 : 바보
  • 11 : 별
  • 12 ~ 21 : 태양, 왕좌, 열쇠, 기사, 파멸, Euryale, Vizier, 혜성, 보석, 균형

운명을 통한 해골, 화염 또는 도적의 반전은로 표시됩니다 0.


자바 스크립트 (ES6), 792 바이트

22 개의 고유 한 출력이 허용되는 것을 알기 전에 카드 이름을 사용한 이전 버전.

d=`Sun Moon Star Throne Key Knight Void Flames Skull Ruin Euryale Rogue Jester Vizier Comet Fates Gem Talons Idiot Donjon Balance Fool`.split` `,i=10,w=0,W=!1,f=!1,t=null,F=()=>{f=!1,t=null,_('F')},U=()=>{w--,t=null,_(w+(W?' C':'')),W=1>r(2)},_=(...a)=>console.log(c+a.map(b=>` (${b})`).join``),r=a=>0|Math.random()*a,$=!0;for(;$;)c=d.splice(r(d.length),1)[0],'Fates'==c?null==t?(f=!0,_()):F():'Moon'==c?(w+=1+r(2),null==t?_(w):(t=null,w--,_(w+1,w))):'Idiot'==c?(i-=2+r(3),_(i),3>=i&&($=!1)):'Star'==c?(i+=2,_(i)):'Flames'==c||'Rogue'==c?(null==t&&(t=5),f?F():0<w&&!W?U():_()):'Skull'==c?f?F():0<w&&!W?U():(_(),$=!1):'Donjon'==c||'Void'==c||'Talons'==c?(_(),$=!1):'Fool'==c?null!==t&&(t+=1):'Jester'==c?null!==t&&(t+=2):_(),['Fool','Jester'].includes(c)||d.push(c),null!==t&&t--,0===t&&($=!1)

언 골프


2
@Mego 솔직히, 나는이 답변을 볼 때까지해야 할만 큼 잘 얻지 못했습니다. 전체 이름을 볼 때 이해하기 쉽습니다. 변경하면 전체 이름으로 버전을 유지할 수 있습니까?
Magic Octopus Urn

@MagicOctopusUrn 확실히, 앞으로는 현재 이름 버전을 유지할 것입니다.
darrylyeo

@Mego는 OP를 목표로했으며 "실제 카드 이름을 가진 버전으로 인해이 구현을 쉽게 읽을 수있게되었습니다. 바이트를 줄이면 'ungolfed'라는 레이블이 붙어 있습니다."
Magic Octopus Urn

@MagicOctopusUrn 업데이트.
darrylyeo

0

코 틀린 , 1173 바이트

fun main(args:Array<String>){val d="Sun Moon Star Throne Key Knight Void Flames Skull Ruin Euryale Rogue Jester Vizier Comet Fates Gem Talons Idiot Donjon Balance Fool".split(" ");var c=(Math.random()*22).toInt();var i=10;var u=0;var e=false;var f=false;var t=1;r@while(true){when(c){15->{if(t>=1){f=true;println(c)}else{t = 1;f = false;println("${d[c]} (F)")}}1->{u+=(Math.random()*3).toInt()+1;if(t>=1){println("${d[c]} ($u)")}else{t=1;u-=1;println("${d[c]} (${u + 1}) ($u)")}}in arrayOf(7,11)->{if(t>=1){t=5};if(f){f=false;t=1;println("${d[c]} (F)")}else if(u>0&&!e){u-=1;t=1;val n=(Math.random()*3).toInt();println("${d[c]} ($u$e)");e=n==0}else{println(d[c])}}18->{i-=(Math.random()*4).toInt()+2;println("${d[c]} ($i)");if (t!=0){t+=1};if(i<=3){break@r}}2->{i+=2;println("${d[c]} ($i)")}8->{if(f){f=false;t=1;println("${d[c]} (F)")}else if(u>0&&!e){u-=1;t=1;val n=(Math.random()*3).toInt();println("${d[c]} ($u$e)");e=n==0}else{println(c);break@r}}in arrayOf(6,17,19)->{println(d[c]);break@r}21->{println(d[c]);if(t!=0){t += 1}}12->{println(d[c]);if(t!=0){t+=2}}else->{println(d[c])}};if((c !in arrayOf(12,21))){c=(Math.random()*23).toInt()};if(t!=0){t-=1}else{break}}}

실행할 수 있습니다. - 온라인으로 사용해보십시오!

아마도 많은 버그가있을 것입니다 ... 의견에 알려주십시오!


무한 루프 인쇄 Fool또는 Jester.
FrownyFrog

0

자바 8, 481480 바이트

v->{String r="";for(int i=10,d=22,c=d,F=0,t=0,w=0,W=0,j=Math.random()<.5?1:2;;c=d){c*=Math.random();r+=" "+c;if(c<1){F=1;r+=t>0?"F"+(F=0):"";t=-1;}else if(c<2){w+=Math.random()*3+1-(t>0?1:0);t=-1;}else if(c<4)t=F>0?-1:t<1?6:t;else if(c<5)t=F*w*W<1?1:-1;else if(c>19){t+=t>0?j:0;j=j%2+1;d--;}if(c>1&c<5&w*W>0){w--;W=(int)(Math.random()*3)%2;}i-=c==5?Math.random()*3+2:c==6?-2:0;r+=c>1&c<5&F>0?"F"+(F=0):c>0&c<5?"w"+w+"W"+W:c>4&c<7?"i"+i:"";if(--t==0|(c==5&i<4)|c>6&c<10)return r;}}

Python3 참조 구현을 Java로 이식 한 다음 축소했습니다. 확실히 더 골프를 칠 수 있지만 이것은 모든 것을 올바르게했는지 확인하기위한 초기 버전 일뿐입니다.

누군가 실수를 발견하면 ( 이 게시물을 게시 한 후 이미 7 ~ 8 개의 실수로 수정 ​​된 편집 이 있으면 놀라지 않을 것입니다 ..)

카드 출력 :

0: 운명
1: 달
2: 불꽃
3: 도적
4: 해골
5: 바보
6: 별
7/ 8/ 9: 돈존 / 공허 / 발톱
20/ 21: 바보 / 광대

10-19: 그 밖의 모든 것 (일 / 왕좌 / 키 / 나이트 / 파도 / Euryale / Vizier / Comet / Gem / Balance)

남은 소원, 남은 소원, 인텔리전스 남음 및 사용 된 플래그에 대한 출력 형식 :

4w1W0
4       // Card drawn
 w1     // New amount of wishes left
   W0   // Whether the wishes used flag is active (1) or inactive (0)

5i6
5       // Card drawn
 i6     // New intelligence

0F0
0       // Card drawn
 F0     // Fates used

설명:

여기에서 시도 하거나 예쁘게 출력 된 여기에서 시도하십시오 .

v->{                       // Method with empty unused parameter and String return-type
  String r="";             //  Result-String, starting empty
  for(int i=10,            //  Intelligence
          d=22,            //  Amount of cards in the deck, starting at 22
          c=d,             //  Current card drawn
          F=0,             //  Fates flag
          t=0,             //  Turn-counter
          w=0,             //  Wishes left
          W=0,             //  Wishes used flag
          j=Math.random()<.5?1:2;
                           //  Whether Jester/Fool is drawn first of the two
      ;                    //  Loop indefinitely
       c=d){               //    After every iteration, shuffle the deck (reset `c`)
    c*=Math.random();      //   Draw a random 0-21 card (or less if Fool/Jester is gone)
    r+=" "+c;              //   Append the result with a space and this card
    if(c<1){               //   If the card was Fates:
      F=1;                 //    Set the Fates-flag to active
      r+=t>0?              //    If the turn-counter is larger than 0:
          "F"+(F=0)        //     Append that Fates was used (and make Fates inactive)
         :                 //    Else:
          "";              //     Append nothing
      t=-1;}               //    Set the turn-counter to -1 (none)
    else if(c<2){          //   If the card was Moon instead:
      w+=Math.random()*3+1 //    Increase the wishes by 1-3 randomly
         -(t>0?            //    Then, if the turn-counter is larger than 0
            1              //     Subtract 1 from the amount of wishes
           :               //    Else:
            0);            //     Leave the wishes the same
      t=-1;}               //    Set the turn-counter to -1 (none)
    else if(c<4)           //   If the card was Flames or Rogue instead:
      t=F>0?               //    If the Fates-flag is active:
         -1                //     Set the turn-counter to -1 (none)
        :t<1?              //    Else-if the turn-counter is 0 or -1 (none):
         6                 //     Set the turn-counter to 6
        :                  //    Else:
         t;                //     Leave the turn-counter the same
    else if(c<5){          //   If the card was Skull instead:
      t=F                  //    If the Fates-flag is inactive
        *w                 //    or the amount of wishes is smaller than 1
        *W<1?              //    or the wishes used flag is inactive
         1                 //     Set the turn-counter to 1
        :                  //    Else:
         -1;               //     Set the turn-counter to -1 (none)
      F=0;}                //    Then set the Fates-flag to inactive
    else if(c>19){         //   If the card was Fool or Jester instead:
      t+=t>0?              //    If the turn-counter was not 0 or -1 (none):
          j                //     Increase either by 1 (Fool) or 2 (Jester)
         :                 //    Else:
          0;               //     Leave the turn-counter the same
      j=j%2+1;             //    Fix `j` (2->1; 1->2)
      d--;}                //    And remove the Fool/Jester from the Deck
    if(c>1&c<5             //   If the card drawn was Flames, Rogue or Skull,
       &w                  //   and the amount of wishes is at least 1,
        *W>0){             //   and the wishes used flag is active
      w--;                 //    Decrease the amount of wishes by 1
      W=(int)(Math.random()*3)%2;}
                           //    And set the wishes used flag to one of (0,0,1)
    i-=c==5?               //   If the card drawn was Idiot:
        Math.random()*3+2  //    Decrease the intelligence by 2-5 randomly
       :c==6?              //   Else-if the card drawn was Star:
        -2                 //    Increase the intelligence by 2
       :                   //   Else:
        0;                 //    Leave the intelligence the same
    r+=c>1&c<5             //   If the card drawn was Flames, Rogue or Skull,
       &F>0?               //   and Fates is active
        "F"+(F=0)          //    Append that Fates was used (and make Fates inactive)
       :c>0&c<5?           //   Else-if the card drawn was Moon, Flames, Rogue or Skull:
        "w"+w+"W"+W        //    Append the amount of wishes left and wishes used flag
       :c>4&c<7?           //   Else-if the card drawn was Idiot or Star:
        "i"+i              //    Append the amount of intelligence left
       :                   //   Else:
        "";                //    Append nothing
    if(--t                 //   Decrease the turn-counter by 1
          ==0              //   And if the turn-counter is now 0,
       |(c==5              //   or the card drawn was Idiot,
             &i<4)         //   and the intelligence dropped below 4,
       |c>6&c<10)          //   or the card drawn was Donjon, Void or Talons:
         return r;         //    Return the result of the game
  }                        //  End of loop
}                          // End of method

1
Jester; Fates; Ruin; Euryale; Gem; Ruin; Ruin; Rogue(Fates used) Gem; Balance; Throne; Rogue(wishes left: 0; wishes used: 0); Rogue(wishes left: 0; wishes used: 0);왜 멈췄습니까?
FrownyFrog

@FrownyFrog 감사합니다! 지금 수정해야합니다. 다른 실수를 발견하면 알려주십시오. :)
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.