Mô phỏng một trò chơi của Craps


18

Craps là một trò chơi súc sắc khá đơn giản thường được chơi trong sòng bạc. Ngay cả khi bạn không phải là người chơi cờ bạc (mà tôi không phải), đây vẫn là một trò chơi khá thú vị. Đây là quy tắc:

Khi bắt đầu trò chơi Craps, có một thứ được gọi là vòng đấu ra . Người chơi cuộn hai d6 (chết sáu mặt) và hai cuộn chết được thêm vào. Nếu kết quả là 7 hoặc 11, người đó sẽ tự động chiến thắng (điều này được gọi là tự nhiên ). Nếu kết quả là 2, 3 hoặc 12, người đó sẽ tự động thua cuộc (điều này được gọi là thoát ra ). Mặt khác, kết quả được đặt làm điểm cho vòng điểm.

Sau này, vòng điểm bắt đầu. Trong vòng chơi điểm, người chơi phải liên tục lăn 2 d6 cho đến khi người đó lăn 7 điểm hoặc điểm của mình từ vòng trước. Nếu người đó lăn số 7 thì họ thua. Nếu họ lăn điểm, họ thắng.

Thử thách

Thực hiện một chương trình đơn giản mô phỏng một trò chơi craps. Nếu người đó lăn một vòng tự nhiên hoặc tào lao trong vòng ra, chương trình sẽ xuất ra "Tự nhiên:" hoặc "Bỏ ra:" theo sau là cuộn chết và sau đó thoát ra. Mặt khác, nó sẽ xuất "Điểm:" theo sau là điểm. Sau đó, trong vòng điểm, nó sẽ xuất ra mỗi lần lăn cho đến khi đạt được điểm 7 hoặc điểm. Nếu người đó thắng, nó sẽ xuất ra "Pass"; Nếu họ mất nó nên đầu ra "Don't Pass".

Thực hiện tham khảo

Groovy, 277 byte

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

Hãy thử trực tuyến.

Đầu ra mẫu

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

Point: 5
3
7
Don't Pass

Đây là , vì vậy mã ngắn nhất sẽ thắng.

(TUYÊN BỐ TỪ CHỐI: Thử thách này không nhằm mục đích thúc đẩy đánh bạc bằng mọi cách. Hãy nhớ rằng, nhà cái luôn thắng.)


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.- Điều gì về việc chọn một giá trị ngẫu nhiên trong [1, 12] từ một phân phối giống hệt với việc thêm hai giá trị ngẫu nhiên thống nhất trong [1, 6]?
Mego

@Mego Whoa, thử thách cũ. Vâng, điều đó sẽ ổn thôi. Tôi nghĩ rằng cảnh báo đó chủ yếu chỉ để đảm bảo mọi người nhận ra rằng phân phối đồng đều giữa [1, 12] không giống với 2d6. Tôi sẽ viết lại một chút.
một spaghetto

Câu trả lời:


6

Hồng ngọc 164

Khá đơn giản. Các tính năng thú vị:

Các trường hợp xuất hiện được tóm tắt là r%12<4và các trường hợp tự nhiên còn lại được tóm tắt là r%4==3.

