Craps oyununu simüle et


18

Craps, genellikle casinolarda oynanan oldukça basit bir zar oyunudur. Bir kumarbaz olmasanız bile (ki ben değilim), hala oldukça ilginç bir oyun. İşte kurallar:

Bulut bir oyunun başında ne denir var come-out yuvarlak. Oynatıcı iki d6 (altı taraflı kalıp) alır ve iki kalıp silindiri eklenir. Sonuç 7 veya 11 ise, kişi otomatik olarak kazanır (bu doğal olarak bilinir ). Sonuç 2, 3 veya 12 ise, kişi otomatik olarak kaybeder (buna kırılma denir ). Aksi takdirde, sonuç olarak ayarlanır noktaya noktası tur için.

Bundan sonra nokta turu başlar. Nokta turu sırasında, oyuncu bir önceki turdan 7 veya puanını alana kadar oyuncu sürekli olarak 2 d6 döndürmelidir. Kişi 7 yuvarlarsa kaybeder. Puanlarını yuvarlarlarsa kazanırlar.

Meydan okuma

Craps oyununu simüle eden basit bir program uygulayın. Eğer kişi çıkış turu sırasında bir doğal yol ya da bok çıkarırsa, program "Doğal:" ya da "Çıkarma:" ardından kalıp ruloyu çıkarmalı ve sonra çıkmalıdır. Aksi takdirde, "Nokta:" ve ardından nokta çıkmalıdır. Daha sonra, nokta turu sırasında, 7 veya noktaya ulaşılana kadar her kalıp rulosunu çıkarmalıdır. Kişi kazanırsa, çıktı almalıdır "Pass"; eğer kaybederse çıktı almalıdır "Don't Pass".

Referans uygulaması

Groovy, 277 bayt

def a={return Math.random()*6+1};int b=a()+a();(b<4||b==12)?{println"Crapping out: "+b}():{(b==7||b==11)?{println"Natural: "+b}():{println"Point: "+b;for(;;){int x=a()+a();println x;(x==7)?{println"Don't Pass";System.exit(0)}():{if(x==b){println"Pass";System.exit(0)}}()}}()}()

Çevrimiçi deneyin.

Örnek çıktılar

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

ve

Point: 5
3
7
Don't Pass

Bu , bu yüzden en kısa kod kazanır.

(YASAL UYARI: Bu zorluğun kumar oynamayı hiçbir şekilde teşvik etmesi amaçlanmamıştır. Unutmayın, ev her zaman kazanır.)


You can't make your program shorter by picking a random number between 1 and 12 for the die roll; it must be two numbers picked between 1 and 6.- [1, 6] 'da iki eşit rastgele değer eklemeye özdeş bir dağılımdan [1, 12]' de rastgele bir değer seçmeye ne dersiniz?
Mego

@Mego Whoa, eski meydan okuma. Evet bu iyi olabilir. Bence uyarı çoğunlukla insanların [1, 12] arasındaki eşit dağılımın 2d6 ile aynı olmadığını fark etmelerini sağlamaktı. Biraz yeniden yazacağım.
bir spaghetto

Yanıtlar:


6

Yakut 164

Oldukça açık. İlginç özellikler:

Çökme vakaları olarak r%12<4, geri kalan doğal vakalar ise olarak özetlenir r%4==3.

İlk dize saklanır cve başka rulolar yalnızca bu, daha sonra tek harften ?P(yalnızca için geçerli olan) alfabetik olarak alınırsa alınır Point.

f=->{rand(6)+rand(6)+2}
s=0
r=f[]
print c=r%12<4?'Crapping out':r%4==3?'Natural':'Point',": #{r}
"
c>?P&&(until s==r||s==7
p s=f[]end
print s==7?"Don't ":"","Pass")

Bunun yerine, 2,3,7,11 veya 12 için kalanları nasıl kontrol edeceğinizi sevin!
Jeroen

6

Python 3, 190 bayt

from random import*
r=randrange
p=print
a=r(5)+r(5)+2
c=890145//3**a%3
p(['Point:','Crapping out:','Natural:'][c],a)
if c<1:
 while 7!=c!=a:c=r(5)+r(5)+2;p(c)
 p(['Pass',"Don't pass"][c==7])

Bu Celeo'nun cevabına dayanmaktadır ; Bazı uzun şartları, her sayı için bir LUT kodlayan, bir değişkeni yeniden kullanan ve birkaç başka golf yaptıran sihirli bir sayı ile değiştirdim. Golf için hala oda; muhtemelen 170'in altına inmek mümkündür.

Python 2'yi kullanmaya çalışmadım, bu yüzden daha kısa olup olmayacağını bilmiyorum.


1
Bu sihirli numaraya nasıl sahip olduğunuzu ve nasıl çalıştığını açıklamak ister misiniz?
Karl Napf

