クラップスのゲームをシミュレートする


18

クラップスは、カジノでよくプレイされるかなりシンプルなサイコロゲームです。あなたがギャンブラーでなくても(私はそうではありませんが)、それでもかなり面白いゲームです。ルールは次のとおりです。

クラップスのゲームの開始時に呼ばれるものがありますカムアウトラウンド。プレイヤーは2つのd6(6面ダイス)を振って、2つのダイスを追加します。結果が7または11の場合、その人が自動的に勝ちます(これは自然として知られています)。結果が2、3、または12の場合、その人は自動的に負けます(これは拍手crとして知られています)。それ以外の場合、結果はポイントラウンドのポイントとして設定されます。

この後、ポイントラウンドが始まります。ポイントラウンド中、プレイヤーは前のラウンドから7または彼/彼女のポイントをロールするまで、連続して2 d6sをロールしなければなりません。人が7を振った場合、負けとなります。彼らがポイントを転がすと、彼らは勝ちます。

チャレンジ

がらくたのゲームをシミュレートする単純なプログラムを実装します。ユーザーがカムアウトラウンド中にナチュラルまたはクラップアウトをロールした場合、プログラムは「Natural:」または「Crapping out:」を出力し、その後にサイコロを出して終了します。それ以外の場合は、「Point:」に続いてポイントが出力されます。次に、ポイントラウンド中に、7またはポイントに達するまで、すべてのダイロールを出力する必要があります。人が勝った場合、出力する必要があります"Pass"。彼らがそれを失えば出力する必要があります"Don't Pass"

参照実装

Groovy、277バイト

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

オンラインでお試しください。

サンプル出力

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

そして

Point: 5
3
7
Don't Pass

これはなので、最短のコードが優先されます。

(免責事項:このチャレンジは、ギャンブルを促進することを意図したものではありません。家は常に勝ちます。)


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]の2つの一様なランダム値を追加するのと同じ分布から[1、12]のランダム値を選択するのはどうですか?
メゴ

@Megoおっ、古い挑戦。はい、それは結構です。警告は、ほとんどの場合、[1、12]間の均一な分布が2d6と同じではないことを人々が認識できるようにするためだけのものだと思います。少し書き直します。
spaghetto

回答:


6

ルビー164

とても簡単です。興味深い機能:

不足するケースはとして要約されr%12<4、残りの自然なケースはとして要約されr%4==3ます。

最初の文字列はに格納されc、これが単一の文字よりもアルファベット順になっている場合にのみ、さらにロールが取られ?Pます(これはでのみ発生し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")

2,3,7,11または12の代わりに、残りを個別にチェックする方法が大好きです!
Jeroen

6

Python 3、190バイト

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

これはCeleoの答えに基づいています。いくつかの長い条件を、各番号のLUTをエンコードするマジックナンバーに置き換え、変数を再利用し、他のいくつかのゴルフをしました。ゴルフの余地あり; おそらく170未満になる可能性があります。

Python 2を使おうとはしなかったので、Python 2が短くなるかどうかわかりません。


1
そのマジックナンバーをどのように取得し、どのように機能するかを説明してください
カールナップ

5

C99、 366 312 293 277バイト

これはここでの私の最初の投稿なので、これは大幅に改善できると思います。

#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");}

拡張版

#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");
}

ご覧のとおり、ここにはかなりの量の冗長性がありますが、ほとんどの場合はこれを排除できます。

これを小さくするために@Megoに感謝します。


1
どこかでコンパイルされる限り、あなたは大丈夫です。
リトシアスト

@Megoはそれを指摘してくれてありがとう、それはなんとか19バイトを取り除きました。
クリスルーナム

削除して、三項演算子とともに減算メソッドを使用することでa、もう少し得ましたb
クリスルーナム

5

Python 2、226 224バイト

最初のパスとそこに多くのコードがあります:

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"

2バイトのMegoに感謝します!


これに関するいくつかの問題。ロールが自然なものでもくだらないものでもない場合、「Point:」とそれに続く数字は出力されません。また、:と番号の間にはスペースが必要です。
spaghetto

おっと!「ポイント:#」を印刷しない問題を修正しました。出力にはスペースがあります。
Celeo

ああ 私はもうPythonをあまり使わないので、どのように動作するのか不確かでした。
spaghetto

私はあなたのコードをPython 3で198に落としましたが、Python 2では192です。提案が必要ですか、それとも自分の答えを投稿すべきですか
リスト管理者

@ThomasKwaたくさんの作業を行った場合は、別の回答として投稿してください。
Celeo

3

PHP 230 228 218 199 192 188バイト

186バイト <?

<?$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
";}

コードゴルフの最初の試み!</br>ただし、使用が許可されるかどうかわかりませんか?これはコンソールでは機能しません(新しい行として)。これが許可されておらず、コードが変更される場合はお知らせください。

編集(16-8-16):codegolfで良くなった後、私はいくつかの可能な改善に気づきました。これは、引き続きコマンドラインインターフェイスを使用して機能します。</br>ハード入力に置き換えられました。


Naturalは、「Naturel」ではなく「Natural」と綴られています。
Kritixi Lithos

変更しました。おかげで
イェルーン

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

PowerShellの181の 183 179 178 167 165バイト

mazzyのおかげで-10バイト
Xcaliのおかげで-2バイト

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

オンラインでお試しください!

展開されたバージョン:

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

リスト構築ロジックがスイッチに再構築されたため、いくつかのこだわりがなくなりました。私はそれがまだかなり大丈夫なアプローチだと思います。+2バイトでバグを修正。


1
驚くばかり!それを短くする178バイト
mazzy

条件-notin (7,$z)はルールに関連しないと思いますDuring the point round, the player must continuously roll ... the previous round。これで、ループは、最初のラウンド$mと等しい7か、最初のラウンドで終了します。
mazzy

1
@mazzyそれは質問の文言の問題です。ラウンドは2回のみです。Come-outラウンドでポイントを設定するのは一度だけであり、それがPointラウンド全体の目標番号です。previous round意味Come-outラウンド
Veskah

1
ありがとう。168バイト
mazzy

2
1?クラップス正規表現からを削除することで、さらに2つを削除できるはずです。
Xcali

0

R、197バイト

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

非ゴルフ

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

ルーン文字のエンチャント、151バイト

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"\

オンラインでお試しください!

乱数に関するバグを修正した後('RA呼び出されるたびに再シードが行われ、シードはシステム時間であったため、繰り返し値が大量に実行される)、これは正しく機能します。

説明

エントリーは2行目にあり、最初の行は あります。は、2つのサイコロを振って合計するための関数です。

読みやすくするためにエッジラップおよびカールリダイレクトを展開したプログラムフロー

   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?他の行に必要なスペース(つまり、"Don't "文字列の長さ)のために削除するのが非常に難しいNOP命令()は4つしかありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.