Відтворіть гру «Змія» в консолі / терміналі


25

Ігри - це весело

цей кодовий гольф тут був таким веселим, що мені довелося скласти версію для інших класичних ігор, схожих за складністю. Найкоротший спосіб створення базової гри Space Invaders в Python

На цей раз, проте, спробуйте відтворити класичну гру «Змія», в якій ви починаєте як маленьку фігуру, постійно переходячи до збору творів, щоб збільшити свій рахунок. Коли ви збираєте шматок, ваш «хвіст» виростає, що слідує шляхом, який ви пройшли. Мета - тривати найдовше, не врізавшись у власний хвіст чи у стіни

Кваліфікація:

  • Ви, персонажі, які складають хвіст, стіни та зібрані вами частини, повинні бути різними символами
  • покажіть HUD з оцінкою. Оцінка збільшується на 1 бал за кожен збірник
  • Гравець програє, коли стикається з власним хвостом або стіною
  • шматок нереститься у випадковій зоні одразу після того, як фрагмент буде зібраний, не кажучи вже про початок гри
  • Швидкість гри не має значення, поки вона є послідовною
  • "Осередки" мають бути 2х1 символами, оскільки висота блокових символів становить ~ вдвічі ширше. Може бути 1х1, тому що 2x1 просто негарна, і я не думав про це
  • Клавіші для зміни напрямку повинні бути відповідно awsdліворуч, вгору, вниз, праворуч
  • вихідний напрямок завжди повинен бути вгору
  • Потрібно показати краї стіни. Оцінка може перекривати стіну

Виграє найкоротший код, який відповідає зазначеним вище критеріям. Уявні бонусні бали за творчість


Змія не повинна рости під час їжі?
— перестали повертати проти годинника,

гм? "Коли ви збираєте шматок, то росте" хвіст ", який іде по шляху, який ви пройшли." Так, так, змія росте.
— Блейзер

2
Без awsdі starting 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))би трюк тоді.
— Джонатан Ліч-Пепін

Пов'язаний: Nibbles Ностальгія
— sergiol

Відповіді:


32

JavaScript ( 553 512 байт)

Посилання на версію, що відтворюється

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}

Я спробував зробити його вихідним на реальну консоль спочатку (з console.logі console.clear), але це занадто мерехтіло, тому я вклав це в консольний HTML. Він буде працювати з цим:

<pre id=x>

Також я спершу реалізував його з 2х1 осередками, але він виглядав гірше, ніж 1х1. Це була б незначна зміна.

Використовує awsdклавіші на клавіатурі.

Оновлення:

Мені вдалося скоротити його до 512 (рівно 0x200) байтів, покращивши пошук хвоста і зробивши ще одну магію.

Тепер ви отримуєте 2 бали, коли шматок нереститься у хвості (це особливість). Я також виправила перекриття, коли змія сама кусається.