5

C99, 366 312 293 277 bayt

Bu benim ilk yazım, bu yüzden bunun çok daha geliştirilebileceğini tahmin ediyorum.

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){srand(time(0));s=r+r;int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";if(a){p a,s);return 0;}p"Point:%d\n",c=s);do p"%d\n",s=r+r);while(7-s&&s-c);p(7-s)?"Pass":"Don't pass");}

Genişletilmiş Sürüm

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){
    srand(time(0));
    s=r+r;
    int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";
    if(a) {p a,s);return 0;}
    p"Point:%d\n",c=s);
    do p"%d\n",s=r+r);
    while(7-s&&s-c);
    p(7-s)?"Pass":"Don't pass");
}

Gördüğünüz gibi, burada büyük olasılıkla ortadan kaldırılabilecek iyi bir fazlalık var.

@Mego'ya bunu küçültmeye yardımcı olduğu için teşekkür ederiz.


1
Bir yerde derlendiği sürece, iyisin.
lirtosiast

@Mego, 19 bayttan kurtulmayı başardığını belirttiğin için teşekkürler.
Chris Loonam

Kurtulmanın kapalı biraz daha var ave bhem de üçlü operatörleriyle birlikte çıkarma yöntemi kullanılarak.
Chris Loonam

5

Python 2, 226224 bayt

İlk geçiş ve orada bir sürü kod var:

from random import*
r=randrange
a=r(5)+r(5)+2
if a in[7,11]:print'Natural:',a
elif a in[2,3,12]:print'Crapping out:',a
else:
 print'Point:',a
 b=0
 while b not in[7,a]:b=r(5)+r(5)+2;print b
 print'Pass'if b-7else"Don't pass"

Mego'ya 2 bayt için teşekkürler !


Bununla ilgili birkaç sorun var. "Nokta:" ve ardından rulo doğal veya bok değilse sayı yazdırmaz. Ayrıca,: ve sayı arasında boşluk olmalıdır.
bir

Tüh! 'Nokta: #' yazdırılmaması düzeltildi. Çıktıda bir boşluk var.
Celeo

Ah tamam. Artık Python'u çok fazla kullanmıyorum, bu yüzden nasıl çalıştığından emin değildim.
bir

Kodunuzu Python 3'te 192 olan Python 2'de 192'ye indirdim. Öneriler ister misiniz, yoksa kendi cevabımı mı yayınlamalıyım?
lirtosiast

@ThomasKwa Eğer bir sürü iş koyarsanız, ayrı bir cevap olarak yayınlayın, böylece bunun için bir temsilci alabilirsiniz.
Celeo

3

PHP 230 228 218 199 192 188 Bayt

Olmadan 186 bayt <?

<?$a=rand(1,6)+rand(1,6);$a%4==3?die("Natural: $a"):$a%12<4?die("Crapping out: $a"):print"Point: $a
";while(1){($b=rand(1,6)+rand(1,6))==7?die("Don't Pass"):$b==$a?die("Pass"):print"$b
";}

İlk kod golf denemesi! Kullanmaya </br>izin verilip verilmeyeceğinden emin değil misiniz? Bu bir konsolda işe yaramayacağı için (yeni bir satır olarak). İzin verilmiyorsa ve kodumu değiştirecekse bana bildirin.

EDIT (16-8-16): Codegolf daha iyi olduktan sonra bazı olası gelişmeler fark ettim. Bu hala komut satırı arabirimini kullanarak çalışır. </br>Zor bir girişle değiştirildi .


Doğal "Naturel" değil, "Doğal" olarak yazılır.
Kritixi Lithos

Değiştirdi. Teşekkürler
Jeroen

2

Javascript 262

var r=(x=>Math.floor(Math.random()*6+1)),a=r()+r();if(a<4||a==12){alert("Crapping out: "+a)}else if(a==7||a==11){alert("Natural: "+a)}else{alert("Point: "+a);while(1){var b = r()+r();if(b==a){alert("pass");break}if(b==7){alert("dont't pass");break}alert(""+b)}}

1

Perl 5 , 140 bayt

sub d{1+int rand 6}say$"=($p=&d+&d)%12<4?"Crapping out":$p%4-3?Point:Natural,": $p";if($"gt O){say$_=&d+&d until/7|$p/;say"Don't "x/7/,Pass}

Çevrimiçi deneyin!


1

PowerShell , 181 183 179 178 167 165 bayt

Xcali sayesinde mazzy -2 bayt sayesinde -10 bayt

switch -r($z=&($x={(random 6)+(random 6)+2})){'7|11'{"Natural: $z"}'2|3'{"Crapping out: $z"}default{"Point: $z"
do{($m=&$x)}until($m-in7,$z)"Don't "*!($m-7)+'Pass'}}

