Draw 'Til You Drop

17

Dalam Dungeons & Dragons edisi ke-5 (dan juga sebagian besar edisi lainnya), ada item ajaib yang disebut Deck of Many Things . Ini adalah barang yang sangat kuat, karena semua kartu memiliki efek positif atau negatif yang sangat kuat. Untuk menggunakan dek, karakter mendeklarasikan angka, dan kemudian menggambar hingga jumlah kartu itu, dengan efek yang diterapkan secara berurutan. Jika karakter tidak menggambar semua kartu yang mereka nyatakan, dan sudah setidaknya 1 jam sejak kartu terakhir diambil, sisa kartu diambil secara otomatis untuknya dan efek diterapkan. Setelah setiap kartu ditarik, kartu dikembalikan ke geladak, dan geladak dikocok.

Berikut ini adalah daftar efek menggambar masing-masing kartu 1 :

  • Saldo : Pikiran Anda mengalami perubahan yang memilukan, menyebabkan perataan Anda berubah. Sah menjadi kacau, baik menjadi jahat, dan sebaliknya. Jika Anda benar-benar netral atau tidak selaras, kartu ini tidak berpengaruh pada Anda.
  • Comet : Jika Anda sendiri mengalahkan monster bermusuhan berikutnya atau sekelompok monster yang Anda temui, Anda mendapatkan poin pengalaman yang cukup untuk mendapatkan satu tingkat. Kalau tidak, kartu ini tidak akan berpengaruh.
  • Donjon : Anda menghilang dan menjadi terkubur dalam keadaan mati suri dalam lingkup ekstradimensional. Segala sesuatu yang Anda kenakan dan bawa tetap berada di belakang di ruang yang Anda duduki saat Anda menghilang. Anda tetap dipenjara sampai Anda ditemukan dan dikeluarkan dari bola. Anda tidak dapat ditemukan oleh sihir ramalan apa pun, tetapi mantra harapan dapat mengungkapkan lokasi penjara Anda. Anda tidak menggambar kartu lagi.
  • Euryale . Wajah seperti kartu medusa mengutuk Anda. Anda mengambil penalti -2 untuk menyelamatkan lemparan sambil dikutuk dengan cara ini. Hanya dewa atau keajaiban kartu Takdir yang bisa mengakhiri kutukan ini.
  • The Fates : Reality's fabric mengurai dan berputar lagi, memungkinkan Anda untuk menghindari atau menghapus satu peristiwa seolah-olah itu tidak pernah terjadi. Anda dapat menggunakan sihir kartu segera setelah Anda menarik kartu atau pada waktu lain sebelum Anda mati.
  • Api : Setan yang kuat menjadi musuhmu. Iblis mencari kehancuran Anda dan mengganggu hidup Anda, menikmati penderitaan Anda sebelum mencoba membunuh Anda. Permusuhan ini berlangsung sampai Anda atau iblis mati.
  • Bodoh : Anda kehilangan 10.000 XP, membuang kartu ini, dan menggambar dari dek lagi, menghitung kedua draw sebagai salah satu draw yang Anda nyatakan. Jika kehilangan XP sebanyak itu akan menyebabkan Anda kehilangan level, Anda malah kehilangan jumlah yang membuat Anda memiliki cukup XP untuk mempertahankan level Anda.
  • Permata : Dua puluh lima potong perhiasan masing-masing berharga 2.000 gp atau lima puluh permata senilai 1.000 gp muncul di kaki Anda.
  • Idiot : Kurangi Intelijen Anda secara permanen sebesar 1d4 + 1 (hingga skor minimum 1). Anda dapat menggambar satu kartu tambahan di luar undian yang Anda nyatakan.
  • Jester : Anda mendapatkan 10.000 XP, atau Anda dapat menggambar dua kartu tambahan di luar undian yang Anda nyatakan. Buang kartu ini setelah menariknya.
  • Kunci : Senjata ajaib yang langka atau langka yang Anda mahir muncul di tangan Anda. GM memilih senjata.
  • Ksatria : Anda mendapatkan layanan dari pejuang tingkat 4 yang muncul di ruang yang Anda pilih dalam jarak 30 kaki dari Anda. Pejuang itu dari ras yang sama seperti Anda dan melayani Anda dengan loyal sampai mati, percaya nasib telah menariknya kepada Anda. Anda mengontrol karakter ini.
  • Bulan : Anda diberikan kemampuan untuk mengucapkan mantra permintaan 1d3 kali.
  • Rogue : Karakter bukan pemain pilihan GM menjadi memusuhi Anda. Identitas musuh baru Anda tidak diketahui sampai NPC atau orang lain mengungkapkannya. Tidak kurang dari mantra harapan atau intervensi ilahi dapat mengakhiri permusuhan NPC terhadap Anda.
  • Hancur : Semua bentuk kekayaan yang Anda bawa atau miliki, selain benda ajaib, hilang untuk Anda. Properti portabel lenyap. Bisnis, bangunan, dan tanah milik Anda hilang dengan cara yang mengubah kenyataan. Dokumentasi apa pun yang membuktikan bahwa Anda memiliki sesuatu yang hilang dari kartu ini juga hilang.
  • Tengkorak . Anda memanggil avatar kematian - kerangka hantu humanoid berpakaian jubah hitam compang-camping dan membawa sabit spektral. Itu muncul di ruang pilihan GM dalam jarak 10 kaki dari Anda dan menyerang Anda, memperingatkan semua orang lain bahwa Anda harus memenangkan pertempuran sendirian. Avatar itu berkelahi sampai Anda mati atau turun ke 0 poin hit, dan kemudian menghilang. Jika ada yang mencoba membantu Anda, penolong itu memanggil avatar kematiannya sendiri. Makhluk yang dibunuh oleh avatar kematian tidak dapat dipulihkan.
  • Bintang : Tingkatkan satu dari skor kemampuan Anda sebesar 2. Skor tersebut dapat melebihi 20 tetapi tidak dapat melebihi 24.
  • Sun : Anda mendapatkan 50.000 XP, dan item menakjubkan (yang ditentukan GM secara acak) muncul di tangan Anda.
  • Cakar : Setiap benda ajaib yang Anda kenakan atau bawa hancur. Artefak yang Anda miliki tidak dihancurkan tetapi musnah.
  • Tahta : Anda memperoleh kemahiran dalam keterampilan Persuasi, dan Anda menggandakan bonus kemahiran Anda pada cek yang dibuat dengan keterampilan itu. Selain itu, Anda mendapatkan kepemilikan sah dari tempat kecil di suatu tempat di dunia. Namun, penyimpanan saat ini ada di tangan monster, yang harus Anda bersihkan sebelum Anda dapat mengklaim menyimpannya sebagai milik Anda.
  • Wazir : Kapan saja Anda memilih dalam satu tahun menggambar kartu ini, Anda dapat mengajukan pertanyaan dalam meditasi dan secara mental menerima jawaban yang jujur ​​untuk pertanyaan itu. Selain informasi, jawabannya membantu Anda memecahkan masalah yang membingungkan atau dilema lainnya. Dengan kata lain, pengetahuan itu datang dengan kebijaksanaan tentang bagaimana menerapkannya.
  • The Void : Kartu hitam ini berarti bencana. Jiwa Anda diambil dari tubuh Anda dan terkandung dalam sebuah objek di tempat pilihan GM. Satu atau lebih makhluk kuat menjaga tempat itu. Sementara jiwa Anda terjebak dengan cara ini, tubuh Anda tidak mampu. Mantra harapan tidak dapat memulihkan jiwa Anda, tetapi mantera tersebut mengungkapkan lokasi objek yang menyimpannya. Anda tidak menggambar kartu lagi.

