콘솔 / 터미널에서 '뱀'게임을 재현


25

게임은 재미있다

이 코드 골프는 너무 재미있어서 다른 고전 게임의 버전을 복잡하게 비슷하게 만들어야했습니다. Python에서 기본 Space Invaders 게임을 만드는 가장 짧은 방법

그러나 이번에는 클래식 '뱀'게임을 재현 해보십시오. 작은 게임으로 시작하여 지속적으로 점수를 높이기 위해 조각을 모으는 것으로 이동하십시오. 당신이 조각을 모을 때, 당신의 '꼬리'가 자라며, 이것은 당신이 만든 길을 따릅니다. 목표는 꼬리 나 벽에 충돌하지 않고 가장 오래 지속되는 것입니다.

자격:

  • 꼬리를 구성하는 캐릭터, 벽, 수집 한 조각은 모두 다른 캐릭터 여야합니다
  • 점수와 함께 HUD를 보여줍니다. 수집 한 조각마다 점수가 1 점씩 증가합니다.
  • 자신의 꼬리 또는 벽과 충돌하면 플레이어가 패배합니다.
  • 게임이 시작될 때 언급하지 않고 조각이 수집 된 직후 임의의 영역에 조각이 생성됩니다.
  • 일관된 한 게임 속도는 중요하지 않습니다.
  • '셀'은 2x1 문자이어야합니다. 블록 문자의 높이가 ~ 두 배 이므로 너비 는 1x1 일 수 있습니다 .2x1은 못 생겼으며 실제로는 생각하지 않았습니다.
  • 방향을 변경하는 키는 awsd각각, 왼쪽, 위, 아래, 오른쪽 이어야합니다
  • 시작 방향은 항상 위로
  • 벽의 가장자리를 표시해야합니다. 점수가 벽과 겹칠 수 있습니다

위의 기준을 충족하는 가장 짧은 코드가 승리합니다. 창의성을위한 상상의 보너스 포인트


뱀은 먹을 때 자라지 않아야합니까?
반 시계 회전을 중지

흠? "조각을 모으면 '꼬리'가 자라며, 그 길을 따라가는 것입니다."그래서 뱀은 자랍니다.
Blazer

2
awsdstarting direction should always be up요구 사항이 없으면 M-x snake작동합니다
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))이 트릭을 수행합니다.
Jonathan Leech-Pepin 12

답변:


32

자바 스크립트 ( 553512 바이트)

재생 가능한 버전으로 연결

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}

처음에 (with console.logconsole.clear)로 실제 콘솔에 출력하려고 시도했지만 너무 많이 깜박이므로 콘솔과 같은 HTML에 넣었습니다. 다음과 같이 작동합니다.

<pre id=x>

또한 2x1 셀로 먼저 구현했지만 1x1보다 나빠 보였습니다. 그것은 사소한 변화 일 것입니다.

awsd키보드의 키를 사용 합니다.

최신 정보:

꼬리 검색을 개선하고 더 많은 마법을 수행하여 512 바이트 (정확하게 0x200) 바이트로 줄일 수있었습니다.

이제 꼬리에 조각이 생성 될 때 2 점을 얻습니다 (기능입니다). 뱀이 물었을 때 겹치는 부분도 수정했습니다.


