Завдання полягає в тому, щоб створити класичну гру Snake, використовуючи якомога менше байтів.
Ось такі вимоги:
- Гра повинна бути реалізована у типовому двовимірному макеті. Змія повинна мати можливість значно рости в межах карти (це дійсно означає, не робіть свою карту занадто малою, використовуйте тут свій розсуд).
- Користувач може переміщувати змію за допомогою клавіш на ваш вибір, проте змія не може подвоїтися назад (наприклад, якщо йде Захід, вона не може піти на Схід, не спершу пішовши на Північ або Південь). Змія повинна мати можливість подорожувати у всіх 4 напрямках: вгору, вниз, вліво, вправо (на північ, південь, захід, схід).
- Змія починається з довжини 1, щоразу, коли вона їсть "харчовий" предмет, вона виростає +1 у довжину
- Харчові предмети випадково розміщуються в інших місцях, ніж ті, що займаються змією
- Якщо Змія вдарила себе або об стіну, гра закінчена
- Після закінчення гри відображається буквальний "Оцінка: [оцінка]", де [оцінка] - кількість харчових продуктів, з'їдених під час гри. Так, наприклад, якщо змія з'їла 4 "страви" (і тому має довжину 5), коли гра закінчиться, "Оцінка: 4" буде надруковано.
- Ні алгоритмів стиснення, якщо вони чітко не визначені у вашому коді.
Ось моє рішення, 908 байт, 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