1
гарний! і ти маєш рацію, це виглядає краще як 1x1, ніж 2x1. Єдине хвилювання, яке я насправді мав там, було вгору і вниз, тим, що швидше, ніж ліворуч і праворуч, але це можливо з огляду на обмеження. Миготіння в консолі я не так сильно заперечую (див. Мою програму загарбників космічного простору, її досить мерехтіння), але я припускаю, що веб-сторінка із текстовим текстом також працює! одна якість, хоча ... чи є спосіб перезапустити, не потребуючи оновлення? :(
— Блейзер

Не працює зawsd
— Ніл

@Blazer Це займе більше 13 символів: - / ... і у вас все одно є клавіша F5.
— копія

@Neal Так, я використовував клавіші зі стрілками, але виправив це зараз.
— копія

@copy Я припускаю, що я цього не зробив вимогою
— Блазер

21

машинний код x86 (128 байт)

Настільки ж , як і моє подання про створення мандлбротського фрактала , я написав пропозицію для гри в змію у 128 байтах. Це не повністю відповідає вимогам виклику (він починає рухатися правильно, не всі стіни намальовані), але я розміщую його, тому що я думаю, що це цікаве та творче рішення. Оцінка відображається у двійковій частині праворуч, клавіші зі стрілками керують напрямом руху, "їжа" випадає випадковим чином, і вона закінчується, якщо вдарити себе, стіну чи край екрана.

Посилання на виконуваний та вихідний код

Знімок екрана

Також, що стосується попереднього коментаря щодо того, чи добокс обманює, я вважаю цілком прийнятним, якщо він перебуває в текстовому режимі відображення, оскільки тоді це просто дос термінал.


Чому DOSBox коли-небудь вважатиметься обманом? Це ідеально законна платформа.
— dfeuer

9

16 біт 8086

526 байт / 390 байт

Розшифруйте це за допомогою декодера Base64 і назвіть його "snake.com", а потім виконайте з командного рядка Windows. Випробуваний на WinXP, можливо, вам доведеться використовувати DosBox, щоб отримати правильний режим відео. Клавішами керування є "wasd" та пробіл для виходу. Натисніть "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

Цей режим символів на три байти довший (але змія - краща):

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

моменти для творчості, але я думаю, що використання dosbox - це обман, тому що завдання полягає в тому, щоб гра працювала на консолі або терміналі ascii, а не в dosbox. також, чи не повинен код гольфу бути вихідним кодом, а не двійковим?
— Блейзер

7
@Blazer: Це вихідний код - я набрав машинний код за допомогою шестигранного редактора - ось як я l337! ;-) Справа DosBox потрібна лише у тому випадку, якщо у ваших відео драйверів є проблеми з графікою режиму 13 (з моєю карткою це нормально). Зробити версію ascii (напевно, і меншу) було б непросто
— Skizz

Версія "390 байтів" розшифровується до 388 байт і зависає під час роботи під dosbox. Схоже, щось може загубитися в передачі. :( Все-таки інші дві версії надзвичайно круті!
— Ільмарі Каронен

Чи є версія коду, що не має волі? (Я не знаю цієї мови)
— AL

1
@ n.1: Програма має машинний код 8086, ви можете завантажити її в відладчик (D86) і переглянути код як написаний, хоча і без назви міток.
— Скізз

6

оболонка / ш, 578 символів

Я намагався бути сумісним з POSIX (будучи максимально портативним і уникати башизмів, навіть генератор випадкових чисел не потребує / прок). Ви можете, наприклад, відтворити його у рідному терміналі або через SSH-сеанс: запустити з 'dash -c ./snake' Існує також негліфікований / читабельний варіант у ~ 2800 байт, який можна побачити тут .

Деякі зауваження: сценарій оболонки не підходить для кодування ігор 8-)

  • щоб бути справедливим, ми використовували лише так звані "вбудовані", що означає:
    • відсутність зовнішніх викликів програм, таких як 'clear', 'stty' або 'tput'
    • через це ми перемальовуємо весь екран на кожному русі
    • Єдиними вбудованими вбудованими (відомими також рідними командами) є:
      • echo, eval, while-loop, нехай, перерва, читання, випадок, тест, встановлення, зсув, псевдонім, джерело
  • немає генератора випадкових чисел (PRNG), тому ми повинні побудувати свій власний
  • отримання блоків натискання клавіш, тому ми повинні породити ще одну нитку
    • для отримання події у батьківському завданні ми використовуємо tempfile (некрасиво!)
  • сама змія - це список, який коштує дешево:
    • кожен елемент - це (x, y) -двій
    • втратити хвіст означає: перенести список на 1
    • додати (нову) голову означає: додати рядок
  • сітка є внутрішнім масивом, але shell / sh не знає цього:
    • ми "емулювали" масив (x, y) через потворний eval-call з глобальними vars
  • і нарешті: нам було дуже весело!
#!/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

введіть тут опис зображення


Це насправді працює ? якщо змія рухається праворуч, а ти натискаєш aїї зупиняється. Дивно.
— gniourf_gniourf

Так, тому що ти кусаєш себе - ось так має бути ІМХО. Ми обговорювали це внутрішньо, і всі згодні з цим.
— Бастіан Бітторф

