Draw „Til You Drop”

17

W piątej edycji Dungeons & Dragons (a także w większości innych wydań) istnieje magiczny przedmiot o nazwie Deck of Many Things . Jest to niezwykle potężny przedmiot, ponieważ wszystkie karty mają bardzo silne pozytywne lub negatywne efekty. Aby użyć talii, postać deklaruje liczbę, a następnie dobiera ją do tej liczby kart, z efektami stosowanymi kolejno. Jeśli postać nie losuje wszystkich zadeklarowanych kart, a minęła co najmniej 1 godzina od wyciągnięcia ostatniej karty, reszta kart losowana jest automatycznie i stosowane są efekty. Po losowaniu każdej karty jest ona zwracana do talii, a talia jest tasowana.

Poniżej znajduje się lista efektów losowania każdej karty 1 :

  • Równowaga : Twój umysł cierpi z powodu gwałtownej zmiany, która powoduje zmianę twojego wyrównania. Zgodny z prawem staje się chaotyczny, dobro staje się złem i odwrotnie. Jeśli jesteś naprawdę neutralny lub niezrównany, ta karta nie ma na ciebie wpływu.
  • Kometa : Jeśli w pojedynkę pokonasz kolejnego wrogiego potwora lub grupę potworów, które spotkasz, zdobędziesz punkty doświadczenia wystarczające, aby uzyskać jeden poziom. W przeciwnym razie ta karta nie ma wpływu.
  • Donjon : Znikasz i zostajesz pochowany w stanie zawieszonej animacji w sferze poza wymiarami. Wszystko, co nosiłeś i nosiłeś, pozostaje w miejscu, które zajmowałeś po zniknięciu. Pozostajesz uwięziony, dopóki nie zostaniesz znaleziony i usunięty z kuli. Nie możesz zostać zlokalizowany żadną magią wróżbiarstwa, ale zaklęcie życzeń może ujawnić lokalizację twojego więzienia. Nie dobierasz więcej kart.
  • Euryale . Wizualnie podobny do karty wizerunek przeklina cię. Otrzymujesz karę -2 za rzuty obronne, będąc przeklętym w ten sposób. Tylko bóg lub magia karty Losu może zakończyć tę klątwę.
  • The Fates : Rzeczywistość rozplątuje się i obraca na nowo, pozwalając uniknąć lub usunąć jedno zdarzenie, jakby nigdy się nie wydarzyło. Możesz użyć magii karty natychmiast po jej wyciągnięciu lub w dowolnym innym momencie przed śmiercią.
  • Płomienie : potężny diabeł staje się twoim wrogiem. Diabeł szuka twojej ruiny i nęka twoje życie, delektując się cierpieniem, zanim spróbuje cię zabić. Ta wrogość trwa aż do śmierci albo ciebie, albo diabła.
  • Głupiec : Tracisz 10 000 XP, odrzucasz tę kartę i ponownie dobierasz z talii, licząc oba losowania jako jedną z zadeklarowanych. Jeśli utrata tak dużej liczby punktów doświadczenia spowoduje utratę poziomu, zamiast tego stracisz kwotę, która pozostawi wystarczającą liczbę punktów doświadczenia, aby utrzymać poziom.
  • Klejnot : u twoich stóp pojawia się dwadzieścia pięć sztuk biżuterii o wartości 2000 gp każdy lub pięćdziesiąt klejnotów o wartości 1000 gp każdy.
  • Idiota : Trwale zmniejsz swoją Inteligencję o 1d4 + 1 (do minimalnego wyniku 1). Możesz wyciągnąć jedną dodatkową kartę poza deklarowanymi losowaniami.
  • Jester : Zyskujesz 10 000 XP lub możesz dobrać dwie dodatkowe karty poza zadeklarowanymi losowaniami. Odrzuć tę kartę po jej wyciągnięciu.
  • Klucz : rzadka lub rzadsza magiczna broń, z którą jesteś biegły, pojawia się w twoich rękach. MG wybiera broń.
  • Rycerz : Zyskujesz obsługę myśliwca 4. poziomu, który pojawia się w wybranym przez Ciebie polu w promieniu 30 stóp od ciebie. Wojownik należy do tej samej rasy co ty i służy ci lojalnie aż do śmierci, wierząc, że los przyciągnął go do ciebie. Kontrolujesz tę postać.
  • Księżyc : Masz możliwość rzucenia zaklęcia życzeń 1d3 razy.
  • Łotrzyk : Postać nieplayer wybrana przez GM staje się wroga wobec ciebie. Tożsamość twojego nowego wroga nie jest znana, dopóki NPC lub ktoś inny go nie ujawni. Nic innego jak zaklęcie życzeń lub boska interwencja nie może zakończyć wrogości NPC wobec ciebie.
  • Zniszczenie : wszystkie formy bogactwa, które nosisz lub posiadasz, inne niż przedmioty magiczne, zostają utracone. Przenośne nieruchomości znikają. Firmy, budynki i grunty, które posiadasz, giną w sposób, który w najmniejszym stopniu zmienia rzeczywistość. Znika również wszelka dokumentacja potwierdzająca, że ​​powinieneś posiadać coś utraconego na tej karcie.
  • Czaszka . Przywołujesz awatara śmierci - upiorny humanoidalny szkielet ubrany w poszarpaną czarną szatę i niosący widmową kosę. Pojawia się w przestrzeni wybranej przez GM w odległości 10 stóp od ciebie i atakuje cię, ostrzegając wszystkich innych, że musisz wygrać bitwę sam. Awatar walczy aż do śmierci lub spadnie do 0 punktów życia, po czym znika. Jeśli ktoś próbuje ci pomóc, pomocnik przywołuje własnego awatara śmierci. Stworzenia zabitego przez awatara śmierci nie można przywrócić do życia.
  • Gwiazdka : Zwiększ jeden ze swoich wyników umiejętności o 2. Wynik może przekroczyć 20, ale nie może przekroczyć 24.
  • Słońce : zyskujesz 50 000 XP, aw twoich rękach pojawia się cudowny przedmiot (który losowo określa MG).
  • Szpony : Każdy magiczny przedmiot, który nosisz lub nosisz, rozpada się. Artefakty w twoim posiadaniu nie są niszczone, ale znikają.
  • Tron : Zyskujesz biegłość w umiejętności Perswazji i podwajasz premię za biegłość w czekach wykonanych za pomocą tej umiejętności. Ponadto zyskujesz należną własność małej twierdzy gdzieś na świecie. Jednak twierdza jest obecnie w rękach potworów, które musisz wyczyścić, zanim będziesz mógł przejąć twierdzę jako swoją.
  • Wezyr : W dowolnym momencie w ciągu jednego roku od wyciągnięcia tej karty możesz zadać pytanie podczas medytacji i otrzymać w myślach prawdziwą odpowiedź na to pytanie. Oprócz informacji, odpowiedź pomaga rozwiązać zagadkowy problem lub inny dylemat. Innymi słowy, wiedza zawiera mądrość, jak ją zastosować.
  • Pustka : ta czarna karta oznacza katastrofę. Twoja dusza jest pobierana z twojego ciała i zawarta w obiekcie w miejscu wybranym przez GM. Jedna lub więcej potężnych istot strzeże tego miejsca. Podczas gdy twoja dusza jest uwięziona w ten sposób, twoje ciało jest obezwładnione. Zaklęcie życzeń nie może przywrócić twojej duszy, ale zaklęcie ujawnia położenie obiektu, który ją trzyma. Nie dobierasz więcej kart.

