Buat game 'Snake' di konsol / terminal

25

Game itu menyenangkan

codegolf ini di sini sangat menyenangkan saya harus membuat versi untuk permainan klasik lain yang memiliki kompleksitas yang sama. Cara Terpendek untuk membuat Game Space Invaders dasar dengan Python

Namun, kali ini, cobalah untuk menciptakan kembali permainan 'Ular' klasik, di mana Anda memulai sebagai bentuk kecil, terus-menerus bergerak untuk mengumpulkan potongan-potongan untuk meningkatkan skor Anda. Ketika Anda mengumpulkan sepotong, 'ekor' Anda tumbuh, yang mengikuti jalan yang telah Anda buat. Tujuannya adalah untuk bertahan paling lama tanpa menabrak ekor Anda sendiri, atau ke dinding

Kualifikasi:

  • Anda, karakter yang membentuk ekor, dinding, dan potongan yang Anda kumpulkan semua harus karakter yang berbeda
  • menunjukkan HUD dengan skor. Skor meningkat 1 poin untuk setiap bagian yang Anda kumpulkan
  • Pemain kalah ketika mereka bertabrakan dengan ekor mereka sendiri atau dinding
  • sepotong memunculkan di area acak segera setelah sepotong dikumpulkan, belum lagi pada awal permainan
  • Kecepatan permainan tidak masalah, asalkan konsisten
  • 'Sel' harus 2x1 karakter, karena ketinggian karakter blok adalah ~ dua kali lebar Bisa 1x1, karena 2x1 hanya jelek dan saya tidak benar-benar memikirkan itu
  • Kunci untuk mengubah arah harus masing-masing awsd, kiri, atas, bawah, kanan
  • arah awal harus selalu di atas
  • Anda harus menunjukkan tepi dinding. Skor mungkin tumpang tindih dengan tembok

Kode terpendek yang memenuhi kriteria di atas menang. Poin Bonus imajiner untuk kreativitas