echo -nточно не є портативним. Якщо перший операнд -n або якщо будь-який з операндів містить символ зворотної косої риси ('\'), результати визначаються реалізацією. Використання ехо для нічого, крім прямого тексту без будь-яких комутаторів, не є портативним. pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
— nyuszika7h

nyuszika7h: будь-яка ідея, як це обійти?
— Бастіан Бітторф

nyuszika7h: я знайшов спосіб видалити головний виклик 'echo -n' - тому залишився лише один дзвінок. це викликає послідовність втечі для "перейти до домашньої позиції (0,0)"
— Bastian Bittorf

4

Ruby 1.9 / тільки для Windows / ( 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

Відтворюється на дошці 20x40 на консолі Windows. Оцінка відображається під дошкою. Використовуйте WASDдля керування змією, будь-яку іншу клавішу для виходу (насильно!). Відредагуйте час сну в кінці рядка 5, щоб контролювати швидкість. (Або збережіть 10 символів і зробіть це майже не можливим для відтворення, повністю знімаючи сон!)

Особливість бонусу: випадковим чином не запускається (коли в місці розташування змії генерується початковий фрагмент).

Мені знадобилося ~ 100 символів, щоб подолати брак неблокуючого гатчара. Очевидно, що Ruby 1.9.3 містить бібліотеку "io / console", яка б зберегла приблизно половину з них. І це рішення є специфічним для Windows. Є опубліковані рішення для того ж типу речей у * nix системах, але я не перевіряв їх для порівняння кількості символів.

Редагувати:

Довелося додати 18 байт після того, як я зрозумів, що хвіст росте тільки після їжі, а не після кожного кроку.

Редагування 2: (можливо) виправлена ​​помилка аварії, збережено 9 байт, обмежившись одним продуктом харчування.


Мені подобається ідея декількох харчових продуктів одночасно, проте є велика проблема: хвіст повинен рухатися разом із гравцем, лише зростаючи на одного персонажа на кожен зібраний вами шматок їжі.
— Блейзер

Ви додали коментар, коли я працював над його виправленням ... Якщо має бути лише одна деталь, я можу видалити 9.times{}, зберегли 9 символів.
— AShelly

Єдина вимога полягає в тому, щоб одночасно було 1 або більше шматочків їжі, так що так, ви можете просто зробити його за один шматок за один раз, заощадивши деяких персонажів
— Blazer

гра випадковим чином розбилася на мені в ~ 140 очок, не знаю чому. але в іншому випадку дуже приємно
— Blazer

Я думаю, виправлено збій. Якщо вона знову вийде з ладу, повідомте мене про повідомлення про помилку в рубіні.
— AShelly

4

Applesoft Basic - 478 (462)

Це був мій перший гольф з кодом, але він був написаний ще в 1989 році, і він здебільшого реалізує гру на змію відповідно до вимоги (але без їжі змії постійно постійно ростуть, і це насправді два гравці, а не один), використовуючи лише два рядки Applesoft Basic.

У той час було проведено ряд програмних конкурсів на два рядки, наприклад, у журналі "Доктор Доббс". Я провів 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, якщо ви хочете їх відтерти.


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)
— Стівен

1
Ви пробували кортежі, як у (int X,int Y)d; ...; d=(0,-1)? Це може зберегти байти. Я також не бачу, чому ти робиш Vector2 d;Vector2 c;Vector2 a;замість цього Vector2 d,c,a. Я думаю, що ви також можете зберігати функцію Console.SetCursorPosition як однобуквенну Action<...>змінну. Ви можете відняти DateTime з оператором -. Ви також можете оголосити змінні циклу в усьому світі і просто нуль, коли потрібно, не оголошуючи їх.
— мій займенник monicareinstate

1
[пропозиції продовжуються] Ви можете використовувати 1>0або зберігати trueзмінну замість ключового слова. Можливо, ви зможете використовувати оператора славного -> в циклі. У DateTime b = DateTime.Nowчастині, bможе бути var. Ви можете або не зможете зберегти деякі байти, використовуючи dynamic(часто дозволяє об’єднувати декларації різного типу).
— мій займенник monicareinstate

1
Виконання m.write(String)своєї власної
— однолітерної

1
Також є кілька блоків, які використовують b.widthі b.heightбагато, що, ймовірно, може бути збережено до іншого місцевого
— вару з

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

Bash (занадто багато символів: приблизно 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

Знімок екрана

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.