1
아름다운! 맞습니다. 2x1보다 1x1로 더 좋아 보입니다. 내가 실제로 가지고 있었던 유일한 걱정은 왼쪽과 오른쪽보다 훨씬 빠르다는 것이지만 제약 조건을 고려할 수 있습니다. 콘솔에서 깜박임은별로 신경 쓰지 않지만 (공간 침입자 프로그램, 상당히 깜박임) 일반 텍스트 웹 페이지도 작동한다고 가정합니다! 하나의 qualm ... ... 새로 고칠 필요없이 다시 시작할 수있는 방법이 있습니까? :(
Blazer

작동하지 않습니다 awsd
Neal

@Blazer 13 자 이상이 필요합니다 :-/ ... 어쨌든 F5 키가 있습니다.
복사

@ 닐 그래 화살표 키를 사용했지만 지금 수정했습니다.
복사

@copy 나는 그것을 요구 사항으로하지 않았다고 생각한다
Blazer

21

x86 기계 코드 (128 바이트)

Mandlebrot 프랙탈 생성에 대한 나의 제출과 매우 흡사 , 뱀 게임에 대한 제품을 128 바이트로 작성했습니다. 도전의 요구 사항을 완전히 충족하지는 못합니다 (모든 벽이 그려지는 것은 아닙니다). 흥미롭고 창의적인 솔루션이라고 생각하기 때문에 게시하고 있습니다. 점수는 오른쪽에 바이너리로 표시되고, 화살표 키는 동작 방향을 제어하고, '음식'은 무작위로 떨어지며, 자신, 벽 또는 화면 가장자리에 닿으면 끝납니다.

실행 및 소스 코드 링크

스크린 샷

또한 dosbox가 부정 행위인지 여부에 대한 이전 의견과 관련하여 텍스트 기반 디스플레이 모드 인 한 dos 터미널이므로 완벽하게 수용 가능하다고 생각합니다.


DOSBox가 부정 행위로 간주되는 이유는 무엇입니까? 완벽하게 합법적 인 플랫폼입니다.
dfeuer

9

16 비트 8086

526 바이트 / 390 바이트

Base64 디코더를 사용하여 이를 디코딩 하고 "snake.com"이라고 부르고 Windows 명령 프롬프트에서 실행하십시오. WinXP에서 테스트 한 경우 올바른 비디오 모드를 얻으려면 DosBox를 사용해야합니다. 제어 키는 '폐기물'이며 종료 할 공간입니다. 'w'를 눌러 시작하십시오.

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 바이트 길이의 문자 모드 버전입니다.

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

이 문자 모드는 3 바이트 더 길지만 뱀이 더 좋습니다.

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

창의력에 대한 요점이지만, dosbox를 사용하는 것이 사기라고 생각합니다. 도전은 dosbox가 아닌 ASCII 콘솔 또는 터미널에서 게임을 작동시키는 것이기 때문입니다. 또한 골프 코드를 바이너리가 아닌 소스 코드로 사용해서는 안됩니까?
Blazer

7
@Blazer : 소스 코드입니다. 16 진수 편집기를 사용하여 머신 코드를 입력했습니다. ;-) DosBox는 비디오 드라이버가 모드 13 그래픽에 문제가있는 경우에만 필요합니다 (광 카드에 문제가 없습니다). 아스키 버전을 만드는 것은 어렵지 않습니다 (아마도 더 작음)
Skizz

"390 바이트"버전은 388 바이트로만 디코딩되며 dosbox에서 실행될 때 정지됩니다. 전송 중에 무언가가 손실 된 것 같습니다. :( 여전히 다른 두 버전은 매우 시원합니다!
Ilmari Karonen

ungolfed 코드 버전이 있습니까? (나는이 언어를 모른다)
AL

1
@ n.1 : 프로그램은 8086 기계 코드이며, 레이블 이름 없이도 디버거 (D86)에로드하고 작성된 코드를 볼 수 있습니다.
Skizz

6

쉘 / sh, 578 자

나는 POSIX를 준수하려고 노력했다. 예를 들어 네이티브 터미널에서 또는 SSH 세션을 통해 재생할 수 있습니다. 'dash -c ./snake'로 실행 ~ 2800 바이트의 수정 불가능하고 읽을 수있는 변형도 있습니다 ( 여기에서 볼 수 있음) .

일부 참고 사항 : 쉘 스크립팅은 게임 코딩에 적합하지 않습니다 8-)

  • 공정하게 말하자면, 우리는 소위 'builtins'만을 사용했습니다.
    • 'clear', 'stty'또는 'tput'과 같은 프로그램의 외부 호출이 없습니다.
    • 그 때문에 모든 움직임에서 전체 화면을 다시 그립니다.
    • 유일하게 사용되는 내장 (일명 기본 명령)은 다음과 같습니다.
      • 반향, 평가, while 루프, let, break, read, case, test, set, shift, alias, source
  • PRNG (난수 생성기)가 없으므로 자체 빌드해야합니다
  • 키 스트로크 블록을 얻으므로 다른 스레드를 생성해야합니다.
    • 부모 작업에서 이벤트를 가져 오기 위해 임시 파일을 사용합니다 (못생긴!)
  • 뱀 자체는 저렴한 목록입니다.
    • 각 요소는 (x, y) 튜플입니다.
    • 꼬리를 잃어버린 의미 : 목록을 1 씩 이동
    • (새로운) 머리를 추가하는 것은 문자열을 추가합니다
  • 그리드는 내부적으로 배열이지만 shell / sh는 이것을 알지 못합니다.
    • 전역 변수를 사용하여 추악한 평가 호출을 통해 배열 (x, y)을 "에뮬레이션"했습니다.
  • 그리고 마침내 : 우리는 많은 재미를 가지고 있었다!
