Bantu aku Shut the Box


12

Inspirasi untuk tantangan ini harus sangat jelas pada saat posting.

Tugas

Anda harus membuat program gaya Tutup Kotak (tidak berfungsi, program). Dasar-dasar menutup kotak adalah:

Pemain berusaha menutup kotak dengan memutar satu set tuas berlabel 1-9. Mereka harus melakukannya dengan membalik tuas. Urutan peristiwa dari setiap belokan adalah sebagai berikut:

  1. Posisi tuas saat ini ditunjukkan.
    • Pada gim baru, posisi tuas harus ditampilkan sebagai 123456789.
    • Pada game dengan tuas tutup, semua tuas tutup ditampilkan sebagai -. Misalnya, pada gim yang memiliki tutup 1, 5, dan 9, hasilnya adalah -234-678-.
  2. Di (c) e (adalah |) digulung.
    • Jika tuas 7, 8, dan 9 semuanya mati, hanya satu dadu bermuka enam yang dibuang. Jika tidak, 2 dadu bermuka enam dilemparkan.
  3. Pemain diminta untuk memilih berapa banyak tuas yang ingin dibalik.
    • Jika pemain memilih angka> 9 atau <0, permainan berakhir.
    • Jika pemain memilih tuas yang sudah ditutup, permainan berakhir.
  4. Pemain memilih banyak tuas.
    • Jika jumlah tuas tidak sama dengan nilai di (c) e yang dilemparkan, permainan berakhir.
  5. Jika semua tuas ditutup, selamat, Anda menang. Jika tidak, kembali ke langkah 1.

Aturan untuk Program

  • Pada setiap belokan, Anda harus menampilkan posisi tuas saat ini.
  • Anda harus menampilkan nilai gulungan dengan frasa You rolled:(perhatikan spasi).
  • Anda harus meminta (dan menunggu) jumlah tuas untuk beralih dengan frasa How many levers to flip:(perhatikan spasi).
  • Anda harus meminta (dan menunggu) tuas sebanyak yang ditentukan pemain dengan frasa Which lever to flip:(perhatikan spasi).
  • Anda harus membalik tuas yang ditentukan.
  • Jika suatu saat permainan berakhir, Anda harus keluar Game Over.
  • Jika pemain menyelesaikan putaran tanpa tuas terbuka, Anda harus mengeluarkan You win!

Contoh Game

123456789
You rolled: 5
How many levers to flip: 5
Which lever to flip: 1
Which lever to flip: 2
Which lever to flip: 3
Which lever to flip: 4
Which lever to flip: 5
Game Over
123456789
You rolled: 5
How many levers to flip: 3
Which lever to flip: 2
Which lever to flip: 2
Which lever to flip: 1
Game Over
123456789
You rolled: 12
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 9
12-45678-
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1---5678-
You rolled: 11
How many levers to flip: 2
Which lever to flip: 5
Which lever to flip: 6
1-----78-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
1-----7--
You rolled: 8
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 7
---------
You win!

Oh Saya memasukkannya ke dalam daftar untuk menciptakan tantangan yang melibatkan Shut the Box. Bagus!
mbomb007

Jawaban:


3

Python 3, 348

Disimpan 5 byte berkat Mathias Ettinger.
Disimpan 7 byte berkat DSM.

Ooof, ini panjang. Saya juga benci bahwa tidak ada cara yang baik untuk melakukan tes kasus.

from random import*
*l,='123456789'
q=['-']*9
r=randint
p=print
f=' to flip: '
while l!=q:
 p(*l,sep='');t=r(1,6)+r(1,6)*(l[6:]!=q[6:]);p('You rolled: %s'%t);d={int(input('Which lever'+f))for _ in' '*int(input('How many levers'+f))}
 if len(set(d))-len(d)+1-all(str(x)in l for x in d)+t-sum(d):exit('Game Over')
 for x in d:l[x-1]='-'
p('You win!')

2

C, 405 403 398 392 390 387 byte

#define R 1+rand()/(2147483647/6+1)
#define G return puts("Game Over");
#define I(s,w)printf(s);scanf("%d",&w);
w,s;main(r,l){char b[]="123456789";for(srand(time(0));w^9;w=strspn(b,"-")){puts(b);printf("You rolled: %d\n",r=R+(strspn(b+6,"-")<3?R:0));I("How many levers to flip: ",l)for(;l--;s+=w,b[w-1]=45){I("Which lever to flip: ",w);if(w>9|w<0|b[w-1]<48)G}if(s^=r)G}puts("You win!");}

Tidak disatukan

/* Macro to get random integer in range [1,6] */
#define R 1+rand()/(2147483647/6+1)

