ক্লাসিক সাপ গেমটি পুনরুদ্ধার করুন


11

চ্যালেঞ্জটি হ'ল যথাসম্ভব কয়েকটি বাইট ব্যবহার করে ক্লাসিক স্নেক গেম তৈরি করা।

প্রয়োজনীয়তা এখানে:

  • গেমটি অবশ্যই একটি সাধারণ দ্বিমাত্রিক বিন্যাসে প্রয়োগ করা উচিত। সাপটি মানচিত্রের সীমানার মধ্যে উল্লেখযোগ্যভাবে বেড়ে উঠতে সক্ষম হওয়া উচিত (এর অর্থ হ'ল, আপনার মানচিত্রটি খুব ছোট করে তুলবেন না, এখানে নিজের বিচক্ষণতাটি ব্যবহার করুন)।
  • কোনও ব্যবহারকারী আপনার পছন্দের কীগুলি ব্যবহার করে সাপটিকে সরিয়ে ফেলতে পারে, তবে, সাপটি নিজের উপর আবার ডাবল করতে পারে না (যেমন যদি এটি পশ্চিম দিকে চলে যায় তবে এটি প্রথমে উত্তর বা দক্ষিণে না গিয়ে পূর্ব দিকে যেতে পারে না)। একটি সাপকে সমস্ত চার দিকে ভ্রমণ করতে সক্ষম হওয়া উচিত: উপরে, নীচে, বাম, ডান (উত্তর, দক্ষিণ, পশ্চিম, পূর্ব)।
  • সাপ দৈর্ঘ্য 1 হিসাবে শুরু হয়, প্রতিবার এটি "খাদ্য" বস্তু খায় এটি দৈর্ঘ্যে +1 বৃদ্ধি পায়
  • খাবারের জিনিসগুলি এলোমেলোভাবে সাপ দ্বারা দখলে রাখা ছাড়া অন্য জায়গায় স্থাপন করা হয়
  • যদি সাপটি নিজেকে বা কোনও দেয়ালে আঘাত করে তবে খেলাটি শেষ হবে
  • যখন খেলাটি আক্ষরিক শেষ হয়ে যায় "স্কোর: [স্কোর]" প্রদর্শিত হয় যেখানে [স্কোর] গেমের সময় খাওয়া খাবারের সংখ্যা। সুতরাং, উদাহরণস্বরূপ, খেলা শেষ হওয়ার পরে যদি সাপটি 4 "খাবার" খায় (এবং সুতরাং এর দৈর্ঘ্য 5 থাকে) তবে "স্কোর: 4" মুদ্রিত হবে।
  • কোনও সংক্ষেপণ অ্যালগরিদম না থাকলে সেগুলি আপনার কোডটিতে স্পষ্টভাবে সংজ্ঞায়িত করা হয়।

এখানে আমার সমাধান, 908 বাইট, পাইথন 2.7 2.

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


1
@ কপি কিছু লোক টার্মিনালের মধ্যে সীমাবদ্ধ থাকতে পছন্দ করে না।
গ্রিফিন

সাপ দৈর্ঘ্য = 1 হলে 'সাপ ডাবল ব্যাক করতে পারে না' বিধিটি প্রয়োগ করে?
পল প্রেস্টিজ

@ ক্রন, হ্যাঁ এটা করে সর্বদা, সাপগুলি কেবল (সত্যই) দুটি উপায়ে বাঁদিকে এবং ডানদিকে ঘুরিয়ে দিতে পারে।
mjgpy3

উত্তর:


2

রুবি ১.৯ + এসডিএল (341 324 316)

এখানে এসডিএল লাইব্রেরি ব্যবহার করে রুবি সংস্করণে প্রথম চেষ্টা করা হয়েছে। -rsdlপ্রয়োজনীয় বিবৃতি পরিবর্তে কমান্ড লাইনে এসডিএল লাইব্রেরিটি লোড করার অনুমতি পেলে আমি 6 টি অক্ষর সংরক্ষণ করতে পারি ।

require'sdl'
f=o=d=3
s=SDL::Screen.open l=32,l,0,0
r=*0..l*l
loop{f==o ?f=(r-$*).sample: $*.shift
/yU/=~"#{e=SDL::Event.poll}"&&(v=e.sym%4)&&d+v!=3&&d=v
$><<"Score #{$*.size}"&&exit if$*.index(n=o+[-1,-l,l,1][d])||n<0||n>=l*l||d%3<1&&n/l!=o/l
$*<<o=n
r.map{|i|s[i%l,i/l]=[[f,*$*].index(i)?0:255]*3}
s.flip
sleep 0.1}

সর্প বিভাগ এবং খাদ্য টুকরা কালো পিক্সেল ব্যবহার করে প্রতিনিধিত্ব করা হয়, গ্রিডের আকার বর্তমানে 32 * 32। আপনি তীর কীগুলি (বা কোনও কীগুলি সত্যই, কীকোড মোড 4 নির্দেশিকার দিকের অ্যারে [বাম, ইউপি, ডাউন, রাইট]] এর সাহায্যে নিয়ন্ত্রণ করতে পারেন। আমি মনে করি এখানে অবশ্যই উন্নতির অবকাশ আছে বিশেষত মৃত্যু-পরীক্ষার আইএফ-এর বিবৃতিতে।

পূর্ববর্তী সংস্করণটির তুলনায় আমি এটির ব্যাপক উন্নতি করেছি, আশা করি এটি এখন প্রশ্নের আত্মার সাথে আরও ঘনিষ্ঠভাবে মিলছে matches অনুমানটি মেনে চলার জন্য আমার একটি জিনিস ঠিক করতে হবে, এটি হ'ল খাবারটি বর্তমানে লেজের অভ্যন্তরে ফুটিয়ে তুলতে পারে। সংশোধন করা হয়েছে!

গেমটি শেষ হয়ে যাওয়ার পরে স্কোরকে স্টাটআউটে ছাপায়।


2

জাভা, 2343 2239

ঠিক সংক্ষিপ্ত নয়, তবে আমি বিশ্বাস করি এটি সমস্ত প্রয়োজনীয়তা অনুসরণ করে।

সাপের ক্লাস

import javax.swing.*;
public class S extends JFrame{
S(){add(new B());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(320,340);setVisible(true);}
public static void main(String[]a){new S();}}

বোর্ড ক্লাস

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class B extends JPanel implements ActionListener{
int W=300;int H=300;int DS=10;int AD=900;int RP=29;int D=140;int x[]=new int[AD];int y[]=new int[AD];int d;int ax;int ay;boolean l=false;boolean r=true;boolean u=false;boolean dn=false;boolean ig=true;Timer t;Image b;Image a;Image h;
B(){addKeyListener(new T());setBackground(Color.black);ImageIcon id=new ImageIcon(this.getClass().getResource("d.png"));b=id.getImage();ImageIcon ia=new ImageIcon(this.getClass().getResource("a.png"));a=ia.getImage();ImageIcon ih=new ImageIcon(this.getClass().getResource("h.png"));h=ih.getImage();setFocusable(true);i();}
void i(){d=3;for(int z=0;z<d;z++){x[z]=50-z*10;y[z]=50;}l();t=new Timer(D,this);t.start();}
public void p(Graphics g){super.paint(g);if(i){g.drawImage(a,ax,ay,this);for(int z=0;z<d;z++){if(z==0)g.drawImage(h,x[z],y[z],this);else g.drawImage(b,x[z],y[z],this);}Toolkit.getDefaultToolkit().sync();g.dispose();}else{g(g);}}
void g(Graphics g){String ms="Score:";Font sm=new Font("Courier",Font.PLAIN,12);FontMetrics me=this.getFontMetrics(sm);g.setColor(Color.white);g.setFont(sm);g.drawString(ms+d,(W-me.stringWidth(ms)),H);}
void c(){if((x[0]==ax)&&(y[0]==ay)){d++;l();}}
void m(){for(int z=d;z>0;z--){x[z]=x[(z-1)]; y[z]=y[(z-1)];}if(l){x[0]-=DS;}if (r){x[0]+=DS;}if(u){y[0]-=DS;}if(dn){y[0]+=DS;}}
void cc(){for(int z=d;z>0;z--){if((z>4)&&(x[0]==x[z])&&(y[0]==y[z])){ig=false;}}if(y[0]>H){ig=false;}if(y[0]<0){ig=false;}if(x[0]> W){ig=false;}if(x[0]<0){ig=false;}}
void l(){int r=(int)(Math.random()*RP);ax=((r*DS));r=(int)(Math.random()*RP);ay=((r*DS));}
public void actionPerformed(ActionEvent e){if(ig){c();cc();m();}repaint();}
class T extends KeyAdapter{public void keyPressed(KeyEvent e){int k=e.getKeyCode();if((k==KeyEvent.VK_LEFT)&&(!r)){l=true;u=false;dn=false;}if((k==KeyEvent.VK_RIGHT)&&(!l)){r=true;u=false;dn=false;}if((k==KeyEvent.VK_UP)&&(!dn)){u=true;r=false;l=false;}if((k==KeyEvent.VK_DOWN)&&(!u)){dn=true;r=false;l=false;}}}}

স্ক্রিনশট

জাবাতে সাপের খেলা


ভাষ্য

কিছুক্ষণ আগে আমি জেটকোড নামে একটি ওয়েবসাইট পরিদর্শন করেছি যা জাভাতে ক্লাসিক 2 ডি গেম তৈরির জন্য কয়েকটি টিউটোরিয়াল সরবরাহ করেছিল। প্রদত্ত কোডটি স্নেক গেমের জন্য সরবরাহ করা টিউটোরিয়াল দ্বারা দৃ strongly়ভাবে প্রভাবিত হয়েছে ... আমি মনে করি এই মুহুর্তে আমি সবেমাত্র ক্লাসিক গেমস কোডিং শুরু করেছি এবং টিউটোরিয়ালটি একটি 'টি' তে অনুসরণ করেছি।

আমি পরে একটি সম্পাদনা করব এবং এক্সিকিউটেবলের সাথে একটি লিঙ্ক যুক্ত করব যাতে লোকেরা গেমটি খেলতে পারে।


সম্পাদনাগুলি

  • 9/9/12: আমি উত্স ফোল্ডার থেকে চিত্রগুলি সঠিকভাবে লোড করতে অক্ষম unable আমার কোড কাজ করে এবং প্রশ্নের সমস্ত মানদণ্ড পূরণ করে তা প্রমাণ করার প্রয়াসে আমি এই ইস্যুটির মাধ্যমে কাজ চালিয়ে যাব।
  • 9/11/12: আমি রিসোর্স ফাইল থেকে লোড করতে ছবি পেতে কাজ চালিয়ে যাচ্ছি। আমি জেটকোড টিউটোরিয়াল থেকে সরবরাহিত একটি ছবি যুক্ত করেছি।

দুর্দান্ত, আমি এটি চেষ্টা করার অপেক্ষায় রয়েছি!
mjgpy3

সেখানে এক্সিকিউটেবল পথে তারা করতে :) একটি লিঙ্ক
Drenai

