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


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.