Buat Simon Clone! [Tutup]


18

Skenario: saat pemrograman Anda tiba-tiba memiliki keinginan nostalgia untuk era 80-an dan permainan murahan.

Persyaratan: Buat program GUI (teks mungkin tidak akan berfungsi) untuk Simon, game. Input dapat mengklik, atau menekan tombol. Anda harus membagi layar menjadi 4 wilayah: kuning, biru, merah, hijau. Saat permainan dimulai, warna acak menyala dan Anda mengaktifkannya. Kemudian, dua lampu menyala, satu demi satu, dan Anda harus mengaktifkannya secara berurutan, dll. Permainan berakhir ketika Anda menekan warna yang salah.

Bonus:

-100 jika Anda memasukkan suara (nada berbeda dimainkan saat menekan setiap wilayah dan saat permainan menunjukkan warna)

-25 jika Anda memasukkan penghitung skor.


13
GUI dan kode-golf umumnya tidak bekerja bersama.
user80551

3
Ini harus bisa dilakukan di Minecraft. Tidak akan mengejutkan saya jika seseorang sudah memilikinya. Tidak tahu bagaimana cara mengirimkannya di sini ...
Kninnug

@Kninnug jumlah blok * byte per blok;)
Liam McInroy

@Liam McInroy AFAIK satu blok adalah 2 byte untuk ID blok dan 4 byte untuk menyimpan posisinya di dunia.
Pavel

Jawaban:


12

Bash 318 297 281 273 268 244 240-125 = 115

Ini terutama merupakan respons terhadap "Teks mungkin tidak akan berfungsi"; skrip bash berbasis teks berikut berjalan dengan baik Konsole, gnome-terminaldll. di mesin Ubuntu 14.04 saya. Untuk membuat daerah warna itu mengatur warna latar belakang teks. Bahkan, menambahkan teks membuat permainan lebih mudah diakses oleh pemain buta warna. Untuk membuat permainan lebih mudah diakses, ia membaca karakter yang harus ditekan oleh pemain (diasumsikan espeaktelah dipasang). Ini juga mengasumsikan bahwa satu-satunya pencocokan file /d*/ur*/adalah /dev/urandom. Untuk wilayah warna yang berukuran non-sepele, Anda mungkin ingin mengatur ukuran teks menjadi cukup besar. Juga jika Anda ingin daerah warna menjadi kuadran, Anda harus menjalankannya di terminal dengan lebar dua karakter.

Untuk memutar tekan y, r, g atau b sesuai keperluan.