@ ব্রায়ানবিশপ দুঃখিত, আমি আমার ইমেজ ফাইলগুলি রিসোর্স ফাইলে ভুল করে কী করছি তা কখনই বুঝতে পারি নি। সবকিছু সংকলন করে তবে চিত্রগুলি কখনই পপআপ হয় না।
রব

2

বাশ: 537 533 507 অক্ষর

C=$COLUMNS;L=$LINES;D=-1;c=9;r=9;z=(9\ 9);l=;h=1;v=;s=1;d=1
t(){ echo -en "\e[$2;$1H$3";}
b(){ ((f=RANDOM%C+1));((g=RANDOM%L+1));for i in "${z[@]}";do [[ $f\ $g = $i ]]&&b;done;t $f $g F;}
echo $'\e[2J';b
while :;do
read -sn1 -t.1 k
case $k in
w|s)((h))&&h=&&v=${D:$k};;
a|d)((v))&&v=&&h=${D:$k};;
esac
((c+=h));((r+=v))
((c==f&&r==g&&++l))&&b
((c<1||r<1||c>C||r>L))&&break
for i in "${z[@]}";do [[ $c\ $r = $i ]]&&break 2;done
t ${z[-1]} \ ;t $c $r X
z=($c\ $r "${z[@]::l}")
done
echo $'\e[2J\e[H'Score: $l

