Tái tạo trò chơi 'Rắn' trong bảng điều khiển / thiết bị đầu cuối


25

Trò chơi rất vui

codegolf ở đây rất thú vị, tôi đã phải tạo một phiên bản cho các game cổ điển khác tương tự về độ phức tạp. Cách ngắn nhất để tạo trò chơi Kẻ xâm lược không gian cơ bản trong Python

Tuy nhiên, lần này, hãy thử tạo lại trò chơi 'Rắn' cổ điển, trong đó bạn bắt đầu như một hình dạng nhỏ, liên tục di chuyển để thu thập các mảnh để tăng điểm của bạn. Khi bạn thu thập một mảnh, 'cái đuôi' của bạn sẽ phát triển, đi theo con đường bạn đã thực hiện. Mục tiêu là tồn tại lâu nhất mà không đâm vào đuôi của bạn, hoặc vào tường

Trình độ chuyên môn:

  • Bạn, những nhân vật tạo nên đuôi, những bức tường và những mảnh bạn thu thập đều phải là những nhân vật khác nhau
  • hiển thị một HUD với số điểm. Điểm tăng thêm 1 điểm cho mỗi phần bạn thu thập
  • Người chơi thua khi va chạm với đuôi hoặc tường của chính họ
  • một mảnh sinh sản trong một khu vực ngẫu nhiên ngay sau khi một mảnh được thu thập, chưa kể khi bắt đầu trò chơi
  • Tốc độ của trò chơi không thành vấn đề, miễn là nó phù hợp
  • Các 'ô' phải là 2x1 ký tự, vì chiều cao của các ký tự khối là ~ gấp đôi chiều rộng Có thể là 1x1, vì 2x1 chỉ xấu và tôi không thực sự nghĩ về điều đó
  • Các phím để thay đổi hướng lần lượt là awsd, trái, lên, xuống, phải
  • hướng bắt đầu phải luôn luôn lên
  • Bạn phải hiển thị các cạnh của bức tường. Điểm số có thể chồng lên tường

Mã ngắn nhất đáp ứng các tiêu chí trên sẽ thắng. Điểm thưởng tưởng tượng cho sự sáng tạo


Con rắn không được cho là lớn lên khi ăn?
đã ngừng quay ngược chiều

hm "Khi bạn thu thập một mảnh, 'cái đuôi' của bạn sẽ phát triển, đi theo con đường bạn đã thực hiện.", Vì vậy, con rắn lớn lên.
Blazer

2
Nếu không có awsdvà các starting direction should always be upyêu cầu, M-x snakesẽ hoạt động
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))sẽ làm thủ thuật sau đó.
Jonathan Leech-Pepin

Liên quan:
Nibble

Câu trả lời:


32

JavaScript ( 553 512 byte)

Liên kết đến phiên bản có thể chơi được

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}

Tôi đã cố gắng làm cho nó xuất ra giao diện điều khiển thực sự lúc đầu (với console.logconsole.clear), nhưng nó nhấp nháy quá nhiều, vì vậy tôi đưa nó vào HTML giống như giao diện điều khiển. Nó sẽ hoạt động với điều này:

<pre id=x>

Ngoài ra tôi đã triển khai nó với các ô 2x1 trước, nhưng nó trông tệ hơn 1x1. Đó sẽ là một thay đổi nhỏ mặc dù.

Sử dụng awsdcác phím trên bàn phím.

Cập nhật:

Tôi đã có thể cắt nó xuống còn 512 (chính xác là 0x200) byte bằng cách cải thiện tìm kiếm đuôi và thực hiện thêm một số phép thuật.

Bây giờ bạn có được 2 điểm khi một mảnh xuất hiện ở đuôi của bạn (đó là một tính năng). Tôi cũng sửa lỗi chồng chéo khi con rắn tự cắn.