cat <<"EOF"|sed s/E/`echo -e '\E'`/>simon_golf.sh;bash simon_golf.sh;wc simon_golf.sh
d(){ echo Ecx1r09mRx2g10mGx3y11mYx4b14mBx0m$s|sed s/.$1"//
s/[rgyb]..//g
s/x/E[48;5;/g";};x(){ d $c;espeak $c;d j;};l(){
for c in $o;{ eval $1;x;};};f(){ o=$o\ `tr -dc yrgb</d*/ur*|head -c1`
l;l 'read -n1 i;[ $c = $i ]||exit;let s++';f;};f
EOF

Solusi ini mengandung dua karakter ESC yang tidak dapat dicetak. Meskipun karakter ESC ini muncul dalam pratinjau, mereka tampaknya dihapus setelah pengiriman, jadi kode di atas adalah pembungkus yang menghasilkan dan menjalankan golf simon_golf.sh.

Lihat juga versi ungolfed asli , dan versi 256 byte yang sedikit lebih dapat dimainkan .

Screenshot di bawah ini adalah ketika lampu kuning menyala dan skor pemain adalah 7. Screenshot di sebelah kanan telah dideaturasi untuk mensimulasikan buta warna.

tangkapan layarHitam dan putih


Terlalu besar untuk golf kode ...
John Dvorak

3
Benar. Saya di sini lebih untuk "Teka-teki Pemrograman" lebih dari "Golf Code".
gmatht

Saya telah sedikit bermain golf sekarang.
gmatht

24

Scratch, 1604 - 125 = 1479

Saya di sini untuk bersenang-senang, bukan golf.

Sunting: metode penilaian yang diperbarui berdasarkan konsensus komunitas .

Program utama:

utama

Sprite individu:

sprite

Ini adalah sprite dengan angka 0. Sprite lain memiliki skrip yang sama, kecuali jumlahnya.

Mainkan secara online .

Kode yang digunakan untuk penghitungan byte: (Menggunakan snippet untuk menyembunyikan kode)

Catatan: Kode secara otomatis dihasilkan menggunakan generator scratchblock , yang dimodifikasi karena generator tidak menangani angka desimal dengan benar (memperlakukan 0,3 sebagai 0).

Tangkapan layar:

tangkapan layar

Catatan: Tolong jangan menekan dua tombol dalam waktu 0,3 detik.


Ha, itu keren. Namun, jeda setelah jawaban yang benar akan bagus, atau suara ucapan selamat. Sepertinya langkah terakhir saya adalah bagian dari pola. Juga, saya akan memainkan suara lebih lambat daripada tutup input, karena ritme dan pencocokan nada adalah bagaimana orang (saya sendiri, setidaknya) memainkan ... masih, saya menyukainya. +1
krs013

1
Menggaruk? Srs? Juga, jumlah byte imo harus menjadi ukuran total SB2.
cjfaure

1
@Rimsty Maka itu akan menjadi 126833 byte (termasuk file suara wav dll), itulah sebabnya saya berkata "Saya di sini untuk bersenang-senang, bukan golf."
user12205

Menurut skor yang saya sarankan di sini , skornya adalah 60 (27 blok, 20 karakter / digit dalam konstanta, 8 operator, 5 penggunaan variabel). Dengan bonus, Anda mendapatkan -65.
ugoren

@ugoren Ini sebenarnya hanya sebagian jawaban. Ada 4 sprite, dan hanya skrip untuk satu yang ditampilkan, karena sprite lainnya memiliki skrip yang hampir identik kecuali jumlahnya. Saya akan memperbarui jawabannya berdasarkan skor Anda. Terima kasih.
user12205

3

Mathematica, 409 - 125 = 284

k = 2;
p = Tuples[{0, 1}, 2];
f[c_, p_] := 
 EventHandler[{c, Rectangle[p]}, 
  "MouseClicked" :> (AppendTo[x, p]; Beep[]; g)]
h[R_] := (i = 1; 
  RunScheduledTask[
   H = If[OddQ@i, 
     Beep[]; {EdgeForm[{Thickness[0.02], Black}], FaceForm[], 
      Rectangle@R[[Ceiling[i/2]]]}, {}]; i++, {.3, 2 Length@R}])
s := (m = 0; x = {}; h[R = RandomChoice[p, k]];)
g := (m++; If[Take[R, m] != x, k = 2; s, If[m == k, k++; s]])
Dynamic@Graphics[{MapThread[f, {{Yellow, Red, Blue, Green}, p}], H}, 
  PlotLabel -> k]
s

masukkan deskripsi gambar di sini


2

Windows PowerShell (CLI), 272 - 100 - 25 = 147

$d={param($c)cls;sleep -m 99;'R','Y','Blu','Gre'|
%{Write-Host '#' -N -F "$(if($i%4-ne $c){'Dark'})$_";
$i++}};$b={param($c)&$d $c;[console]::Beep(($c+1)*99,700);&$d};
$m=@();$s=0;for(){$m+=0..3|Get-Random;$m|%{&$b $_};$m|%{
if((read-host)-ne $_){$s;exit}&$b $_};$s++;sleep 1}

Saya telah menambahkan baris baru di sini untuk menghindari pengguliran samping, tetapi berfungsi sebagai satu baris sehingga jumlah karakter tanpa baris baru.

Tangkapan layar: Tangkapan layar bermain game

Bermain:

  • Buka PowerShell ISE (v3), rekatkan skrip ke dalam editor teks, tekan F5 untuk menjalankan.
  • Game akan menyala warna, memainkan suara, lalu menunggu input
  • Tekan angka (0 = merah, 1 = kuning, 2 = biru, 3 = hijau) lalu Enter.
  • Jika Anda salah mencetak skor dan berhenti. (NB. Mungkin keluar dari konsol Anda).
  • Jika Anda benar, itu berlaku untuk dua catatan.
  • Anda harus menekan Enter di antara setiap catatan saat memutar urutan kembali.

Komentar:

  • "bagilah layar menjadi 4 wilayah" - Anda tidak mengatakan bahwa mereka harus berempat, jadi tidak demikian.
  • Sulit untuk melihat cahaya biru di latar belakang biru, tetapi ternyata begitu.
  • Silakan jalankan di PowerShell ISE - di prompt normal "DarkYellow" muncul sebagai putih.
  • Anda bisa bermain golf dengan 28 karakter lainnya dengan menghapus beberapa waktunya (masih membuat game dapat dimainkan), dan dengan menafsirkan aturan "suara (nada dimainkan saat menekan dan ketika permainan menunjukkan warna)" berarti "mereka dapat semua menjadi suara yang sama - kesalahan standar DING ", tapi saya pikir itu terlalu jauh melawan semangat itu.

0

ZXBasic: 422 - 100 - 25 = 297

Ini jelas dianggap sebagai dorongan nostalgia untuk tahun 80-an ...

ZXBasic menggunakan kombinasi perintah tipe FreeBASIC dan ZX Spectrum BASIC untuk memungkinkan loop dan pengulangan yang kemudian berubah menjadi format TZX untuk dimuat ke dalam emulator Spectrum.

Versi ini mengubah batas (meskipun legenda di layar mengatakan tombol mana yang harus ditekan). Ini memainkan catatan yang sama seperti permainan Simon asli ( http://en.wikipedia.org/wiki/Simon_%28game%29 ).

d=0.5:s=0:l=1:t=1:n$="4261":dim m(4)=>{-8,9,1,4}
border 7
while l>0
 cls:a$="":print at 1,1;"Level: ";t;at 2,1;"Score:";s::for i=1 to 4:print at 0,i;paper val(n$(i));ink 0;i:next
 for i=1 to t
  c=1+int(rnd*4)
  border val(n$(c)):beep d,m(c):border 7
  a$=a$+str(c)
 next
 print at 10,1;"your turn"
 p$="":i=1
 do
  pause 100:k$=inkey:print at 6,i;k$
  if k$=a$(i) then s=s+1:print at 2,7;s:beep d,m(val(k$)):i=i+1
  else l=l-1:i=t+1:print "bad luck!"
  end if
 loop until i>t 
 t=t+1:pause 25
end while

Skor terbaik Sedang bermain


0

HTML5 dan Javascript, 1118-100-25 = 993 byte

masukkan deskripsi gambar di sini

Versi HTML + Js terlalu membengkak.

Dimainkan suara melalui API Audio Web .

Frekuensi catatan harus yang asli Simon, warna dan penempatan warna juga.

Ada demo online di sini: http://www.dantonag.it/miniSimon.html . Bekerja di browser yang sesuai dengan Audio Web (setidaknya Chrome dan Firefox, IE tidak mendukungnya, AFAIK).

<html><script>
var hc=["#0f0","red","#ff3","blue"],lc=["#090","#930","#cc0","#33c"],nt=[391,329,261,195],ln=[],qpos=0,pm=0,x,ct=new AudioContext;function ps(a,d){var b=ct.createOscillator();b.frequency.value=d;b.connect(ct.destination);var c=ct.createGain();b.connect(c);c.connect(ct.destination);c.gain.value=-.5;x[a].style.backgroundColor=hc[a];b.start(0);setTimeout(function(a,b){a.stop(0);x[b].style.backgroundColor=lc[b]},500,b,a)}
function w(a){2==pm&&(a!=ln[qpos]?(pm=3,document.getElementsByTagName("span")[0].innerHTML="game over!",ps(a,156)):(qpos++,ps(a,nt[a]),qpos>=ln.length&&(pm=qpos=0)))}function ml(){if(0==pm)document.getElementsByTagName("div")[0].innerHTML=ln.length,ln.push(Math.floor(4*Math.random())),pm=1;else if(1==pm){var a=ln[qpos];qpos<ln.length?(ps(a,nt[a]),qpos++):(qpos=0,pm=2)}setTimeout(ml,500)}window.onload=function(){setTimeout(ml,1);x=document.getElementsByTagName("td")};</script><div>0</div><table cellpadding=40><tr><td bgcolor=#090 onmousedown=w(0)><td bgcolor=#930 onmousedown=w(1)><tr><td bgcolor=#cc0 onmousedown=w(2)><td bgcolor=#33c onmousedown=w(3)></table><span></span>

Rekor saya adalah 15 (saya sangat buruk dalam game ini). Apa milikmu?

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.