Konsol / terminalde 'Snake' oyununu yeniden yarat


25

Oyunlar eğlenceli

Buradaki kod kuralları çok eğlenceliydi ben diğer klasik oyunların versiyonlarını karmaşıklaştırdım. Python'da basit bir Space Invaders Oyunu yaratmanın en kısa yolu

Bununla birlikte, bu kez, puanınızı artırmak için parçaları toplamaya devam ederek, küçük bir şekil olarak başladığınız klasik 'Yılan' oyununu yeniden yaratmaya çalışın. Bir parça topladığınızda, “kuyruğunuz” büyür ve yaptığınız yolu takip eder. Amaç, kendi kuyruğunuza veya duvarlara çarpmadan en uzun süre dayanmaktır.

Nitelikler:

  • Sen, kuyruğu oluşturan duvarlar, duvarlar ve topladığın parçalar hep farklı karakterler olmalı
  • skoru ile bir HUD gösterin. Topladığınız her parça için puan 1 puan artar
  • Oyuncu kendi kuyruğu veya duvarıyla çarpıştığı zaman kaybeder
  • Bir parça toplandıktan hemen sonra rastgele bir alanda ortaya çıkar, oyunun başında
  • Oyunun hızı, tutarlı olduğu sürece farketmez
  • 'Hücreler' 2x1 karakter olmalıdır, çünkü blok karakterlerin yüksekliği ~ iki kat genişliktir çünkü 1x1 olabilir, çünkü 2x1 sadece çirkindir ve ben bunu gerçekten düşünmedim
  • Yönü değiştirmek için kullanılan tuşlar awsd sırasıyla sol, yukarı, aşağı, sağ
  • başlangıç ​​yönü daima yukarı olmalıdır
  • Duvarın kenarlarını göstermelisiniz. Skor duvarla örtüşebilir

Yukarıdaki kriterleri karşılayan en kısa kod kazanır. Yaratıcılık için Hayali Bonus Puanları


Yılan yemek yerken büyümek gerekmez mi?
counterclockwis'i kapatmaya son verdi

hm? “Bir parça topladığınızda“ kuyruğunuz ”, yaptığınız yolu izleyerek büyür.”, Yani evet, yılan büyür.
Blazer

2
Olmadan awsdve starting direction should always be upgereksinimlerine M-x snakeçalışacak
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))o zaman hile yapardı.
Jonathan Leech-Pepin

Yanıtlar:


32

JavaScript ( 553 512 bayt)

Oynatılabilir sürüme bağlantı

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}

İlk başta ( console.logve ile console.clear) gerçek konsola çıktı yapmaya çalıştım , ama çok titriyordu, bu yüzden konsola benzer HTML'ye koydum. Bununla çalışacak:

<pre id=x>

Ayrıca ilk önce 2x1 hücrelerle uyguladım, ancak sadece 1x1'den daha kötü görünüyordu. Bu olsa küçük bir değişiklik olurdu.

awsdKlavyede tuşları kullanır .

Güncelleştirme:

Kuyruk aramayı geliştirip biraz daha sihir yaparak 512 (tam olarak 0x200) bayta kadar indiriyordum.

Artık kuyruğunda bir parça ortaya çıktığında 2 puan alırsın (bu bir özelliktir). Ayrıca yılan kendini ısırdığında çakışmayı düzelttim.