Jaket
sumber
Ular tidak seharusnya tumbuh saat makan?
Berhenti menghidupkan counterclockwis
hm "Ketika kamu mengumpulkan sepotong, 'ekor' kamu tumbuh, yang mengikuti jalan yang telah kamu buat.", Jadi ya, ular itu tumbuh.
Blazer
2
Tanpa awsddan starting direction should always be uppersyaratan, M-x snakeakan bekerja
scrblnrd3
1
@ scrblnrd3 M-: (progn(define-key snake-mode-map"a"'snake-move-left)...(setq snake-initial-velocity-x 0 snake-initial-velocity-y 1)(snake))akan melakukan trik itu.
Jonathan Leech-Pepin
Terkait: Nibbles Nostalgia
sergiol

Jawaban:

32

JavaScript ( 553 512 bytes)

Tautan ke versi yang dapat diputar

c=0;a=b=d=-1;e=[f=[20,7],[20,8]];i=Math.random;~function n(){if(c&&(87==a||83==a
))c=0,d=87==a?-1:1;if(d&&(65==a||68==a))d=0,c=65==a?-1:1;p([j=e[0][0]+c,k=e[0][1
]+d])||!j||39==j||!k||10==k?b+=" | GAME OVER":(e.unshift([j,k]),p(f)?(f=[1+38*i(
)|0,1+9*i()|0],b++):e.pop());for(m=h="";11>h;h++){for(g=0;40>g;g++)l=g+","+h,m+=
!g||39==g||!h||10==h?"X":e[0]==l?"O":p(l)?"*":f==l?"%":" ";m+="\n"}x.innerHTML=m
+b;!b.sup&&setTimeout(n,99)}();onkeydown=function(o){a=o.keyCode};function p(o){
return e.join(p).indexOf(p+o)+1}

Saya mencoba untuk membuatnya output ke konsol nyata pada awalnya (dengan console.logdan console.clear), tetapi terlalu banyak berkedip, jadi saya memasukkannya ke HTML seperti konsol. Ini akan bekerja dengan ini:

<pre id=x>

Saya juga menerapkannya dengan sel 2x1 terlebih dahulu, tetapi hanya terlihat lebih buruk dari 1x1. Itu akan menjadi perubahan kecil.

Menggunakan awsdtombol pada keyboard.

Memperbarui:

Saya dapat memotongnya menjadi 512 (tepatnya 0x200) byte dengan meningkatkan pencarian ekor dan melakukan lebih banyak sihir.

Anda sekarang mendapatkan 2 poin ketika sepotong muncul di ekor Anda (itu adalah fitur). Saya juga memperbaiki tumpang tindih ketika ular menggigit dirinya sendiri.

salinan
sumber
1
indah! dan Anda benar, itu terlihat lebih baik 1x1 dari 2x1. satu-satunya kekhawatiran saya benar-benar ada naik turun menjadi jauh lebih cepat daripada kiri dan kanan tapi itu bisa dilakukan mengingat kendala Berkedip di konsol saya tidak terlalu keberatan (lihat program penjajah ruang angkasa saya, ini cukup berkedip) tapi saya kira halaman web teks biasa juga berfungsi! satu keraguan ... apakah ada cara untuk memulai kembali tanpa perlu menyegarkan? :(
Blazer
Tidak bekerja denganawsd
Neal
@ Blazer Itu akan membutuhkan lebih 13 karakter: - / ... dan Anda tetap memiliki tombol F5.
salin
@Neal Ya saya menggunakan tombol panah tetapi memperbaikinya sekarang.
salin
@ copy Saya kira saya tidak membuatnya menjadi persyaratan
Blazer
21

Kode Mesin x86 (128 byte)

Sama seperti pengajuan saya untuk Menghasilkan Fraksi Mandlebrot , saya menulis sebuah prod untuk permainan ular dalam 128 byte. Itu tidak sepenuhnya memenuhi persyaratan tantangan (itu mulai bergerak ke kanan, tidak semua dinding digambar), tapi saya mempostingnya karena saya pikir ini adalah solusi yang menarik dan kreatif. Skor ditampilkan dalam biner di sebelah kanan, tombol panah mengontrol arah gerak, 'makanan' dijatuhkan secara acak, dan berakhir jika Anda menabrak diri sendiri, dinding, atau tepi layar.

Tautan untuk kode yang dapat dieksekusi dan sumber

Tangkapan layar

Juga, berkenaan dengan komentar sebelumnya tentang apakah dosbox curang, saya pikir sangat bisa diterima asalkan dalam mode tampilan berbasis teks, karena itu hanya terminal dos.

Sir_Lagsalot
sumber
Mengapa DOSBox dianggap sebagai kecurangan? Ini adalah platform yang sangat sah.
dfeuer
9

16 bit 8086

526 byte / 390 byte

Dekode ini menggunakan decoder Base64 dan beri nama "snake.com" kemudian jalankan dari command prompt Windows. Diuji pada WinXP, Anda mungkin perlu menggunakan DosBox untuk mendapatkan mode video yang tepat. Kunci kontrol adalah 'WASD' dan ruang untuk keluar. Tekan 'w' untuk memulai.

uBMAzRC5AD+2AOipAb1AAbgAoI7Auf//v4sMsAHzqrgAtLksAfOqg8cU/sx19OgsAYs+8gKwAuj4
ALQAzRpCiRYOA4kWEAPouAC0C80hCsB0IbQIzSG+ygKDxgOAPAB0EjgEdfSLRAGzAP/Qo1cBiB7w
AulqAIEGdAGu/7P+uNECgMMEw7MCuNsCgMMGw4s+8gKLHvACisPolwADv+YCJoo16I0AiT7yAoD+
A775AnREiz70AiaKHbAA6HUAA7/mAok+9AKA/gB0FscGVwHNAoEudAGu/zPJtj/o2QDofQC0AM0a
OxYOA3X2/wYOA+lZ/8YEAE7+BIA8CnT16F4AaOAB6EQAM9K5LQD38YvCweACBQoA9+WL+OguALlL
ADPS9/HB4gKDwgsD+iaAPQB10rADiMRXq4HHPQGrq4HHPAGrq4HHPQGrX8OhEAO62wD34rntf/fx
iRYQA4vCw772Ar8K9bUEshCstACL2AHDi4f6ArMDtwXR+LEAwNEC/smA4Q8miA0p7/7PdevoIQA6
xHQE/st13ugKAP7NdcroAwB1+8O3BSbGBQEp7/7PdfaBx0EG/srDuBAQM9uAwwLNEID7CnX2w7gD
AM0QzSB3dgEgxgIAYYcBZIUBIMYCAHd8AXN+ASDGAgAA+wAF/P8EAAIAH4ofigAAAADRxeD/TJlO
gQPvQrVA4++BVdVjgQ==

Ini versi mode karakter yang panjangnya 390 byte:

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq7LdfCxUPOr6BgBiz5+AqF8Aqu0AM0aQ
okWhgKJFogC6MUAtAvNIQrAdCG0CM0hvlYCg8YDgDwAdBI4BHX0i0QBswD/0KNSAYgefALpdgCBB
m8Bov+z/rhdAoDDBMOzArhnAoDDBsOLPn4Cix58AiaJHQOclgmijUmiR2JPn4CgP4DvoUCdFOLPo
ACJoodJscFAAADv3JYiT6AAoD+AHQkxwZSAVkCgS5vAaL/vwEAudAHJoA9qnUEJsYFzIPHAuLx6F
4AtADNGjsWhgJ19oMGhgIC6Uz/xgQATv4EgDwKdPXoPgBo5wHoIgC5FwD38Wn6oADoFgC5TgD38U
ID0gP6JoA9AHXhJscFA93DoYgCutsA9+K57X/38YkWiAKLwjPSw76CAr8CALkEALSfrAQwq+L6w8
0gd3EBIFcCAGGCAWSAASBXAgB3dwFzeQEgVwIAYP+gAP7/AgACqtAH0AcAAAAA

Mode ini memiliki tiga byte lebih lama (tetapi ular lebih baik):

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA
Mendesis
sumber
poin untuk kreativitas, tetapi saya pikir menggunakan dosbox curang karena tantangannya adalah membuat permainan bekerja di konsol atau terminal ascii, bukan dosbox. juga, bukankah kode golf harus menjadi kode sumber, bukan biner?
Blazer
7
@ Blazer: Itu adalah kode sumber - Saya mengetikkan kode mesin menggunakan hex editor - begitulah l337 saya! ;-) Masalah DosBox hanya diperlukan jika driver video Anda memiliki masalah dengan mode 13 grafik (kartu saya tidak masalah dengan itu). Tidak akan sulit untuk melakukan versi ascii (mungkin lebih kecil juga)
Skizz
Versi "390-byte" diterjemahkan menjadi hanya 388 byte dan hang ketika dijalankan di bawah dosbox. Sepertinya ada sesuatu yang hilang dalam transmisi. :( Tetap saja, dua versi lainnya sangat keren!
Ilmari Karonen
Apakah ada versi kode yang tidak dipisahkan? (Saya tidak tahu bahasa ini)
AL
1
@ n.1: Program ini adalah kode mesin 8086, Anda dapat memuatnya ke dalam debugger (D86) dan melihat kode tersebut sebagai tertulis, meskipun tanpa nama label.
Mendesis
6

shell / sh, 578 karakter

Saya mencoba untuk menjadi POSIX compliant (menjadi portable sebanyak mungkin dan menghindari bashism, bahkan generator nomor acak tidak perlu / proc). Misalnya Anda dapat memainkannya di terminal asli Anda atau melalui sesi SSH: jalankan dengan 'dash -c ./snake' Ada juga varian yang tidak dapat dibaca / dibaca dalam ~ 2800 byte, yang dapat dilihat di sini .

Beberapa catatan: shell-scripting tidak cocok untuk coding game 8-)

  • Agar adil, kami hanya menggunakan apa yang disebut 'builtin', yang berarti:
    • tidak ada panggilan eksternal dari program seperti 'jelas', 'stty' atau 'tput'
    • karena itu, kami menggambar ulang seluruh layar pada setiap gerakan
    • satu-satunya builtin yang digunakan (alias perintah asli) adalah:
      • echo, eval, while-loop, let, break, read, case, test, set, shift, alias, source
  • tidak ada pembangkit bilangan acak (PRNG), jadi kami harus membuat sendiri
  • mendapatkan blok keystroke, jadi kita harus menelurkan utas lainnya
    • untuk mendapatkan acara dalam tugas orangtua kita menggunakan tempfile (jelek!)
  • ular itu sendiri adalah daftar, yang murah:
    • setiap elemen adalah (x, y) -tupel
    • kehilangan ekor berarti: menggeser daftar dengan 1
    • menambahkan head (baru) berarti: menambahkan string
  • grid secara internal adalah array, tetapi shell / sh tidak tahu ini:
    • kami "meniru" array (x, y) melalui panggilan eval jelek dengan global vars
  • dan akhirnya: kami bersenang-senang!
#!/bin/sh
alias J=do T=let E=echo D=done W=while\ let
p(){ eval A$1x$2=${3:-#};}
g(){ eval F="\${A$1x$2:- }";}
r(){
E $((1+(99*I)%$1))
}
X=9
Y=8
L="8 8 $X $Y"
I=41
W I-=1
J
p $I 1
p $I 21
p 1 $I
p 41 $I
D
p 3 3 :
>L
W I+=1
J
E -ne \\033[H
y=22
W y-=1
J
Z=
x=42
W x-=1
J
g $x $y
Z=$Z$F
D
E "$Z"
D
E $B
. ./L
case $D in
a)T X+=1;;d)T X-=1;;s)T Y-=1;;*)T Y+=1;;esac
g $X $Y
case $F in
\ |:)p $X $Y O
L="$L $X $Y"
case $F in
:)W I+=1
J
x=`r 39`
y=`r 19`
g $x $y
[ "$F" = \  ]&&{
p $x $y :
break
}
D
T B+=1;;*)set $L
p $1 $2 \ 
shift 2
L=$@;;esac;;*).;;
esac
D&
while read -sn1 K
J
E D=$K>L
D