#!/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

enter image description here


이것은 실제로 작동 합니까? 뱀이 오른쪽으로 가고 당신이 a그것을 누르면 중지합니다. 기묘한.
gniourf_gniourf

예, 당신이 스스로를 물기 때문에 IMHO가되어야합니다. 우리는 내부적으로 모든 사람들이 이에 동의한다고 논의했습니다.
Bastian Bittorf

echo -n확실히 휴대용이 아닙니다. 첫 번째 피연산자가 -n이거나 피연산자 중 하나에 백 슬래시 ( '\') 문자가 포함 된 경우 결과는 구현 정의됩니다. 스위치없이 리터럴 텍스트 이외의 것에 에코를 사용하는 것은 이식성이 없습니다. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h

nyuszika7h : 어떻게 이것을 우회시키는 지 아십니까?
Bastian Bittorf

nyuszika7h : 메인 'echo -n'호출을 제거하는 방법을 찾았으므로 하나의 호출 만 남았습니다. '홈 포지션으로 이동 (0,0)'에 대한 이스케이프 시퀀스를 호출합니다
Bastian Bittorf

4

루비 1.9 / 윈도우 만 / ( 354 337 355 346 바이트)

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 콘솔의 20x40 보드에서 재생됩니다. 점수는 보드 아래에 표시됩니다. WASD뱀을 제어하는 ​​데 사용 하고 다른 키는 강제로 종료합니다. 라인 5의 끝에서 슬립 시간을 편집하여 속도를 제어하십시오. 또는 수면을 완전히 제거하여 10자를 저장하고 거의 재생할 수 없게 만듭니다!

보너스 기능 : 무작위로 시작되지 않습니다 (뱀의 위치에서 초기 조각이 생성 될 때).

비 차단 getchar의 부족을 해결하려면 ~ 100 문자가 필요했습니다. 분명히 Ruby 1.9.3에는 "io / console"라이브러리가 포함되어 있으며,이 라이브러리의 약 절반을 저장했습니다. 그리고이 솔루션은 Windows 전용입니다. * nix 시스템에서 동일한 유형의 작업을 수행하는 게시 된 솔루션이 있지만 문자 수를 비교하기 위해 테스트하지 않았습니다.

편집하다:

꼬리는 식사 후에 만 ​​각 단계가 아니라 자라는 것을 깨달은 후 18 바이트를 추가해야했습니다.

편집 2 : (아마도) 수정 된 충돌 문제는 하나의 음식 항목으로 제한하여 9 바이트를 저장했습니다.


한 번에 여러 음식 항목에 대한 아이디어가 마음에 들지만 큰 문제가 있습니다. 꼬리가 플레이어와 함께 움직여야하며 수집하는 모든 음식에 대해 한 문자 씩만 커야합니다.
Blazer

내가 고치기 위해 작업하는 동안 주석을 추가했습니다 ... 한 조각 만 있어야하는 경우 9.times{}9 자를 저장하여을 제거 할 수 있습니다 .
AShelly

유일한 요구 사항은 한 번에 한 개 이상의 음식이 있어야한다는 것입니다. 예, 한 번에 한 개만 만들면 일부 캐릭터를 절약 할 수 있습니다.
Blazer

~ 140 포인트에서 게임이 무작위로 추락했습니다. 왜 그런지 확실하지 않습니다. 그러나 그렇지 않으면 아주 좋은
Blazer

충돌을 해결했다고 생각합니다. 다시 충돌이 발생하면 루비 오류 메시지를 알려주십시오.
AShelly

4

애플 소프트 베이직-478 (462)

이것은 처음으로 코드 골프 였지만 1989 년에 다시 쓰여졌으며 요청 된대로 뱀 게임을 구현합니다 (그러나 음식이 없으면 뱀은 계속 자라며 실제로는 두 명의 플레이어입니다). Applesoft Basic.

Dr. Dobbs 저널과 같이 당시에는 두 줄의 프로그램 공모전이있었습니다. 나는 6 개월 동안이 문자를 255 자로 제한하는 두 줄에 맞추는 방법을 알아 냈습니다.

자세한 정보 : http://davesource.com/Projects/SpeedWaller/

입력 한 프로그램은 정확히 두 줄입니다.

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

형식이 지정된 목록은 다음과 같습니다.

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

이 게임은 실제로 두 명의 플레이어 이며 페이지 하단에 키와 카운터를 보여주는 "지침"을 포함하여 얼마나 많은 단계를 살아남 았는지 확인할 수 있습니다. 478 자, 그중 16 개가 명령어 및 카운터 출력이므로 462 문자를 제거하려면 462 자입니다.


4

C # .NET Framework 4.7.2 콘솔 ( 2,456 2,440 2,424 2,408 2,052 1,973 1,747 1,686 바이트)

이것은 재미 있었지만, 한 글자이기 때문에 어떤 변수가 무엇인지 생각해야했습니다.

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

일부 스크린 샷 :

10 점의 뱀 뱀이 4 점으로 추락

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

GitHub 리포지토리 : https://github.com/wooden-utensil/snakeCodeGolf

변경 내역 : https://github.com/wooden-utensil/snakeCodeGolf/releases


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

1
에서처럼 튜플을 사용해 보셨습니까 (int X,int Y)d; ...; d=(0,-1)? 바이트를 절약 할 수 있습니다. 나는 또한 왜 당신이 Vector2 d;Vector2 c;Vector2 a;대신 하고 있는지 알 수 없습니다 Vector2 d,c,a. Console.SetCursorPosition 함수를 Action<...>단일 문자 변수 로 저장할 수도 있다고 생각합니다 . -연산자를 사용하여 DateTime을 뺄 수 있습니다. 또한 루프 변수를 전역 적으로 선언하고 선언하지 않고 필요할 때 간단히 제로화 할 수 있습니다.
내 대명사는

1
[제안 계속] 키워드를 사용하는 대신 변수를 사용 1>0하거나 저장할 수 있습니다 true. 루프에서 영광스러운-> 연산자를 사용할 수 있습니다. 에서 DateTime b = DateTime.Now부분 b일 수있다 var. 다음을 사용하여 일부 바이트를 저장하거나 저장하지 못할 수 있습니다 dynamic(종종 다른 유형의 선언을 병합 할 수 있음).
내 대명사는

1
m.write(String)그것의 자신의 1 문자 긴 기능을 끌어 당기는 것은 아마 톤을 절약 할 것이다
Veskah

1
또한 사용되는 몇 가지 블록 b.widthb.height많은 문자가있을 수 있습니다. 1 개의 이름이 지정된 로컬 var에 저장 될 수 있습니다
Veskah

3

파이썬 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)

깨끗하게 종료되지 않습니다. 뱀 위에 스폰되면 조각이 사라질 수 있습니다.


1

배쉬 (너무 많은 문자 : 약 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

스크린 샷

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.