課題は、できるだけ少ないバイトを使用して古典的なSnakeゲームを作成することです。
要件は次のとおりです。
- ゲームは一般的な2次元レイアウトで実装する必要があります。ヘビは、マップの境界内で大きく成長できるはずです(これは、実際には、マップを小さくしすぎず、ここであなたの裁量を使用することを意味します)。
- ユーザーは、選択したキーを使用してヘビを動かすことができますが、ヘビは自分自身を元に戻すことはできません(たとえば、西に行く場合、最初に北または南に行かなければ東に行くことはできません)。ヘビは、上、下、左、右(北、南、西、東)の4方向すべてに移動できる必要があります。
- ヘビは長さ1から始まり、「食品」オブジェクトを食べるたびに長さが+1増加します
- 食べ物のオブジェクトは、ヘビが占有している場所以外の場所にランダムに配置されます
- ヘビが自分自身または壁に当たった場合、ゲームは終了します
- ゲームが終了すると、「スコア:[スコア]」という文字列が表示されます。[スコア]は、ゲーム中に食べた食品の数です。そのため、たとえば、ゲームの終了時にヘビが4つの「食べ物」を食べた(したがって5の長さを持っている)場合、「Score:4」が印刷されます。
- コードで明示的に定義されていない限り、圧縮アルゴリズムはありません。
これが私のソリューション、908 Bytes、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