এটি ব্যবহার করে হিসাবে $COLUMNSএবং $LINESশেল ভেরিয়েবল, এটা sourced চালানো হবে: . snake.sh। সাপটিকে w/ a/ s/ dকী দিয়ে নিয়ন্ত্রণ করা যায় ।

আমি জানি, clearস্ক্রিনটি সাফ করার জন্য এটি 493 টি অক্ষরে সহজেই হ্রাস করা যায় , তবে আমি bashকোনও বাহ্যিক সরঞ্জাম ব্যবহার না করে এটিকে খাঁটি রাখতে পছন্দ করি ।


খুব শীতল সমাধান!
mjgpy3

1

পাইথন 2.7: 869 816 818 817 816 অক্ষর

আমি গত কয়েক ঘন্টা এই একসাথে হ্যাক। এটি প্রয়োজনীয়তাগুলি পূরণ করতে হবে এবং এমজেজিপি 3 এর সমাধানের চেয়ে কয়েকটি অক্ষর ছোট (চেষ্টা করা হলেও এটিকে আরও খাটো করতে পারেনি Now এখন আমি ক্লান্ত)। আশ্চর্যের বিষয় হল, পাইগামের মতো গেম ডেভেলপমেন্ট লাইব্রেরি ব্যবহার করে পাইথন-সাপটি খুব খাটো হয়ে উঠেনি। কীভাবে এটি আরও খাটো করা যায় সে সম্পর্কে পরামর্শ এবং টিপসটি অত্যন্ত প্রশংসিত। আমি আশা করি এটি খুব রহস্যজনক নয়।