Çevrimiçi deneyin!

Kaydedilmemiş sürüm:

#Switch using regex on $z which is...
#&($x={...}) first assigns $x to a scriptblock then calls it, saving the return to $z
switch -r($z=&($x={(random 6)+(random 6)+2})){
    '7|11' {"Natural: $z"}
    '2|3' {"Crapping out: $z"}
    default{
        "Point: $z"

        #Call the diceroll scriptblock until you Pass,
        #while pushing each roll to output
        do{($m=&$x)}
        until($m-in7,$z)
        "Don't "*!($m-7)+'Pass'
    }
}

Liste oluşturma mantığının bir anahtara yeniden inşa edildiği birkaç yapıştırma noktası daha var. Bence hala oldukça iyi bir yaklaşım. Hata giderilen +2 bayt.


1
müthiş! 178 bayta
mazzy

-notin (7,$z)Durumun kuralla ilgili olmadığını düşünüyorum During the point round, the player must continuously roll ... the previous round. Şimdi döngü $meşittir 7veya ilk tura eşittir .
mazzy

1
@mazzy Bu sorudaki bir ifadedir. Sadece iki tur var. Noktayı Come-outturda sadece bir kez ayarladınız ve bu, hedefin tamamı için hedef numaranızdır.Point tur . previous roundAnlamına gelir Come-outyuvarlak
Veskah

1
Teşekkürler. 168 bayt
mazzy

2
1?Craps regex'inizden çıkararak iki tane daha çıkarabilirsiniz .
Xcali

0

R, 197 bayt

 r=sum(sample(6,2,T));if(r%%12<4)cat("Crap Out",r)else if(r%%4==3)cat("Natural",r)else{cat("Point",r);while(T){cat("",q<-sum(sample(6,2,T)));if(q==7){cat(" Don't");break};if(q>r)break};cat(" Pass")}

Ungolfed

r=sum(sample(6,2,T))
if (r%%12<4)  {
    cat("Crap Out",r) 
} else if (r%%4==3) {
    cat("Natural",r)
} else { 
    cat("Point",r)
    while (T) {
        q = sum(sample(6,2,T))
        cat("",q)
        if (q==7) {
            cat(" Don't")
            break
        }
        if (q>r) break
    }
    cat(" Pass")
}

0

Pyth , 108 bayt

p|K?}J+OS6OS6,7 11"Natural"?}J[2 3 12)"Crapping out"k"Point"+": "JI!KW!}Z,7JIq7=Z
+OS6OS6=K"Don't "))+K"Pass

Çevrimiçi deneyin!

İlk geçişte, muhtemelen birkaç tasarruf bulabilirsiniz.


0

Runik Büyüler , 151 bayt

R}}6'RA6'RA2++{{B͍
00B:7=S:b={+?\"Natural: "@>
pping out: "@\:2=}:3=}:c={{++?/"Cra
{:}≠   ?\ 6?;$$k\/ak$00B:$:7≠?\
"Don't "R"Pass"a/\$:$" :tnioP"\

Çevrimiçi deneyin!

Rastgele sayılarla ilgili bir hatayı düzelttikten sonra (her seferinde yeniden tohumlanıyor 'RA çağrıldığında yapıldı ve tohum sistem zamanıydı ve tekrarlanan değerlerin büyük miktarlarda çalışmasına neden oldu) bu doğru çalışıyor.

açıklama

Giriş ikinci satırda, ilk satır yukarı iki zarın yuvarlanması ve toplanması için bir fonksiyon olduğu için giriş ikinci satırdadır.

Bazı kenar sarma ve kıvrılmış yönlendirmeler okunabilirlik için açılmamış olarak program akışı

   R}}6'RA6'RA2++{{B͍                      Roll 2, sum, return
   >00B:7=S:b={+?\                        Entry, make first roll, compare to 7 and 11.
                  "Natural: "@            If true, print "Natural: " and the value, else go down
                 \:2=}:3=}:c={{++?/       Compare to 2, 3, and 12.
"Crapping out: "@                         If true, print "Crapping out: " and the value, else go up
                     \$:$" :tnioP"\       Print "Point: " and value (IP is travelling RTL)
                     /ak$00B:$            Print newline, roll, print
:7≠?\                                     Compare to 7
    \"Don't "R"Pass"ak$$;                 If equal, print a newline and "Don't Pass"
     {:}≠   ?\                            Else compare to initial roll.
             R"Pass"ak$$;                 If equal, print a newline and "Pass"
              6?......ak$00B              Else return to roll loop by printing a newline
                                              and rolling again (. are skipped instructions)

{:}≠...?\.6?Diğer satırlarda gerekli olan alan ( "Don't "dizenin uzunluğu ) nedeniyle kaldırılması çok zor olan sadece 4 NOP talimatı ( ) vardır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.