1
đẹp! và bạn nói đúng, nó trông tốt hơn 1x1 so với 2x1. lo lắng duy nhất tôi thực sự có là lên xuống nhanh hơn trái và phải nhưng có thể xem xét các ràng buộc. Đèn flash trong bảng điều khiển tôi không bận tâm lắm (xem chương trình kẻ xâm lược không gian của tôi, nó khá nhấp nháy) nhưng tôi cho rằng một trang web văn bản đơn giản cũng hoạt động! một điều mặc dù ... có cách nào để khởi động lại mà không cần làm mới không? :(
Blazer

Không hoạt động vớiawsd
Neal

@Blazer Điều đó sẽ mất thêm 13 ký tự: - / ... và dù sao bạn cũng có phím F5.
sao chép

@Neal Yeah Tôi đã sử dụng các phím mũi tên nhưng đã sửa nó ngay bây giờ.
sao chép

@copy Tôi cho rằng tôi đã không yêu cầu
Blazer

21

Mã máy x86 (128 byte)

Giống như đệ trình của tôi để tạo ra một Fractal Mandlebrot , tôi đã viết một prod cho trò chơi con rắn trong 128 byte. Nó không đáp ứng đầy đủ các yêu cầu của thử thách (nó bắt đầu di chuyển đúng, không phải tất cả các bức tường đều được vẽ), nhưng tôi đang đăng nó vì tôi nghĩ đó là một giải pháp thú vị và sáng tạo. Điểm số được hiển thị ở dạng nhị phân ở bên phải, các phím mũi tên điều khiển hướng chuyển động, 'thức ăn' được thả ngẫu nhiên và nó kết thúc nếu bạn tự đánh mình, vào tường hoặc cạnh màn hình.

Liên kết để thực thi và mã nguồn

Ảnh chụp màn hình

Ngoài ra, liên quan đến nhận xét trước đó về việc liệu dosbox có gian lận hay không, tôi nghĩ hoàn toàn chấp nhận được miễn là nó ở chế độ hiển thị dựa trên văn bản, kể từ đó nó chỉ là một thiết bị đầu cuối dos.


Tại sao DOSBox sẽ bị coi là gian lận? Đó là một nền tảng hoàn toàn hợp pháp.
dfeuer

9

16 bit 8086

526 byte / 390 byte

Giải mã điều này bằng bộ giải mã Base64 và gọi nó là "Snake.com", sau đó thực thi từ dấu nhắc lệnh của Windows. Đã thử nghiệm trên WinXP, bạn có thể cần sử dụng DosBox để có chế độ video phù hợp. Các phím điều khiển là 'wasd' và khoảng trống để thoát. Nhấn 'w' để bắt đầu.

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

Đây là phiên bản chế độ ký tự dài 390 byte:

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

Chế độ ký tự này dài hơn ba byte (nhưng con rắn tốt hơn):

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

điểm cho sự sáng tạo, nhưng tôi nghĩ rằng việc sử dụng dosbox là gian lận vì thách thức là làm cho trò chơi hoạt động trong bảng điều khiển ascii hoặc thiết bị đầu cuối, không phải là dosbox. Ngoài ra, không nên mã golf là mã nguồn, không phải nhị phân?
Blazer

7
@Blazer: Đó là mã nguồn - Tôi đã nhập mã máy bằng cách sử dụng trình soạn thảo hex - đó là cách tôi làm việc! ;-) Điều DosBox chỉ cần thiết nếu trình điều khiển video của bạn gặp sự cố với đồ họa chế độ 13 (thẻ của tôi ổn với nó). Sẽ không khó để làm một phiên bản ascii (có thể nhỏ hơn nữa)
Skizz

Phiên bản "390 byte" chỉ giải mã được 39 byte và bị treo khi chạy trong dosbox. Có vẻ như một cái gì đó có thể đã bị mất trong truyền. :( Tuy nhiên, hai phiên bản còn lại cực kỳ hay!
Ilmari Karonen

Có một phiên bản không mã hóa của mã? (Tôi không biết ngôn ngữ này)
AL

1
@ n.1: Chương trình là mã máy 8086, bạn có thể tải nó vào trình gỡ lỗi (D86) và xem mã dưới dạng văn bản, mặc dù không có tên nhãn.
Skizz

6

vỏ / sh, 578 ký tự

Tôi đã cố gắng tuân thủ POSIX (càng di động càng tốt và tránh bashism, ngay cả trình tạo số ngẫu nhiên cũng không cần / Proc). Ví dụ, bạn có thể phát nó trong thiết bị đầu cuối gốc hoặc thông qua phiên SSH: chạy với 'dash -c ./snake' Ngoài ra còn có một biến thể không thể đọc được / có thể đọc được trong ~ 2800 byte, có thể thấy ở đây .

Một số lưu ý: shell-scripting không phù hợp với các trò chơi mã hóa 8-)

  • để công bằng, chúng tôi chỉ sử dụng cái gọi là 'nội dung', có nghĩa là:
    • không có cuộc gọi bên ngoài của các chương trình như 'rõ ràng', 'stty' hoặc 'tput'
    • Do đó, chúng tôi vẽ lại toàn bộ màn hình mỗi khi di chuyển
    • các nội trang được sử dụng duy nhất (còn gọi là lệnh gốc) là:
      • echo, eval, while-loop, let, break, read, case, test, set, shift, alias, source
  • không có trình tạo số ngẫu nhiên (PRNG), vì vậy chúng tôi phải tự xây dựng
  • nhận được một khối tổ hợp phím, vì vậy chúng ta phải sinh ra một chủ đề khác
    • để nhận được sự kiện trong tác vụ cha mẹ, chúng ta sử dụng tempfile (xấu xí!)
  • Bản thân con rắn là một danh sách, giá rẻ:
    • mỗi phần tử là một (x, y) -tuple
    • mất đuôi có nghĩa là: thay đổi danh sách bằng 1
    • thêm một đầu (mới) có nghĩa là: nối một chuỗi
  • lưới bên trong là một mảng, nhưng shell / sh không biết điều này:
    • chúng tôi "mô phỏng" mảng (x, y) thông qua một cuộc gọi tệ hại với các vars toàn cầu
  • và cuối cùng: chúng tôi đã có rất nhiều niềm vui!