1
güzel! ve haklısın, 1x1'den 2x1'den daha iyi görünüyor. Gerçekten sahip olduğum tek endişe, yukarı ve aşağı, sola ve sağa göre daha hızlı olmalarına rağmen, kısıtlamaları göz önünde bulundurmakla mümkün. Konsoldaki yanıp sönme çok fazla umursamıyorum (uzay işgalcilerimin programına bakın, oldukça titriyor) ama düz bir metin web sayfasının da işe yaradığını düşünüyorum! bir kalite olsa ... yenilemeye gerek kalmadan yeniden başlatmanın bir yolu var mı? :(
Blazer

İşe yaramazawsd
Neal

@Blazer Bu daha fazla 13 karakter alır: - / ... ve yine de F5 anahtarına sahipsiniz.
kopyalayın

@Neal Evet, ok tuşlarını kullandım ancak şimdi düzelttim.
kopya

@copy Sanırım bir zorunluluk yapmadım
Blazer

21

x86 Makine Kodu (128 bayt)

Mandlebrot Fractal üretme sunumum gibi , ben de 128 baytlık yılan oyunu için bir eşya yazdım. Zorlukların gerekliliklerini tam olarak karşılamıyor (doğru hareket etmeye başlıyor, tüm duvarlar çizilmiyor), ancak gönderiyorum çünkü bunun ilginç ve yaratıcı bir çözüm olduğunu düşünüyorum. Skor sağda ikili olarak gösterilir, ok tuşları hareket yönünü kontrol eder, 'yemek' rastgele düşer ve kendinize, duvara veya ekranın kenarına vurursanız sona erer.

Yürütülebilir ve kaynak kod için link

Ekran görüntüsü

Ayrıca, dosbox'un hile yapıp yapmadığına ilişkin daha önceki yorumlarla ilgili olarak, metin tabanlı bir ekran modunda olduğu sürece tamamen kabul edilebilir olduğunu düşünüyorum, çünkü o zamanlar sadece bir dos terminalidir.


DOSBox neden hiç aldatma olarak düşünülsün ki? Mükemmel derecede okunaklı bir platform.
dfeuer

9

16 bit 8086

526 bayt / 390 bayt

Base64 kod çözücüyü kullanarak bunu çözün ve "snake.com" olarak adlandırın, ardından Windows komut isteminden çalıştırın. WinXP'de test edildiğinde, doğru video modunu elde etmek için DosBox kullanmanız gerekebilir. Kontrol tuşları 'wasd' ve çıkmak için boşluk vardır. Başlamak için 'w' ye basın.

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==

390 bayt uzunluğunda bir karakter modu sürümü:

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

Bu karakter modu, birinin üç baytı daha uzun (ancak yılan daha iyi):

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA

yaratıcılık için puanlar, ancak sanırım dosbox'ı kullanmak hile yapıyor çünkü meydan okuma oyunun bir dosci konsolu değil bir ascii konsolunda veya terminalde çalışmasını sağlamak. Ayrıca, kod golf ikili kod değil kaynak kod olmamalıdır?
Blazer

7
@Blazer: Bu kaynak koddur - Makine kodunu onaltılık editör kullanarak yazdım - işte ben böyle! ;-) DosBox olayı, yalnızca video sürücülerinizin mod 13 grafiklerinde sorun yaşarsa gerekir (mayın kartı uygun). Ascii bir versiyon yapmak zor olmazdı (muhtemelen daha da küçük)
Skizz

"390-byte" versiyonu sadece 388 byte çözer ve dosbox altında çalıştırıldığında kilitlenir. İletim sırasında bir şey kaybolmuş gibi görünüyor. :( Yine de, diğer iki sürüm son derece güzel!
Ilmari Karonen

Kodun etiketsiz bir sürümü var mı? (Bu dili bilmiyorum)
AL

1
@ n.1: Program 8086 kodudur, bir hata ayıklayıcısına (D86) yükleyebilir ve etiketi, etiket adları olmasa da yazılı olarak görüntüleyebilirsiniz.
Skizz

6

kabuk / sh, 578 karakter

POSIX uyumlu olmaya çalıştım (olabildiğince taşınabilir olma ve rastgele sayı üretecine ihtiyaç duymaz / işlem yapmaz). Örneğin kendi yerel terminalinizde veya bir SSH seansı ile oynatabilirsiniz: 'dash -c ./snake' ile çalıştırın . Burada görülebilecek ~ 2800 baytlık bir sürümlü / okunabilir değişken de vardır .

Bazı notlar: kabuk komut dosyası kodlama oyunları için uygun değildir 8-)

  • Adil olmak gerekirse, biz sadece 'builtins' denilen, yani:
    • 'clear', 'stty' veya 'tput' gibi programların harici çağrıları yok
    • bu yüzden her hareketi tüm ekranı yeniden çizeriz
    • sadece kullanılan yerleşikler (yani yerel komutlar):
      • yankı, eval, while-loop, izin ver, kes, oku, case, test, set, shift, takma ad, kaynak
  • rasgele sayı üreteci (PRNG) yoktur, bu yüzden kendimize ait bir tane yapmalıyız.
  • bir tuş bloğu alıyorum, bu yüzden başka bir konu ortaya çıkarmak zorundayız
    • Olayı ebeveyn görevinde almak için bir geçici dosya kullanıyoruz (çirkin!)
  • yılanın kendisi ucuz olan bir liste:
    • Her eleman bir (x, y) -tuple
    • Kuyruğun gevşetilmesi: listeyi 1'e kaydırmak
    • (yeni) bir başlık eklemek şu anlama gelir: bir dize eklemek
  • ızgara dahili olarak bir dizidir, ancak kabuk / sh bunu bilmiyor:
    • global vars ile çirkin bir değerlendirme çağrısı aracılığıyla dizi (x, y) "öykündü"
  • ve son olarak: çok eğlendim!