এটি ফলাফল:

import pygame as p
from random import randint as r
p.init();l=20
c=p.time.Clock()
dp=p.display;w=p.display.set_mode((500,)*2)
C=p.Color;b=C(0,0,0);g=C(0,99,0)
D=(0,1);U=(0,-1);L=(-1,0);R=(1,0)
S=[R];d=R;n=[]
O=lambda t:{U:D,R:L,D:U,L:R}[t]
def Q(e):print "Score: %i"%(len(S)-1);p.quit()
def K(e):global d;_={276:L,273:U,274:D,275:R}.get(e.key,(0,0));d=not _==O(d) and _ or d
def N(S):[p.draw.rect(w,g,[x[0]*l,x[1]*l,l,l]) for x in S+n] 
def M():n=(r(0,24),r(0,24));return n not in S and n or M()
A=lambda s,o:tuple(x+y for x,y in zip(s,o))
n=[M()] 
while True:
 w.fill(b);[{12:Q,2:K}.get(e.type,lambda e:e)(e) for e in p.event.get()]
 if not (0<=S[-1][0]<25 and 0<=S[-1][1]<25) or A(S[-1],d) in S: Q(e) 
 if A(S[-1],d) in n: S.append(A(S[-1],d));n=[M()]
 else: S.append(A(S[-1],d));S.pop(0)
 N(S);dp.update();c.tick(6)

সম্পাদনা: আমি এটিকে 816 বাইটে হ্রাস করতে পারি, হ্যাঁ! :) স্কোর স্থির

সম্পাদনা 2: ভুল সংস্করণটি ঘটনাক্রমে আটকানো হয়েছে

এখানে একটি মন্তব্য করা সংস্করণ:

import pygame as p
from random import randint as r

# initialize pygame
p.init()

# the game consists of 25*25 blocks,with each block 20*20 pixels
l=20

# initialize the main loop clock
c=p.time.Clock()

# open the window
dp=p.display;w=p.display.set_mode((500,)*2)

# define black and green colors
C=p.Color;b=C(0,0,0);g=C(0,99,0)

# Directions of the snake: down, up, left, right
D=(0,1);U=(0,-1);L=(-1,0);R=(1,0)

# S is the snake, d is the current direction and n is the array of foods
S=[R];d=R;n=[]

# get the opposite direction of a direction to forbid double backing
O=lambda t:{U:D,R:L,D:U,L:R}[t]

# print the score and quit
def Q(e):print "Score: %i"%(len(S)-1);p.quit()

# update the direction (this is a key press handler)
def K(e):global d;_={276:L,273:U,274:D,275:R}.get(e.key,(0,0));d=not _==O(d) and _ or d

# draw the snake and food boxes
def N(S):[p.draw.rect(w,g,[x[0]*l,x[1]*l,l,l]) for x in S+n]

# place new food on the map not colliding with the snake
def M():n=(r(0,24),r(0,24));return n not in S and n or M()

# A((1,1), (-2, 1)) -> (-1,2)
A=lambda s,o:tuple(x+y for x,y in zip(s,o))

# initialize food array
n=[M()]

while True:
 # fill the screen black
 w.fill(b)
 # get quit or key press events and execute the event handlers
 [{12:Q,2:K}.get(e.type,lambda e:e)(e) for e in p.event.get()]

 # check if snake hits map boundaries or itself
 if not (0<=S[-1][0]<25 and 0<=S[-1][1]<25) or A(S[-1],d) in S: Q(e)

 # check if snake is eating food at the moment and append one to the snake's length
 if A(S[-1],d) in n: S.append(A(S[-1],d));n=[M()]

 # move the snake in the current direction
 else: S.append(A(S[-1],d));S.pop(0)

 # draw the map and limit the main loop to 6 frames per second
 N(S);dp.update();c.tick(6)

আমি এই ত্রুটি বার্তাটি "সেগমেন্টেশন ফল্ট (কোর ডাম্পড) পেয়ে চলেছি।" এবং এটা দেখে মনে হচ্ছে স্কোর 1 দ্বারা (না সত্যিই একটি বড় চুক্তি বন্ধ আছে অত্যন্ত উত্তর যদিও
mjgpy3

2
ধন্যবাদ :) আমি সেগমেন্টেশন ফোকল্ট বার্তাটি পেয়েছি। এটি এখনও খুঁজে না। স্কোর স্থির করে এবং আকার হ্রাস করেছে :) এটি মজাদার।
স্টিফ্রেক

1
আপনি 255 এর পরিবর্তে
সবুজকে আরও গাer় করে তুলতে

@ ক্রিস্টস দ্য ওভারলর্ড হাঃ হ্যাঁ পয়েন্ট: ডি
স্টিফ্রেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.