(opisy kart skopiowane z 5. edycji D&D SRD )

Niektórzy szczególnie głupi gracze losują dużą liczbę kart jednocześnie, mając nadzieję, że zdobędą przynajmniej jeden potężny dar, aby zrównoważyć szkodliwe karty. Jak można się spodziewać, często skutkuje to śmiercią lub niemożnością ciągnięcia kart.

Wyzwanie

Symuluj powtarzanie losowania z 22-kartowej talii wielu rzeczy , generując każdą wyciągniętą kartę, zatrzymując się tylko wtedy, gdy zostanie spełniony jeden z następujących warunków:

  • Matryce znakowe (przez rysunek czaszki , rysunek lub 5 kart po ciągnieniu Flames czy Rogue , bez korzyści losów lub Księżyc aktywny 2 ).
  • Postać nie jest w stanie dobrać większej liczby kart (poprzez efekty Donjona , Szponów , Pustki 3 lub obniżenia wyniku Inteligencji postaci do 3 lub niższej przez Idiota 4 ).

Zasady

  • Wyrównanie postaci, poziom, XP i przedmioty inne niż talia nie mają znaczenia.
  • Wynik Inteligencji postaci zaczyna się od 10.
  • Nie ma maksymalnego limitu Inteligencji postaci ani jej pełnego wykorzystania życzeń .
  • Wykorzystanie losów nie kumuluje się.
  • Życzeniem czar ma szansę 1-w-3 powodując postać, aby nigdy nie być w stanie korzystać z życzeń znowu zaklęcia, oprócz zwykłej skutku. Jeśli tak się stanie, postać nie będzie już mogła użyć zaklęcia do zanegowania Płomieni , Łotra lub Czaszki - moc Losów jest ich jedyną ucieczką.
  • Postać zawsze dokonuje następujących wyborów:
    • Losy i Księżyc służą wyłącznie do wyrwania postaci z kłopotów z Czaszki , Płomieni i Łotra . Postać nigdy nie użyje ich do odwrócenia efektu Szponów lub życzenia zaklęcia których nie można ponownie rzucić, i nie może użyć ich do odwrócenia efektów Donjonu i Pustki . Postać natychmiast użyje jednego zaklęcia życzeń, aby zignorować efekty Czaszki , Płomieni lub Łotra po narysowaniu jednego z nich, i zawsze będzie to skuteczne. Postać zawsze użyje Losu przed użyciemżyczę .
    • Postać zawsze wybiera losowanie większej liczby kart z efektami Idioty i Błazna (odpowiednio).
    • Efekt Gwiazdy jest zawsze wykorzystywany do zwiększenia Inteligencji o 2, aby uniknąć konieczności przerywania losowania kart poprzez efekt Idioty .
  • Przywołany przez Rycerza sojusznik NPC nie jest wystarczająco silny, aby uratować postać przed przedwczesną śmiercią.
  • Jakikolwiek wzrost lub spadek do Inteligencji (poprzez Gwiazdy lub Idioty ) musi zostać odzwierciedlony w danych wyjściowych (albo poprzez odnotowanie zmiany ( +2lub -(1d4+1)), albo poprzez wyprowadzenie bieżącego wyniku Inteligencji po wystąpieniu efektu).
  • Wszelkie zmiany liczby wykorzystanych życzeń, które postać zgromadziła, muszą podobnie zostać odzwierciedlone w danych wyjściowych, w tym życzenie, które powoduje, że postać nie będzie mogła dłużej używać życzeń .
  • Wszystkie losowe wybory pochodzą z jednolitych rozkładów dyskretnych.
  • Możesz wybrać dowolny zestaw 22 różnych wyjść do wydrukowania dla wyciągniętych kart - nazwy kart nie muszą być używane.
  • Możesz generować zmiany w Inteligencji, życzenie wykorzystywać i chcieć, że nie będą nadawać się do użycia w jakikolwiek spójny, jednoznaczny sposób, jaki wybierzesz.
  • Postać może użyć życzenia lub mocy Losów, aby uniknąć śmierci, jeśli odpowiednia karta zostanie dobrana jako piąta po wylosowaniu Łotrzyk lub Płomień . Tylko, jeżeli życzenie jest bezużyteczne lub wszystkie z nich zostały użyte, a Losy nie zostały wylosowane na czas lub zostały już wykorzystane, postać umrze.
  • Oszukać i Jester są odrzucane po ich wyciągnąć. Wszystkie pozostałe karty są natychmiast wracane do talii, a następnie tasuje się je.
  • Jeśli istnieje wiele ładunków Łotrów i / lub Płomienia, aktywnych jest tylko jedno użycie Losów lub życzenie jest konieczne, aby rozproszyć je wszystkie.
  • Losowanie wielu kart jednocześnie przez Błazna lub Błazna nie przesuwa licznika tur na Płomienie i / lub Łotr .