#!/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

görüntü tanımını buraya girin


Bu gerçekten işe yarıyor mu? yılan sağa gidiyorsa ve bastığınızda adurur. Tuhaf.
gniourf_gniourf

Evet, çünkü kendinizi ısırıyorsunuz - bu şekilde IMHO olması gerekiyor. Bunu dahili olarak tartıştık ve herkes bu konuda hemfikir.
Bastian Bittorf

echo -nkesinlikle taşınabilir değil. İlk işlenen -n ise veya işlenenlerden herhangi biri ters eğik çizgi ('\') karakteri içeriyorsa, sonuçlar uygulama tarafından tanımlanır. Herhangi bir anahtar olmadan değişmez metin dışındaki herhangi bir şey için eko kullanmak taşınabilir değildir. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h

nyuszika7h: Bunun üstesinden gelmek için herhangi bir fikir?
Bastian Bittorf

nyuszika7h: ana 'echo -n' çağrısını kaldırmanın bir yolunu buldum - geriye sadece bir çağrı kaldı. 'ev pozisyonuna git (0,0)' için kaçış dizisini çağırıyor
Bastian Bittorf

4

Ruby 1.9 / yalnızca Windows / ( 354 337 355 346 bayt)

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

Windows konsolunda 20x40'lık bir tahtada oynatır. Puan tahtanın altında gösterilir. WASDYılanı kontrol etmek için kullanın , çıkmak için herhangi bir tuşa basın (zorla!). Hızı kontrol etmek için satır 5'in sonundaki uyku süresini düzenleyin. (Ya da 10 karakterden tasarruf edin ve uykuyu tamamen kaldırarak neredeyse oynanamaz hale getirin!)

Bonus özelliği: rastgele başlatmak başarısız olur (ilk parça yılanın yerinde üretildiğinde).

Bloke edici olmayan bir getcharın olmaması için 100 karaktere ihtiyacım vardı. Görünüşe göre Ruby 1.9.3, yaklaşık olarak yarısını kurtarabilecek bir "io / console" kütüphanesi içeriyor. Ve bu çözüm Windows'a özgüdür. Aynı şeyi * nix sistemlerinde yapmak için yayınlanmış çözümler var, ancak karakter sayısını karşılaştırmak için test etmedim.

Düzenle:

Her adımdan sonra değil kuyruğunun sadece yedikten sonra büyüdüğünü fark ettikten sonra 18 bayt eklemek zorunda kaldım.

Düzenleme 2: (Muhtemelen) sabit kilitlenme sorunu, bir gıda maddesiyle sınırlayarak 9 baytı kurtardı.


Birden fazla yiyecek öğesinin fikrini aynı anda seviyorum, ancak büyük bir sorun var: kuyruk oyuncu ile birlikte hareket etmeli, topladığınız her yiyecek parçası için sadece bir karakter büyümeli.
Blazer

Bunu düzeltmeye çalışırken yorum eklediniz ... Eğer sadece bir parça olması gerekiyorsa 9.times{}, 9 karakter tasarruf ederek çıkarabilirim .
AShelly

tek gereksinim, bir seferde 1 veya daha fazla yiyecek olması, yani evet, bir seferde sadece 1 adet yapabilir, bazı karakterleri
kaydedebilirsin

Oyun rastgele bana ~ 140 puanda çarptı, neden emin değilim. ama başka türlü çok güzel
Blazer

Sanırım kaza düzeltildi. Tekrar çökerse, lütfen bana yakut hata mesajını bildirin.
AShelly

4

Applesoft Temel - 478 (462)

Bu benim ilk kod golf'ümdü, ancak 1989'da yazıldı, ve yılan oyununu istediği gibi uyguladı (ama yemeksiz, yılanlar sadece sürekli büyüyordu ve aslında iki oyuncu, bir tane değil) sadece iki satır kullanıyordu. Applesoft Temel.

Dobbs dergisinde olduğu gibi o zamanlar iki satırlık bir dizi program yarışması vardı. 6 ay boyunca bunun 255 karakterlik (ve sadece bir dal) sınırı olan iki satıra nasıl sığacağını belirleyerek geçirdim.

Daha fazla bilgi için: http://davesource.com/Projects/SpeedWaller/

Yazılan program tam olarak iki satırdır:

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

Biçimlendirildiğinde listeleme şöyle görünür:

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

Oyun aslında iki oyuncudur ve sayfanın altındaki tuşları ve bir sayacı gösteren "talimatlar" içerir, böylece kaç basamaktan kurtulduğunuzu görebilirsiniz. Bu, 478 karakter, bunlardan 16'sı komut ve sayaç çıktısıdır, bu yüzden bunları tıraş etmek istiyorsanız 462.


4

C # .NET Framework 4.7.2 Konsolu ( 2,456 2,440 2,424 2,408 2,052 1,973 1,747 1,686 bayt)

Bu eğlenceliydi, ama gerçekten hangi değişkenlerin ne olduğunu düşünmem gerekiyordu, çünkü onlar sadece bir harfdi.

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

Bazı ekran görüntüleri:

10 puanla yılan Yılan 4 puanla düştü

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

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

Değişiklikler: https://github.com/wooden-utensil/snakeCodeGolf/releases


1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
Stephen

1
Tekilleri olduğu gibi denedin (int X,int Y)d; ...; d=(0,-1)mi? Bu baytları kurtarabilir. Ben de neden yaptığını göremiyorum Vector2 d;Vector2 c;Vector2 a;yerine Vector2 d,c,a. Ayrıca Console.SetCursorPosition işlevini Action<...>tek harfli bir değişken olarak da depolayabileceğinizi düşünüyorum . DateTime öğesini - operatörüyle çıkarabilirsiniz. Ayrıca, döngü değişkenlerini global olarak ilan edebilir ve gerektiğinde bildirmeden, sadece sıfırlayabilirsiniz.
zamirim monicareinstate

1
[öneri devam] Anahtar kelimeyi kullanmak yerine bir değişkende kullanabilir 1>0veya saklayabilirsiniz true. Görkemli -> operatörünü döngüler içinde kullanabilirsiniz. In DateTime b = DateTime.Nowparçası bolabilir var. Kullanarak bazı baytları kaydedebilirsiniz veya edemeyebilirsiniz dynamic(genellikle farklı yazılan bildirimleri birleştirmenize olanak tanır).
zamirim monicareinstate

1
Çekme m.write(String)içine kendi tek harfli uzun fonksiyon muhtemelen bir ton tasarruf şöyle olur
Veskah

1
Ayrıca, kullanılabilecek birkaç blok b.widthve b.heightmuhtemelen 1 harfli yerel var olan başka 1 harfine kaydedilebilecek çok şey var
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)

Temiz çıkmıyor. Yılanın üstüne çıkarsa parça kaybolabilir.


1

Bash (çok fazla karakter: yaklaşık 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

Ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.