(deskripsi kartu disalin dari D & D SRD edisi ke-5 )

Beberapa pemain bodoh biasanya akan menarik sejumlah besar kartu sekaligus, berharap mendapatkan setidaknya satu anugerah yang kuat untuk menyeimbangkan kartu yang merugikan. Seperti yang diduga, ini sering mengakibatkan kematian karakter atau ketidakmampuan untuk terus menggambar kartu.

Tantangan

Simulasikan gambar berulang dari Deck 22 Many card, mengeluarkan setiap kartu yang diambil, berhenti hanya ketika salah satu dari kondisi berikut dipenuhi:

  • Karakter mati (melalui menggambar Tengkorak , atau menggambar 5 kartu setelah menggambar Api atau Nakal , tanpa manfaat dari Nasib atau Bulan aktif 2 ).
  • Karakter tidak mampu menggambar lebih banyak kartu (melalui efek Donjon , Talons , The Void 3 , atau skor Intelijen karakter turun menjadi 3 atau lebih rendah melalui Idiot 4 ).

Aturan

  • Penyelarasan karakter, level, XP, dan harta benda selain dek tidak menjadi masalah.
  • Skor Kecerdasan karakter dimulai dari 10.
  • Tidak ada batas maksimum untuk Intelijen karakter atau penggunaan keinginan yang mereka miliki .
  • Penggunaan Takdir tidak menumpuk.
  • The keinginan mantra memiliki 1-in-3 kesempatan menyebabkan karakter untuk tidak pernah bisa menggunakan keinginan mantra lagi, selain efek reguler. Jika ini terjadi, karakter tidak dapat lagi menggunakan mantra untuk meniadakan Flames , Rogue , atau Skull - kekuatan The Fates adalah satu-satunya jalan mereka.
  • Karakter selalu membuat pilihan berikut:
    • The Fates and Moon hanya digunakan untuk mendapatkan karakter keluar dari masalah dari Skull , Flames , dan Rogue . Karakter tidak akan pernah menggunakannya untuk membalikkan efek Talons atau mantra harapan yang tidak dapat dilemparkan lagi, dan tidak dapat menggunakannya untuk membalikkan efek Donjon dan The Void . Karakter akan segera menggunakan satu mantra harapan untuk meniadakan efek Skull , Flames , atau Rogue saat menggambar salah satunya, dan itu akan selalu berhasil. Karakter akan selalu menggunakan Takdir sebelum digunakanberharap .
    • Karakter selalu memilih untuk menggambar lebih banyak kartu dengan efek Idiot dan Jester (tepat).
    • Efek Star selalu digunakan untuk meningkatkan Intelligence sebesar 2, untuk menghindari keharusan berhenti menggambar kartu melalui efek Idiot .
  • Sekutu NPC yang dipanggil oleh Knight tidak cukup kuat untuk menyelamatkan karakter dari kematian mereka sebelum waktunya.
  • Setiap kenaikan atau penurunan ke Intelijen (melalui Star atau Idiot , masing-masing) harus tercermin dalam output (baik dengan mencatat perubahan ( +2atau -(1d4+1)), atau dengan menghasilkan skor Intelijen saat ini setelah efek terjadi).
  • Setiap perubahan pada jumlah permintaan yang digunakan karakter yang telah ditimbun juga harus tercermin dalam output, termasuk keinginan yang menyebabkan karakter tidak dapat menggunakan keinginan lagi.
  • Semua pilihan acak berasal dari distribusi diskrit seragam.
  • Anda dapat memilih 22 output yang berbeda untuk dikeluarkan untuk kartu yang diambil - nama kartu tidak harus digunakan.
  • Anda dapat menghasilkan perubahan dalam Intelijen, penggunaan keinginan , dan keinginan menjadi tidak dapat digunakan dengan cara apa pun yang Anda pilih secara konsisten dan jelas.
  • Karakter dapat menggunakan keinginan atau kekuatan Takdir untuk menghindari kematian jika kartu yang sesuai diambil sebagai kartu kelima setelah menggambar Rogue atau Flames . Hanya jika keinginan tidak dapat digunakan atau semua penggunaan telah digunakan, serta Nasib tidak ditarik dalam waktu atau telah digunakan, karakter akan mati.
  • Fool dan Jester dibuang setelah ditarik. Semua kartu lainnya segera dikembalikan ke geladak, dan geladak kemudian dikocok.
  • Jika ada beberapa tumpukan Rogue dan / atau Flame aktif, hanya satu penggunaan Takdir atau keinginan diperlukan untuk menghilangkan semuanya.
  • Menggambar banyak kartu sekaligus melalui Jester atau Fool tidak memajukan turn counter pada Flames dan / atau Rogue .