Przykłady

Każda linia reprezentuje sekwencję losowań. Zmiany w Inteligencji i zastosowania życzeń są pokazane przez bieżącą wartość w nawiasach. CObok życzeń użytku oznacza, że pragnienie nie może być już używane. A Foznacza, że ​​moc Losów została użyta, aby uniknąć śmierci. Dodatkowe komentarze podano w celach wyjaśniających, w formie komentarzy w stylu Pythona.

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

Wdrożenie referencyjne

#!/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]: Technicznie istnieją dwa warianty: jeden z 13 kartami i jeden z 22 kartami. Martwi nas tylko pełna wersja z 22 kartami.

[2]: Płomień i Łotrzyk zwykle nie zabijają postaci, ale zakłada się, że wrogi NPC znalazł i zabił głupią postać po tym, jak zdąży wyciągnąć jeszcze 5 kart. Widmo przywołane przez Czaszkę jest niezwykle trudne do walki i zakłada się, że postać nie wygrywa. Tylko boska / magiczna interwencja za pośrednictwem The Fates lub Moon może uratować głupią postać przed śmiercią dzięki tym 3 kartom.

[3]: Zakładamy, że przyjaciele postaci są wystarczająco sprytni, aby nie próbować ratować postaci i pozwolić jej na dobranie większej liczby kart.

[4]: Wynik Inteligencji wynoszący 3 jest mniej więcej równoważny dzikiemu zwierzęciu, które nie byłoby w stanie aktywnie wybrać karty do dobrania.