masukkan deskripsi gambar di sini

Bastian Bittorf
sumber
Apakah ini benar-benar berfungsi ? jika ular itu pergi ke kanan dan Anda menekannya aberhenti. Aneh.
gniourf_gniourf
Ya, karena Anda menggigit diri sendiri - begitulah seharusnya IMHO. Kami membahas itu secara internal dan semua orang setuju akan hal ini.
Bastian Bittorf
echo -nsudah pasti tidak portabel. Jika operan pertama adalah -n, atau jika salah satu operan berisi karakter backslash ('\'), hasilnya adalah implementasi yang ditentukan. Menggunakan gema untuk apa pun selain teks literal tanpa sakelar tidak portabel. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h
nyuszika7h: ada ide bagaimana mengedarkan ini?
Bastian Bittorf
nyuszika7h: saya menemukan cara untuk menghapus panggilan 'echo -n' utama - jadi hanya ada satu panggilan yang tersisa. itu menyerukan escape-sequence untuk 'go to home-position (0,0)'
Bastian Bittorf
4

Ruby 1.9 / Windows saja / ( 354 337 355 346 byte)

require'Win32API';G=(W=Win32API).new g="crtdll","_getch",t=[],?I
B=(c=?#*39+h="#
#")+((S=' ')*38+h)*20+c;n=proc{c while B[c=rand(800)]!=S;B[c]=?*;S}
n[h=760];k={97=>-1,100=>1,119=>d=-41,115=>41}
(B[h]=?O;system'cls';$><<B<<$.;sleep 0.1
d=k[G.call]if W.new(g,"_kbhit",[],?I).call>0
t<<h;B[h]=?o;B[h+=d]==?*?B[h]=n[$.+=1]:B[t.shift]=S)while B[h]==S

Dimainkan di papan 20x40 di konsol windows. Skor ditampilkan di bawah papan. Gunakan WASDuntuk mengontrol ular, kunci lain untuk keluar (dengan paksa!). Edit waktu tidur di akhir baris 5 untuk mengontrol kecepatan. (Atau simpan 10 karakter dan buat hampir tidak bisa dimainkan dengan menghilangkan sleep sepenuhnya!)

Fitur bonus: gagal memulai secara acak (ketika bagian awal dihasilkan di lokasi ular).

Saya membutuhkan ~ 100 karakter untuk mengatasi kekurangan getchar yang tidak menghalangi. Rupanya Ruby 1.9.3 termasuk pustaka "io / konsol" yang akan menghemat sekitar setengah dari itu. Dan solusi ini khusus untuk Windows. Ada solusi yang diterbitkan untuk melakukan hal yang sama dalam sistem * nix, tapi saya belum mengujinya untuk membandingkan jumlah karakter.

Edit:

Harus menambahkan 18 byte setelah saya menyadari bahwa ekor hanya tumbuh setelah makan, bukan setelah setiap langkah.

Sunting 2: (Mungkin) memperbaiki masalah tabrakan, menyelamatkan 9 byte dengan membatasi ke satu item makanan.

ASHelly
sumber
Saya suka ide beberapa item makanan sekaligus, namun ada masalah besar: ekor harus bergerak dengan pemain, hanya tumbuh satu karakter untuk setiap bagian makanan yang Anda kumpulkan.
Blazer
Anda menambahkan komentar ketika saya sedang berusaha memperbaikinya ... Jika hanya ada satu bagian, saya dapat menghapus 9.times{}, menyimpan 9 karakter.
AShelly
satu-satunya persyaratan adalah bahwa harus ada 1 potong atau lebih makanan sekaligus, jadi ya Anda bisa membuatnya 1 potong sekaligus, menghemat beberapa karakter
Blazer
permainan secara acak menabrak saya di ~ 140 poin, tidak yakin mengapa. tetapi sebaliknya sangat baik
Blazer
Memperbaiki crash, saya pikir. Jika crash lagi, beri tahu saya pesan galat ruby.
AShelly
4

Applesoft Basic - 478 (462)

Ini adalah golf kode pertama saya, tetapi ditulis kembali pada tahun 1989, dan sebagian besar mengimplementasikan permainan ular seperti yang diminta (tetapi tanpa makanan, ular hanya terus tumbuh, dan itu sebenarnya dua pemain, bukan satu) hanya menggunakan dua baris Applesoft Basic.

Ada sejumlah kontes program dua jalur pada saat itu, seperti dalam jurnal Dr. Dobbs. Saya menghabiskan 6 bulan untuk mencari tahu bagaimana mencocokkan ini menjadi dua baris yang memiliki batas 255 karakter (dan hanya satu cabang)

Info lebih lanjut di: http://davesource.com/Projects/SpeedWaller/

Program yang diketik persis dua baris:

1ONSCRN(X,Y)<>7ANDB<>0ANDSCRN(U,V)<>7GOTO2:HOME:GR:X=10:Y=20:U=30:V=Y:I=201:J=202:K=203:M=205:W=215:A=193:S=211:Z=218:O=1:Q=-1:P=49152:COLOR=7:HLIN0,39AT0:HLIN0,39AT39:VLIN0,39AT0:VLIN0,39AT39:VTAB22: ?"WASZ IJKM  "C:ONB=0GOTO2:CALL-678:RUN
2PLOTX,Y:PLOTU,V:B=PEEK(P):G=B<>ZANDB<>W:H=B<>AANDB<>S:O=G*(O*H+(B=S)-(B=A)):L=H*(L*G+(B=Z)-(B=W)):G=B<>IANDB<>M:H=B<>JANDB<>K:Q=G*(Q*H+(B=K)-(B=J)):R=H*(R*G+(B=M)-(B=I)):X=X+O:Y=Y+L:U=U+Q:V=V+R:FORN=1TO99:NEXT:C=C+1:VTAB22:HTAB12:?C:GOTO1

Daftar ketika diformat terlihat seperti ini:

1 ONSCRN(X,Y)<>7 AND B<>0 AND SCRN(U,V) <> 7 GOTO 2: HOME : GR :
  X=10 : Y=20 : U=30 : V=Y : I=201 : J=202 : K=203 : M=205 : W=215 :
  A=193 : S=211 : Z=218 : O=1 : Q=-1 : P=49152 : COLOR=7 : HLIN 0,39
  AT 0 : HLIN 0,39 AT 39 : VLIN 0,39 AT 0 : VLIN 0,39 AT 39 : VTAB 22 :
  ? "WASZ IJKM  "C : ON B=0 GOTO 2 : CALL -678 : RUN
2 PLOT X,Y : PLOT U,V : B=PEEK(P) : G= B<>Z AND B<>W: H=B<>A AND B<>S :
  O=G*(O*H+(B=S)-(B=A)) : L=H*(L*G+(B=Z)-(B=W)) : G=B<>I AND B<>M :
  H=B<>J AND B<>K : Q=G*(Q*H+(B=K)-(B=J)) : R=H*(R*G+(B=M)-(B=I)) :
  X=X+O : Y=Y+L : U=U+Q : V=V+R : FOR N=1 TO 99 : NEXT : C=C+1 :
  VTAB 22 : HTAB 12 : ? C : GOTO 1

Permainan ini sebenarnya adalah dua pemain dan termasuk "instruksi" di bagian bawah halaman yang menunjukkan kunci serta penghitung sehingga Anda dapat melihat berapa banyak langkah Anda selamat. Ini 478 karakter, 16 di antaranya adalah instruksi dan output counter, jadi 462 jika Anda ingin mencukurnya.

David Ljung Madison Stellar
sumber
4

C # .NET Framework 4.7.2 Konsol ( 2.456 2.440 2.424 2.408 2.052 1.973 1.747 1.686 byte)

Ini menyenangkan, tetapi saya benar-benar harus memikirkan variabel apa itu apa, karena mereka hanya satu huruf.

using m=System.Console;using System;using System.Collections.Generic;using System.Threading;class s{static void Main(){m.CursorVisible=0>1;new s()._();}int l;Action<string> w=(x)=>m.Write(x);Action<int,int>n=(x,y)=>m.SetCursorPosition(x,y);(int x,int y)d,c,a;int h,u;List<(int x,int y)>p;void _(){while(1>0){f();h=25;u=25;p=new List<(int x,int y)>();l=0;d=(0,-1);c=(u/2,h/2);e();m.SetWindowSize(u+4,h+4);m.SetBufferSize(u+4,h+4);while(1>0){k();if(t())break;g();r();}f();m.SetWindowSize(u+4,h+6);m.SetBufferSize(u+4,h+6);n(1,h+3);w("        Game over,\n   press any key to retry.");f();m.ReadKey(1>0);m.Clear();}}private bool t(){if(c.x<0||c.y<0||c.x>=u||c.y>=h){r();n(c.x+2,c.y+2);w("X");return 1>0;}for(i=0;i<p.Count;i++){for(int j=0;j<i;j++){if(p[i].x==p[j].x&&p[i].y==p[j].y){r();n(c.x+2,c.y+2);w("X");return 1>0;}}}return 0>1;}private void e(){a=(z.Next(u),z.Next(h));l++;}void f(){while(m.KeyAvailable)m.ReadKey(1>0);}int i;void k(){var b=DateTime.Now;while((DateTime.Now-b).TotalMilliseconds<230)Thread.Sleep(10);if(!m.KeyAvailable)return;var a=m.ReadKey(1>0).Key;switch(a){case ConsoleKey.A:if(d.x==0)d=(-1,0);break;case ConsoleKey.W:if(d.y==0)d=(0,-1);break;case ConsoleKey.S:if(d.y==0)d=(0,1);break;case ConsoleKey.D:if(d.x==0)d=(1,0);break;}f();}void g(){c.x+=d.x;c.y+=d.y;p.Add((c.x,c.y));while(p.Count>l)p.RemoveAt(0);if(c.x==a.x&&c.y==a.y)e();}void r(){n(1,1);w("/");w(new string('-',u));w("\\");n(1,h+2);w("\\");w(new string('-',u));w("/");for(i=0;i<h;i++){n(1,i+2);w("|");n(u+2,i+2);w("|");}for(i=0;i<h;i++){for(int j=0;j<u;j++){n(i+2,j+2);w(" ");}}n(a.x+2,a.y+2);w("@");for(i=0;i<p.Count;i++){n(p[i].x+2,p[i].y+2);w("#");}n(2,0);w("Score:"+l);}Random z=new Random();}

Beberapa tangkapan layar:

Ular dengan skor 10 Ular jatuh dengan skor 4

Biner: https://github.com/wooden-utensil/snakeCodeGolf/releases/tag/v1.0.0.0

Repositori GitHub: https://github.com/wooden-utensil/snakeCodeGolf

Changelog: https://github.com/wooden-utensil/snakeCodeGolf/releases

facepalm42
sumber
1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
Stephen
1
Sudahkah Anda mencoba tuple seperti pada (int X,int Y)d; ...; d=(0,-1)? Itu mungkin menghemat byte. Saya juga tidak bisa melihat mengapa yang Anda lakukan Vector2 d;Vector2 c;Vector2 a;bukan Vector2 d,c,a. Saya pikir Anda juga dapat menyimpan fungsi Console.SetCursorPosition sebagai Action<...>variabel huruf tunggal. Anda dapat mengurangi DateTime dengan - operator. Anda juga dapat mendeklarasikan variabel loop secara global dan hanya nolkannya saat diperlukan, tanpa mendeklarasikannya.
kata ganti saya adalah monicareinstate
1
[saran lanjutkan] Anda dapat menggunakan 1>0atau menyimpan truedalam suatu variabel alih-alih menggunakan kata kunci. Anda mungkin dapat menggunakan operator -> mulia di loop. Pada DateTime b = DateTime.Nowbagian itu, bbisa jadi var. Anda mungkin atau mungkin tidak dapat menyimpan beberapa byte menggunakan dynamic(sering memungkinkan Anda menggabungkan deklarasi yang diketik berbeda).
kata ganti saya adalah monicareinstate
1
Menarik m.write(String)ke dalam fungsi panjang satu huruf itu sendiri mungkin akan menghemat satu ton
Veskah
1
Ada juga beberapa blok yang digunakan b.widthdan b.heightbanyak yang mungkin bisa disimpan ke var lokal 1 surat-bernama lain
Veskah
3

Python 3 - 644

from curses import *
import time
from collections import deque
from random import randrange as R
N,W,S,E=z=119,97,115,100
t=tuple
u=0,0
def m(s):
 a=lambda o,y,x:y.addch(o[0],o[1],x);q=lambda:(R(L-2),R(C-2));L,C=s.getmaxyx();curs_set(0);s.nodelay(1);s.border();s.refresh();r=newwin(L-2,C-2,1,1);n=deque();y,x=[L-2,0];d=N;n.append(u);c=N;p=q();a(p,r,N);a(u,s,48)
 while 1:
  if c in z:d=c
  if d==N:y-=1
  if d==S:y+=1
  if d==W:x-=1
  if d==E:x+=1
  l=n.pop()
  if (y,x) in n:return
  if (y,x)==p:p=q();a(p,r,N);n.append(l);s.addstr(0,0,str(len(n)))
  n.appendleft((y,x));a((y,x),r,S);a(l,r,32);r.refresh();time.sleep(.2);c=s.getch()
wrapper(m)

Tidak berhenti dengan bersih. Sepotong mungkin hilang jika memunculkan di atas ular.

Trang Oul
sumber
1

Bash (terlalu banyak karakter: kira-kira 1522)

t=tput
tc="$t cup"
tr="$t rev"
ts="$t sgr0"
ox=5
oy=5
((w=$($t cols)-2-2*ox))
((h=$($t lines)-2-2*oy))
trap "$t rmcup
stty echo
echo 'Thanks for playing snake!'
" EXIT
$t smcup
$t civis
stty -echo
clear
printf -v hs %$((w+2))s
printf -v v "|%${w}s|"
$tc $oy $ox
printf %s ${hs// /_}
for((i=1;i<=h+1;++i)); do
$tc $((oy+i)) $ox
printf %s "$v"
done
$tc $((oy+h+2)) $ox
printf %s ${hs// /¯}
dx=0
dy=-1
hx=$((w/2))
hy=$((h-2))
l=2
xa=($hx $hx)
ya=($hy $((hy+1)))
$tr
for((i=0;i<${#xa[@]};++i)); do
$tc $((ya[i]+1+oy)) $((xa[i]+1+ox))
printf \ 
done
$ts
print_food() {
$tc $((fy+1+oy)) $((fx+1+ox))
printf "*"
}
nf() {
rf=1
while((rf))
do
rf=0
((fx=RANDOM%w))
((fy=RANDOM%h))
for ((i=0;i<${#ya[@]};++i))
do
if((ya[i]==fy&&xa[i]==fx))
then
rf=1
break
fi
done
done
print_food
}
nf
ps() {
s="SCORE: $l"
$tc $((oy-1)) $((ox+(w-${#s})/2))
printf "$s"
}
ps
while :
do
read -t 0.2 -s -n1 k
if (($?==0))
then
case $k in
w|W)((dy==0))&&{ dx=0;dy=-1;};;
a|A)((dx==0))&&{ dx=-1;dy=0;};;
s|S)((dy==0))&&{ dx=0;dy=1;};;
d|D)((dx==0))&&{ dx=1; dy=0;};;
q|Q)break;;
esac
fi
((hx=${xa[0]}+dx))
((hy=${ya[0]}+dy))
if((hx<0||hy<0||hx>w||hy>h))
then
go=1
break
fi
for((i=1;i<${#ya[@]}-1;++i))
do
if((hx==xa[i]&&hy==ya[i]))
then
go=1
break 2
fi
done
$tc $((ya[-1]+1+oy)) $((xa[-1]+1+ox))
printf \ 
$tr
$tc $((hy+1+oy)) $((hx+1+ox))
printf \ 
$ts
if((hx==fx&&hy==fy))
then
((++l))
ps
nf
else
ya=(${ya[@]::${#ya[@]}-1})
xa=(${xa[@]::${#xa[@]}-1})
fi
ya=($hy ${ya[@]})
xa=($hx ${xa[@]})
done
if((go))
then
$tc 3 3
echo GAME OVER
read -t 3 -s -n1
fi

Tangkapan layar

gniourf_gniourf
sumber