Wyzwanie polega na stworzeniu klasycznej gry Snake przy użyciu jak najmniejszej liczby bajtów.
Oto wymagania:
- Gra musi być zaimplementowana w typowym dwuwymiarowym układzie. Wąż powinien być zdolny do znacznego wzrostu w granicach mapy (to naprawdę oznacza, nie zmniejszaj mapy za bardzo, skorzystaj z własnego uznania tutaj).
- Użytkownik może przesunąć węża za pomocą wybranych przez ciebie klawiszy, jednak wąż nie może się podwoić (np. Jeśli jedzie na zachód, nie może lecieć na wschód bez uprzedniej podróży na północ lub południe). Wąż powinien być w stanie podróżować we wszystkich 4 kierunkach: w górę, w dół, w lewo, w prawo (północ, południe, zachód, wschód).
- Wąż zaczyna się od długości 1, za każdym razem, gdy zjada obiekt „jedzenia”, rośnie o +1
- Przedmioty żywnościowe są losowo umieszczane w miejscach innych niż te zajmowane przez węża
- Jeśli Wąż uderzy o siebie lub o ścianę, gra się kończy
- Po zakończeniu gry wyświetlany jest dosłowny „Wynik: [wynik]”, gdzie [wynik] to liczba artykułów spożywczych zjedzonych podczas gry. Na przykład, jeśli wąż zjadł 4 „pokarmy” (a zatem ma długość 5) po zakończeniu gry, zostanie wydrukowany „Wynik: 4”.
- Brak algorytmów kompresji, chyba że są one wyraźnie zdefiniowane w kodzie.
Oto moje rozwiązanie, 908 bajtów, Python 2.7
import random as r
import curses as c
def g(s,w,l):
while 1:
p=[r.randrange(0,w),r.randrange(0,l)]
for l in s:
if l==p:continue
return p
s=[]
d=[0,1]
p=k=n=0
e=100
v={65:[-1,0],66:[1,0],68:[0,-1],67:[0,1]}
z=c.initscr()
w,l=z.getmaxyx()[0],z.getmaxyx()[1]
c.noecho()
z.clear()
x=g(s,w,l)
s.append([w/2,l/2])
z.nodelay(1)
q=lambda h,i:range(h,len(i))
while k!=101:
k=z.getch()
if k in v and not (d[0]==(v[k][0]*-1) and d[1]==(v[k][1]*-1)):d=v[k]
f=[0,0]
for i in q(0,s):
if i == 0:
f=[s[i][0],s[i][1]]
s[i][0]+=d[0]
s[i][1]+=d[1]
else:s[i],f=f,s[i]
if s[0]==x:
n+=1
s.append(f)
x=g(s,w,l)
z.clear()
if s[0][0]>=w or s[0][1]>=l or s[0][0]<0 or s[0][1]<0:break
for i in q(1,s):
if s[0] == s[i]: k = 101
for i in q(0,s):z.addch(s[i][0],s[i][1],"X")
z.addch(x[0],x[1],"O")
z.move(0,0)
z.refresh()
if d[1]!=0:c.napms(e/2)
else:c.napms(e)
c.endwin()
print 'Score: %s'%n
Odpowiedzi:
Ruby 1.9 + SDL (
341324316)Oto pierwsza próba wersji Ruby przy użyciu biblioteki SDL. Mogę zapisać 6 znaków, jeśli wolno mi załadować bibliotekę SDL za pomocą
-rsdl
wiersza poleceń zamiast instrukcji request.Segmenty węża i kawałki żywności są reprezentowane za pomocą czarnych pikseli, rozmiar siatki wynosi obecnie 32 * 32. Możesz sterować za pomocą klawiszy strzałek (lub dowolnych klawiszy, kod 4 mod indeksuje tablicę kierunkową [LEWO, GÓRA, DÓŁ, PRAWO]). Myślę, że zdecydowanie jest tu miejsce na ulepszenia, szczególnie w oświadczeniu IF sprawdzającym śmierć.
Znacząco poprawiłem to w porównaniu z poprzednią wersją, mam nadzieję, że teraz bardziej pasuje do ducha pytania.
Jest jedna rzecz, którą muszę naprawić, aby zachować zgodność ze specyfikacją, a mianowicie to, że jedzenie może obecnie pojawiać się wewnątrz ogona.Naprawiony!Drukuje wynik na standardowe wyjście po zakończeniu gry.
źródło
Java,
23432239Nie do końca zwięzłe, ale uważam, że spełnia wszystkie wymagania.
Klasa węża
Klasa zarządu
Zrzut ekranu
Komentarz
Jakiś czas temu odwiedziłem witrynę o nazwie zetcode, która zawiera kilka samouczków dotyczących tworzenia klasycznych gier 2D w Javie. Dostarczony kod jest pod silnym wpływem samouczka, który został udostępniony dla gry Snake ... Myślę, że w tym momencie właśnie zacząłem kodować klasyczne gry i podążałem za samouczkiem na „T”.
Zrobię edycję później i dodam link do pliku wykonywalnego, aby ludzie mogli grać w grę.
EDYCJE
źródło
Bash:
537533507 znakówJak się używa
$COLUMNS
i$LINES
zmienne powłoki, należy uruchomić wczytany:. snake.sh
. Węża można kontrolować za pomocą klawiszy w/ a/ s/ d.Wiem, że można go łatwo zredukować do 493 znaków, używając
clear
ekranu do czyszczenia, ale wolę zachować czystośćbash
, bez użycia zewnętrznego narzędzia.źródło
Python 2.7:
869816818817816 znakówZhakowałem to razem w ciągu ostatnich kilku godzin. Powinien spełniać wymagania i jest o kilka znaków krótszy niż rozwiązanie mjgpy3 (Próbowałem ciężko, ale nie mogłem być znacznie krótszy. Teraz jestem zmęczony). Zaskakujące jest to, że użycie biblioteki do programowania gier, takiej jak pygame, nie skróciło węża pytona. Bardzo cenione są sugestie i porady dotyczące skrócenia. Mam nadzieję, że to nie jest zbyt tajemnicze.
Oto wynik:
EDYCJA: Mógłbym to zmniejszyć do 816 bajtów, tak! :) Naprawiono wynik
EDYCJA 2: Przypadkowo wkleiłem niewłaściwą wersję
Oto skomentowana wersja:
źródło