模拟掷骰子游戏


18

掷骰子是一种非常简单的骰子游戏,通常在赌场中玩。即使您不是赌徒(我不是),它仍然是一个相当有趣的游戏。规则如下:

在骰子的游戏开始有所谓的脱出轮。播放器掷出两个d6(六个面的骰子),并添加了两个骰子。如果结果是7或11,则该人自动获胜(这称为自然)。如果结果是2、3或12,则此人会自动丢失(这称为淘汰)。否则,将结果设置为圆点的点。

此后,积分回合开始。在积分回合中,玩家必须连续掷出2 d6s,直到该人从上一回合掷出7分或他/她的积分。如果该人掷出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]中添加两个统一随机值相同的分布中选择[1,12]中的随机值怎么办?
Mego

@Mego Whoa,旧挑战。是的,那很好。我认为警告主要是为了确保人们意识到[1,12]之间的均匀分布与2d6不同。我会重写一点。
意大利面条

Answers:


6

红宝石164

非常简单。有趣的功能:

cr漏案例汇总为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,所以不知道它是否会更短。


1
努力说明您如何获得该魔术数字以及它如何工作?
Karl Napf '16

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
只要它在某个地方编译,就可以了。
lirtosiast,2015年

@Mego感谢您指出这一点,从而设法摆脱了19个字节。
克里斯·卢南

得到了更多的一些关除暴安良ab也使用与三元运营商一起扣除法。
克里斯·洛南

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"

感谢Mego提供2个字节!


几个问题。如果滚动不是自然的或胡扯的话,它不会打印出“ Point:”,后跟数字。另外,:和数字之间应该有一个空格。
意大利面条

哎呀!修复了不打印“ Point:#”的问题。在输出中,有一个空格。
Celeo,2015年

喔好吧。我不再使用Python了,所以我不确定.a的工作方式。
意大利面条

我在Python 3中将代码降低到198,而在Python 2中降低到192。
lirtosiast

@ThomasKwa如果您投入大量工作,请将其作为单独的答案发布,以便获得一些代表。
Celeo,2015年

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拼写为“ Natural”,而不是“ Naturel”。
Kritixi Lithos

改了 谢谢
Jeroen 2015年

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个字节

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}

在线尝试!


1

PowerShell中181个 183 179 178 167 165字节

-10字节归功于mazzy
-2字节归功于Xcali

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个字节
6

我认为条件-notin (7,$z)与规则无关During the point round, the player must continuously roll ... the previous round。现在,循环$m等于7第一轮时结束。
疯狂

1
@mazzy这是问题中的措辞问题。只有两回合。您在Come-out回合中只设置一次Point ,这是整个Point回合的目标数。该previous roundCome-out
Veskah

1
谢谢。168个字节
6

2
通过1?从胡扯正则表达式中删除,您应该还可以再摘两笔。
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

Pyth,108个字节

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

在线尝试!

初次通过,可能会发现一些节省。


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,并且种子是系统时间,导致大量重复值运行),此方法可以正常工作。

说明

条目位于第二行,因为直到第一行都是滚动两个骰子并将它们相加的函数。

程序流,展开了一些边缘包装和卷曲的重定向,以提高可读性

   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 "字符串的长度),只有4条NOP指令()很难删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.