Mego
źródło
Może warto podać jeszcze kilka przykładowych przebiegów, w których a) wygasa pięć tur, najlepiej z niektórymi kartami bonusowymi dobieranymi pomiędzy, b) losy losowane są dwukrotnie, z wykorzystaniem i bez użycia pomiędzy nimi.
Martin Ender
Twoja referencyjna implementacja nie pozwala wygasnąć życzeniu, jeśli zostanie użyte w momencie, gdy Księżyc jest rysowany. I nie sprawdza również, czy już wygasły.
Martin Ender
Jeszcze jedno: oryginalne zasady D&D wspominają o dodatkowych kartach dla wszystkich Idioty, Błaznów i Błaznów. Twoje zasady najpierw mówią, że gracz losuje dodatkową kartę dla Idioty i Błazna, a następnie wyjaśniają licznik reguł dla Błazna i Błazna, a twoja implementacja wydaje się wyciągać tylko dodatkowe karty dla Błazna i Błazna. Czy możesz to wyjaśnić / naprawić?
Martin Ender
2
@steenbergh Na początku też czytałem obok, ale „ Po wyciągnięciu każdej karty jest ona zwracana do talii i tasowana. ”. Tylko Głupiec i Błazen zostaną usunięte po wyciągnięciu, wszystko inne zostanie ponownie umieszczone w talii i przetasowane za każdym razem, zanim zostanie wyciągnięta nowa karta.
Kevin Cruijssen

Odpowiedzi:

4

JavaScript (ES6), 379 bajtów

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)}

Bez golfa

Objaśnienie wyników

Zakres kart wynosi od 0 do 21 w następujący sposób:

  • 0: Losy
  • 1: Głupiec
  • 2: Jester
  • 3: Czaszka
  • 4: Donjon
  • 5: Pustka
  • 6: Szpony
  • 7: Płomienie
  • 8: Łotrzyk
  • 9: Księżyc
  • 10: Idiota
  • 11: Gwiazda
  • 12 choć 21: Słońce, tron, klucz, rycerz, ruina, Euryale, wezyr, kometa, klejnot, równowaga

Odwrócenie Skull, Flames lub Rogue poprzez The Fates jest oznaczone symbolem 0.


JavaScript (ES6), 792 bajty

Poprzednia wersja korzystająca z nazw kart, zanim dowiedziałam się, że dozwolone są 22 odrębne wyjścia.

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)

Bez golfa

darrylyeo
źródło
2
@Mego szczerze mówiąc, naprawdę nie dostałem go tak dobrze, jak powinienem, dopóki nie zobaczyłem tej odpowiedzi, było dobrze zrobione; łatwe do zrozumienia, gdy zobaczysz pełne nazwy. Jeśli to zmienisz, czy możesz zachować wersję z pełnymi nazwami?
Magic Octopus Urn
@MagicOctopusUrn Na pewno zachowam obecną pełną nazwę w przyszłości.
darrylyeo
@Mego było skierowane do OP i po prostu mówiło: „wersja z wypisanymi rzeczywistymi nazwami kart sprawiła, że ​​implementacja jest łatwa do odczytania. Jeśli zgolisz bajty, zachowaj także ten, oznaczony jako„ nieprzygotowany ”.
Magic Octopus Urn
@MagicOctopusUrn Zaktualizowano.
darrylyeo
0

Kotlin , 1173 bajtów

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}}}

To też można uruchomić. - Wypróbuj online!

Prawdopodobnie jest wiele błędów ... daj mi znać w komentarzach!

Trenton Telge
źródło
Drukowanie w nieskończonej pętli Foollub Jester.
FrownyFrog,
0

Java 8, 481 480 bajtów

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;}}

Przeniesiono implementację referencji Python3 w Javie, a następnie przełożyliśmy ją w golfa. Można zdecydowanie grać w golfa więcej, ale to tylko wstępna wersja, aby upewnić się, że wszystko zrobiłem poprawnie.

Jeśli ktoś zauważy jakiekolwiek błędy ( nie zaskoczyłoby mnie, gdyby były jakieś EDYCJA: Naprawiono już siedem lub osiem błędów, odkąd to opublikowałem ...), daj mi znać.

Wyjścia kart:

0: Losy
1: Księżyc
2: Płomienie
3: Łotrzyk
4: Czaszka
5: Idiota
6: Gwiazda
7/ 8/ 9: Donjon / Pustka / Szpony
20 / 21: Głupiec / Błazen

10-19: wszystko inne (Słońce / Tron / Klucz / Rycerz / Ruina / Euryale / Wezyr / Kometa / Klejnot / Równowaga)

Format wyjściowy pozostawionych życzeń, użytych życzeń, pozostawionych danych wywiadowczych i użytej flagi:

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

Wyjaśnienie:

Wypróbuj tutaj lub Wypróbuj tutaj z ładnym wydrukiem .

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
Kevin Cruijssen
źródło
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);Dlaczego to się skończyło?
FrownyFrog,
@FrownyFrog Dzięki! Powinien zostać teraz naprawiony. Jeśli zauważysz inne błędy, daj mi znać. :)
Kevin Cruijssen