i; /* Index variable */
main(r,l,w,s)
{
    /* Running game board */
    char b[]="123456789";

    /* Run while still levers not pulled */
    for(srand(time(0));i^9;i=strspn(b,"-"))
    {
        puts(b); /* Print game board */
        r=R+(b[6]^45||b[7]^45||b[8]^45?R:0); /* Get dice roll */
        printf("You rolled: %d\n",r); /* Print dice roll */
        printf("How many levers to flip: ");
        scanf("%d",&l); /* Get # of levers */
        for(i=s=0;i++<l;s+=w)
        {
            printf("Which lever to flip: ");
            scanf("%d",&w); /* Get lever # */
            if(w>9||w<0||b[w-1]==45) /* If invalid lever or lever already pulled, game over man */
                return puts("Game Over");
            b[w-1]=45; /* flip the lever */
        }
        if(s^r) /* If sum does not equal roll, game over */
            return puts("Game Over");
    }
    puts("You win!");
}

Edit: D'oh! Meninggalkan variabel yang tidak digunakan dalam jawaban golf saya. Saya telah menghapusnya tetapi menyisipkan versi yang salah.


2

PowerShell v2 +, 330 322 byte

$a=1..9;$r={1+(Random 6)};for($g="Game Over"){($o=-join$a-replace0,'-');if($o-eq'-'*9){"You win!";exit}"You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7));$l=Read-Host "How many levers to flip";if(9-lt$l-or1-gt$l){$g;exit}while($l){$b-=($i=Read-Host "Which lever to flip");$a[$i-1]-=$I;$l-=1}if($b-or($a|sort)[0]){$g;exit}}

Baris baru untuk kejelasan:

$a=1..9
$r={1+(Random 6)}
for($g="Game Over"){
  ($o=-join$a-replace0,'-')
  if($o-eq'-'*9){"You win!";exit}
  "You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7))
  $l=Read-Host "How many levers to flip"
  if(9-lt$l-or1-gt$l){$g;exit}
  while($l){
    $b-=($i=Read-Host "Which lever to flip")
    $a[$i-1]-=$i
    $l-=1
  }
  if($b-or($a|sort)[0]){$g;exit}
}

(Membutuhkan kembali versi 2 atau yang lebih baru karena Get-Randomtidak ada di PowerShell v1 ...)

Penjelasan:

Mulailah dengan mengatur $aruas tuas dengan mengambil rentang 1..9, dan juga set $rsama dengan blok skrip yang kita jalankan nanti (dijelaskan di bawah dengan $b). Game OverKata - katanya akan diatur $gpada awal loop tak terbatas for(){...}. Setiap iterasi, kami mengatur output kami $odan segera output itu (berkat (...)enkapsulasi) dengan -joinmenggabungkan array dan mengganti masing 0- masing dengan a -. ( 0Dijelaskan di bawah). Jika output sama dengan 9 tanda hubung, output You win!dan exit.

Selanjutnya, kami mengatur roll dadu kami $bdengan memanggil yang disimpan $r(via &) dengan beberapa parameter tambahan. The Get-Randomperintah dengan -Maximumdari 6(yang -Maximumtersirat) akan menghasilkan bilangan bulat dari 0 hingga 5, inklusif. Kami menambahkan 1itu untuk mendapatkan die-sided enam sisi, dan menambahkannya ke die roll acak lain dikalikan dengan (($a|sort)[8]-ge7)yang memeriksa apakah nilai tertinggi yang tersisa pada tuas adalah salah satunya 7,8,9dengan menyortir terlebih dahulu $adan kemudian mengambil elemen terakhir dan memeriksa apakah lebih besar -dari-atau-sama dengan 7. Kami menggunakan typecasting implisit untuk mengubah nilai Boolean menjadi 0 (Salah) atau 1 (Benar) untuk perkalian, sehingga "die" tambahan adalah salah satu die*0atau die*1. Kami kemudian menampilkan hasil dari die roll.

Berikutnya adalah Read-Hostke $lberapa banyak tuas. Perhatikan bahwa PowerShell secara otomatis menambahkan ruang-usus :setelah Read-Hostprompt, jadi setidaknya kami mendapatkannya secara gratis. Kami kemudian memeriksa bahwa jumlah tuas yang ingin dibalik pengguna adalah antara 1 hingga 9, selain itu exit.

Sekarang kita memasuki satu whilelingkaran. Setiap iterasi dari loop ini, kita Read-Hosttuas, simpan itu ke dalam $i, dan kurangi nilai itu dari $b. Kami kemudian juga mengurangi tuas yang sesuai dalam array, dan mengurangi berapa kali tambahan untuk permintaan pengguna.

Baris terakhir (kecuali penjepit penutup) menguji dua konstruksi Boolean. Yang pertama, hanya $b, hanya akan $Truejika pengguna tidak mengurangi semua angka dengan benar dari die roll (di PowerShell, angka bukan nol adalah Truthy). Kondisi lain memilah $adan mengambil nilai minimal. Jika kita mengurangi tuas yang sama dua kali, maka nilai minimal akan negatif (atau Kebenaran), jika tidak nilai minimalnya adalah 0(atau Falsey).

Contoh Jalankan:

PS C:\Tools\Scripts\golfing> .\shut-the-box.ps1
123456789
You rolled: 6
How many levers to flip: 1
Which lever to flip: 6
12345-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1-3-5-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 5
--3---789
You rolled: 10
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 7
-------89
You rolled: 9
How many levers to flip: 1
Which lever to flip: 9
-------8-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
---------
You win!

Penjelasan yang bagus! +1
Addison Crump
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.