Chuỗi ban đầu được lưu trữ cvà các cuộn tiếp theo chỉ được thực hiện nếu điều này muộn hơn theo thứ tự chữ cái so với chữ cái đơn ?P(chỉ xảy ra cho 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")

Thay vào đó, hãy yêu cách bạn kiểm tra phần còn lại thay vì 2,3,7,11 hoặc 12 một cách riêng biệt!
Jeroen

6

Python 3, 190 byte

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

Điều này dựa trên câu trả lời của Celeo ; Tôi đã thay thế một số điều kiện dài bằng một số ma thuật mã hóa LUT cho mỗi số, sử dụng lại một biến và thực hiện một vài sân golf linh tinh khác. Vẫn còn chỗ để chơi gôn; có thể có được dưới 170.

Tôi đã không thử sử dụng Python 2, vì vậy tôi không biết liệu nó có ngắn hơn không.


1
Quan tâm để giải thích làm thế nào bạn có số ma thuật đó và làm thế nào nó hoạt động?
Karl Napf

5

C99, 365 312 293 277 byte

Đây là bài viết đầu tiên của tôi ở đây, vì vậy tôi sẽ đoán rằng điều này có thể được cải thiện rất nhiều.

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

Phiên bản mở rộng

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

Như bạn có thể thấy, có một lượng dư thừa tốt ở đây rất có thể có thể được loại bỏ.

Tín dụng cho @Mego để giúp làm cho điều này nhỏ hơn.


1
Miễn là nó biên dịch ở đâu đó, bạn tốt.
lirtosiast

@Mego cảm ơn bạn đã chỉ ra rằng, đã quản lý để loại bỏ 19 byte.
Chris Loonam

Got một số chi tiết tắt loại bỏ abvà cũng sử dụng phương pháp trừ cùng với ternary nhà khai thác.
Chris Loonam

5

Python 2, 226 224 byte

Đầu tiên vượt qua và có rất nhiều mã ở đó:

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"

Cảm ơn Mego cho 2 byte!


Vài vấn đề với điều này. Nó không in ra "Điểm:" theo sau là số nếu cuộn không phải là tự nhiên hoặc tào lao. Ngoài ra, nên có một khoảng cách giữa: và số.
một spaghetto

Rất tiếc! Đã sửa lỗi không in 'Điểm: #'. Trong đầu ra, có một không gian.
Celeo

À. Tôi không sử dụng Python nhiều nữa vì vậy tôi không chắc về cách thức hoạt động của nó.
một spaghetto

Tôi đã đánh mã mã của bạn xuống còn 198 trong Python 3, là 192 trong Python 2. Bạn có muốn các đề xuất này không, hay tôi nên đăng câu trả lời của riêng mình?
lirtosiast

@ThomasKwa Nếu bạn đặt một loạt các công việc vào đó, hãy đăng dưới dạng một câu trả lời riêng biệt để bạn có thể nhận được một số đại diện cho nó.
Celeo

3

PHP 230 228 218 199 192 188 byte

186 byte không có <?

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

Nỗ lực đầu tiên tại mã golf! Không chắc chắn nếu sử dụng </br>sẽ được cho phép mặc dù? Vì điều này sẽ không hoạt động trong một giao diện điều khiển (như một dòng mới). Hãy cho tôi biết nếu điều này không được phép và sẽ thay đổi mã của tôi.

EDIT (16-8-16): Sau khi trở nên tốt hơn với codegolf, tôi nhận thấy một số cải tiến có thể. Điều này vẫn hoạt động bằng cách sử dụng giao diện dòng lệnh. Thay thế </br>bằng một nhập cứng.


Natural được đánh vần là "Tự nhiên" chứ không phải "Naturel".
Kritixi Lithos

Đã thay đổi nó. Cảm ơn
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

PowerShell , 181 183 179 178 167 165 byte

-10 byte nhờ mazzy
-2 byte nhờ 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'}}

Hãy thử trực tuyến!

Phiên bản chưa được kiểm soát:

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

Bây giờ có một vài điểm ít gắn bó hơn là logic xây dựng danh sách đã được xây dựng lại thành một công tắc. Tôi nghĩ rằng đó vẫn là một cách tiếp cận khá ổn. +2 byte sửa lỗi.


1
tuyệt vời! rút ngắn tối đa 178 byte
mazzy

Tôi nghĩ rằng điều kiện -notin (7,$z)không liên quan đến quy tắc During the point round, the player must continuously roll ... the previous round. Bây giờ vòng lặp kết thúc khi $mbằng 7hoặc vòng đầu tiên .
mê mẩn

1
@mazzy Đó là một vấn đề từ ngữ trong câu hỏi. Chỉ có hai vòng. Bạn chỉ đặt Điểm một lần trong Come-outvòng và đó là số mục tiêu của bạn cho toàn bộ Pointvòng. Các previous roundđề cập đến Come-outvòng
Veskah

1
cảm ơn. 168 byte
mazzy

2
Bạn sẽ có thể nghỉ thêm hai lần nữa bằng cách xóa 1?khỏi regex craps của bạn.
Xcali

0

R, 197 byte

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

Ung dung

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

Bùa mê runic , 151 byte

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

Hãy thử trực tuyến!

Sau khi sửa một lỗi liên quan đến các số ngẫu nhiên (nó được gieo lại mỗi lần 'RAđược gọi và hạt giống là thời gian hệ thống, dẫn đến một loạt các giá trị lặp lại), điều này hoạt động chính xác.

Giải trình

Entry nằm trên dòng thứ hai, vì dòng đầu tiên cho đến khi là một chức năng để lăn hai con xúc xắc và tóm tắt chúng.

Luồng chương trình, với một số chuyển hướng cuộn và cuộn tròn không được kiểm soát để dễ đọc

   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)

Chỉ có 4 lệnh NOP ( {:}≠...?\.6?) sẽ rất khó xóa do không gian cần thiết trên các dòng khác (Cụ thể là độ dài của "Don't "chuỗi).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.