문제는 가능한 적은 바이트를 사용하여 클래식 스네이크 게임을 만드는 것입니다.
요구 사항은 다음과 같습니다.
- 게임은 일반적인 2 차원 레이아웃으로 구현해야합니다. 뱀은지도의 경계 내에서 크게 자랄 수 있어야합니다 (이것은 실제로지도를 너무 작게 만들지 말고 여기에 재량을 사용하십시오).
- 사용자는 원하는 키를 사용하여 뱀을 움직일 수 있지만, 뱀은 다시 두 배로 돌아올 수 없습니다 (예 : 서쪽으로 가면 먼저 북쪽이나 남쪽으로 가지 않고 동쪽으로 갈 수 없음). 뱀은 위, 아래, 왼쪽, 오른쪽 (북쪽, 남쪽, 서쪽, 동쪽)의 네 방향으로 모두 이동할 수 있어야합니다.
- 뱀은 길이 1로 시작합니다. "음식"물체를 먹을 때마다 길이가 +1로 자랍니다.
- 음식물은 뱀이 차지하는 곳 이외의 장소에 무작위로 배치됩니다.
- 뱀이 벽에 부딪 히거나 벽에 부딪 치면 게임이 종료됩니다
- 게임이 끝나면 문자 "Score : [score]"가 표시됩니다. 여기서 [score]는 게임 중에 먹는 음식 수입니다. 예를 들어, 게임이 끝났을 때 뱀이 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