Contohnya

Setiap garis mewakili urutan undian. Perubahan ke Intelijen dan penggunaan keinginan ditunjukkan oleh nilai saat ini dalam tanda kurung. Di Csebelah permintaan digunakan menunjukkan bahwa keinginan tidak dapat digunakan lagi. A Fmenunjukkan bahwa kekuatan Takdir digunakan untuk menghindari kematian. Komentar tambahan disediakan untuk tujuan penjelasan, dalam bentuk komentar gaya 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

Implementasi Referensi

#!/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]: Secara teknis, ada dua varian: satu dengan 13 kartu, dan satu dengan 22 kartu. Kami hanya khawatir tentang versi 22 kartu lengkap di sini.

[2]: Flame dan Rogue biasanya tidak langsung membunuh karakter, tetapi NPC yang bermusuhan diasumsikan telah menemukan dan membunuh karakter bodoh setelah mereka punya waktu untuk menggambar 5 kartu lagi. Momok yang dipanggil oleh Skull sangat sulit untuk dilawan, dan diasumsikan bahwa karakternya tidak menang. Hanya intervensi ilahi / magis melalui Nasib atau Bulan yang dapat menyelamatkan karakter bodoh dari kematian mereka dengan 3 kartu ini.

[3]: Kami menganggap teman-teman karakter cukup pintar untuk tidak mencoba menyelamatkan karakter dan memungkinkan mereka untuk menggambar lebih banyak kartu.

[4]: Skor Kecerdasan 3 kira-kira setara dengan hewan liar, yang tidak akan dapat secara aktif membuat pilihan untuk menggambar kartu.