#!/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

nhập mô tả hình ảnh ở đây


Điều này thực sự làm việc ? nếu con rắn đi bên phải và bạn nhấn anó dừng lại. Kỳ dị.
gniourf_gniourf

Vâng, bởi vì bạn tự cắn mình - đó là cách nó phải là IMHO. Chúng tôi đã thảo luận rằng trong nội bộ và mọi người đồng ý về điều này.
Bastian Bittorf

echo -nchắc chắn không phải là di động. Nếu toán hạng đầu tiên là -n hoặc nếu bất kỳ toán hạng nào chứa ký tự dấu gạch chéo ngược ('\'), thì kết quả được xác định theo thực hiện. Sử dụng tiếng vang cho bất cứ điều gì khác ngoài văn bản bằng chữ mà không có bất kỳ công tắc nào là không khả dụng. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h

nyuszika7h: bất kỳ ý tưởng làm thế nào để di chuyển này?
Bastian Bittorf

nyuszika7h: tôi đã tìm ra cách để loại bỏ cuộc gọi 'echo -n' chính - vì vậy chỉ còn một cuộc gọi. nó gọi trình tự thoát cho 'đi đến vị trí nhà (0,0)'
Bastian Bittorf

4

Ruby 1.9 / Chỉ Windows / ( 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

Chơi trong một bảng 20x40 trong bảng điều khiển windows. Điểm số được hiển thị dưới bảng. Sử dụng WASDđể điều khiển con rắn, bất kỳ phím nào khác để thoát (mạnh mẽ!). Chỉnh sửa thời gian ngủ ở cuối dòng 5 để kiểm soát tốc độ. (Hoặc lưu 10 ký tự và làm cho nó gần như không thể phát được bằng cách xóa hoàn toàn giấc ngủ!)

Tính năng phần thưởng: ngẫu nhiên không khởi động (khi phần ban đầu được tạo ở vị trí của rắn).

Tôi cần ~ 100 ký tự để làm việc xung quanh việc thiếu một getar không chặn. Rõ ràng Ruby 1.9.3 bao gồm một thư viện "io / console" đã cứu được khoảng một nửa số đó. Và giải pháp này là Windows cụ thể. Có những giải pháp được công bố để thực hiện cùng một loại điều trong các hệ thống * nix, nhưng tôi chưa thử nghiệm chúng để so sánh số lượng ký tự.

Chỉnh sửa:

Phải thêm 18 byte sau khi tôi nhận ra rằng đuôi chỉ phát triển sau khi ăn chứ không phải sau mỗi bước.

Chỉnh sửa 2: (Có thể) đã khắc phục sự cố sự cố, đã lưu 9 byte bằng cách giới hạn ở một mục thực phẩm.


Tôi thích ý tưởng về nhiều mặt hàng thực phẩm cùng một lúc, tuy nhiên có một vấn đề lớn: đuôi phải di chuyển với người chơi, chỉ phát triển bởi một nhân vật cho mỗi miếng thức ăn bạn thu thập.
Blazer

Bạn đã thêm nhận xét trong khi tôi đang sửa nó ... Nếu chỉ có một phần, tôi có thể xóa 9.times{}, lưu 9 ký tự.
HỎI

yêu cầu duy nhất là có 1 hoặc nhiều miếng thức ăn cùng một lúc, vì vậy, vâng, bạn chỉ có thể làm cho nó 1 miếng mỗi lần, tiết kiệm một số ký tự
Blazer

trò chơi ngẫu nhiên sụp đổ với tôi ở mức ~ 140 điểm, không biết tại sao. nhưng nếu không thì rất đẹp
Blazer

Đã sửa lỗi sự cố, tôi nghĩ vậy. Nếu nó gặp sự cố một lần nữa, xin vui lòng cho tôi biết thông báo lỗi ruby.
HỎI

4

Applesoft cơ bản - 478 (462)

Đây là môn đánh gôn đầu tiên của tôi, nhưng nó được viết lại vào năm 1989 và nó chủ yếu thực hiện trò chơi rắn theo yêu cầu (nhưng không có thức ăn, rắn chỉ liên tục phát triển và thực sự là hai người chơi chứ không phải một) chỉ sử dụng hai dòng Táo cơ bản.

Có một số cuộc thi chương trình hai dòng tại thời điểm đó, chẳng hạn như trong tạp chí Tiến sĩ Dobbs. Tôi đã dành 6 tháng để tìm ra cách ghép nó thành hai dòng có giới hạn 255 ký tự (và chỉ một nhánh)

Thêm thông tin tại: http://davesource.com/Projects/SpeedWaller/

Chương trình được nhập chính xác là hai dòng:

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

Danh sách khi được định dạng trông như thế này:

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

Trò chơi thực sự là hai người chơi và bao gồm "hướng dẫn" ở cuối trang hiển thị các phím cũng như bộ đếm để bạn có thể thấy bạn đã sống sót bao nhiêu bước. Đó là 478 ký tự, 16 trong số đó là các hướng dẫn và bộ đếm đầu ra, vì vậy 462 nếu bạn muốn loại bỏ chúng.


4

Bảng điều khiển C # .NET Framework 4.7.2 ( 2.456 2.440 2.424 2.408 2.052 1.973 1.747 1.686 byte)

Điều này thật thú vị, nhưng tôi thực sự phải nghĩ biến số là gì, bởi vì chúng chỉ là một chữ cái.

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

Một số ảnh chụp màn hình:

Con rắn có điểm 10 Con rắn bị rơi với số điểm 4

Nhị phân: https://github.com/wooden-utensil/snakeCodeGolf/release/tag/v1.0.0.0

Kho lưu trữ GitHub: https://github.com/wooden-utensil/snakeCodeGolf

Thay đổi: https://github.com/wooden-utensil/snakeCodeGolf/release


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

1
Bạn đã thử tuples như trong (int X,int Y)d; ...; d=(0,-1)? Điều đó có thể tiết kiệm byte. Tôi cũng không thể thấy lý do tại sao bạn làm Vector2 d;Vector2 c;Vector2 a;thay vì Vector2 d,c,a. Tôi nghĩ bạn cũng có thể lưu trữ hàm Console.SetCthonP vị trí dưới dạng một Action<...>biến chữ cái đơn. Bạn có thể trừ DateTime với toán tử -. Bạn cũng có thể khai báo các biến vòng lặp trên toàn cầu và chỉ cần loại bỏ chúng khi cần mà không cần khai báo chúng.
đại từ của tôi là monicareinstate

1
[đề xuất tiếp tục] Bạn có thể sử dụng 1>0hoặc lưu trữ truetrong một biến thay vì sử dụng từ khóa. Bạn có thể sử dụng toán tử vinh quang -> trong các vòng lặp. Trong DateTime b = DateTime.Nowphần, bcó thể được var. Bạn có thể hoặc không thể lưu một số byte bằng cách sử dụng dynamic(thường cho phép bạn hợp nhất các khai báo được gõ khác nhau).
đại từ của tôi là monicareinstate

1
Kéo m.write(String)theo chức năng dài một chữ cái của riêng nó có thể sẽ tiết kiệm được một tấn
Veskah

1
Ngoài ra còn có một vài khối sử dụng b.widthb.heightrất nhiều khối có thể được lưu vào một chữ cái khác có tên var
Veskah

3

Trăn 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)

Không bỏ thuốc sạch. Mảnh có thể biến mất nếu nó sinh sản trên đầu con rắn.


1

Bash (quá nhiều nhân vật: khoảng năm 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

Ảnh chụp màn hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.