Thách thức là tạo ra trò chơi Snake cổ điển bằng cách sử dụng càng ít byte càng tốt.
Dưới đây là các yêu cầu:
- Trò chơi phải được thực hiện theo bố cục 2 chiều điển hình. Con rắn sẽ có thể phát triển đáng kể trong giới hạn của bản đồ (điều này thực sự có nghĩa là, đừng làm cho bản đồ của bạn quá nhỏ, hãy sử dụng theo ý của bạn ở đây).
- Người dùng có thể di chuyển con rắn bằng các phím bạn chọn, tuy nhiên, con rắn không thể tự nhân đôi (ví dụ: nếu nó đi về hướng Tây, nó không thể đi về hướng Đông mà không đi về hướng Bắc hoặc Nam). Một con rắn phải có khả năng di chuyển theo cả 4 hướng: lên, xuống, trái, phải (Bắc, Nam, Tây, Đông).
- Con rắn bắt đầu với chiều dài 1, mỗi lần nó ăn một vật "thức ăn", nó sẽ tăng thêm 1 chiều dài
- Các đối tượng thực phẩm được đặt ngẫu nhiên ở các vị trí khác ngoài những nơi bị rắn chiếm giữ
- Nếu con rắn tự đánh hoặc vào tường thì trò chơi kết thúc
- Khi trò chơi kết thúc, "Điểm: [điểm]" được hiển thị trong đó [điểm] là số lượng thực phẩm được ăn trong trò chơi. Vì vậy, ví dụ, nếu con rắn đã ăn 4 "thức ăn" (và do đó có chiều dài là 5) khi trò chơi kết thúc, "Điểm: 4" sẽ được in.
- Không có thuật toán nén trừ khi chúng được xác định rõ ràng trong mã của bạn.
Đây là giải pháp của tôi, 908 Byte, 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