Mego
sumber
Sandbox
Mego
Mungkin lebih baik untuk memasukkan beberapa contoh lagi berjalan di mana a) lima belokan kedaluwarsa, idealnya dengan beberapa kartu bonus ditarik di antara, b) nasib ditarik dua kali, dengan dan tanpa memanfaatkannya di antaranya.
Martin Ender
Implementasi referensi Anda tidak membiarkan harapan berakhir jika digunakan saat Moon ditarik. Dan juga tidak memeriksa apakah sudah kadaluarsa.
Martin Ender
Satu hal lagi: aturan D & D asli menyebutkan kartu tambahan untuk semua Idiot, Fool dan Jester. Aturan Anda pertama-tama menyatakan bahwa pemain menggambar kartu tambahan untuk Idiot dan Jester, tetapi kemudian mengklarifikasi penghitung aturan untuk Fool dan Jester, dan implementasi referensi Anda tampaknya hanya menggambar kartu tambahan untuk Fool dan Jester. Bisakah Anda mengklarifikasi / memperbaikinya?
Martin Ender
2
@steenbergh Saya juga membaca melewatinya pada awalnya, tetapi " Setelah masing-masing kartu ditarik, dikembalikan ke geladak, dan geladak dikocok. ". Hanya Fool dan Jester yang akan dihapus ketika ditarik, semua yang lain ditempatkan di geladak lagi dan diacak ulang setiap kali sebelum kartu baru diambil.
Kevin Cruijssen

Jawaban:

4

JavaScript (ES6), 379 byte

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

Tidak disatukan

Penjelasan Output

Kisaran kartu 0-21 sebagai berikut:

  • 0: Nasib
  • 1: Bodoh
  • 2: Jester
  • 3: Tengkorak
  • 4: Donjon
  • 5: Batal
  • 6: Cakar
  • 7: Api
  • 8: Nakal
  • 9: Bulan
  • 10: Idiot
  • 11: Bintang
  • 12 meskipun 21: Matahari, Singgasana, Kunci, Ksatria, Kehancuran, Euryale, Wazir, Komet, Permata, Saldo

Pembalikan Skull, Flames, atau Rogue via The Fates dilambangkan dengan a 0.


JavaScript (ES6), 792 byte

Versi sebelumnya menggunakan nama kartu, sebelum saya tahu bahwa 22 output berbeda diizinkan.

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)

Tidak disatukan

Darrylyeo
sumber
2
@Mego jujur, saya tidak benar-benar mendapatkannya sebaik yang seharusnya saya lakukan sampai melihat jawaban ini, dilakukan dengan baik; mudah dimengerti ketika melihat nama lengkapnya. Jika Anda mengubahnya, bisakah Anda menyimpan versi dengan nama lengkap?
Magic Gurita Guci
@MagicOctopusUrn Tentu saja, saya pasti akan mempertahankan versi nama lengkap saat ini di masa depan.
darrylyeo
@Mego itu diarahkan pada OP, dan hanya mengatakan "versi dengan nama kartu yang sebenarnya dieja sepenuhnya membuat implementasi ini mudah dibaca. Jika Anda mencukur byte, simpan yang ini juga, berlabel 'ungolfed'".
Magic Gurita Guci
@MagicOctopusUrn Diperbarui.
darrylyeo
0

Kotlin , 1173 bytes

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

Ini runnable juga. - Cobalah online!

Mungkin ada banyak bug ... beri tahu saya di komentar!

Trenton Telge
sumber
Pencetakan loop tak terbatas Foolatau Jester.
FrownyFrog
0

Java 8, 481 480 byte

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

Melakukan porting implementasi referensi Python3 di Java, dan kemudian memutarnya. Pasti bisa bermain golf lebih banyak, tetapi ini hanya versi awal untuk memastikan saya melakukan semuanya dengan benar.

Jika ada yang menemukan kesalahan ( tidak akan mengejutkan saya jika ada EDIT: Sudah diperbaiki seperti tujuh atau delapan kesalahan sejak saya memposting ini ..), tolong beri tahu saya.

Output kartu:

0: Nasib
1: Bulan
2: Api
3: Nakal
4: Tengkorak
5: Idiot
6: Bintang
7/ 8/ 9: Donjon / Void / Cakar
20/ 21: Fool / Jester

10-19: yang lainnya (Sun / Throne / Key / Knight / Ruin / Euryale / Wazir / Comet / Gem / Balance)

Format output untuk keinginan yang tersisa, keinginan yang digunakan, intelijen yang tersisa, dan bendera yang digunakan:

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

Penjelasan:

Cobalah di sini atau Coba di sini dengan hasil cetak yang cantik .

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
sumber
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);Mengapa itu berhenti?
FrownyFrog
@FrownyFrog Terima kasih! Harus diperbaiki sekarang. Jika Anda menemukan kesalahan lain, beri tahu saya. :)
Kevin Cruijssen