๋ฌธ์ ๋ ๊ฐ๋ฅํ ์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ ์ค๋ค์ดํฌ ๊ฒ์์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฒ์์ ์ผ๋ฐ์ ์ธ 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
๋ต๋ณ
๋ฃจ๋น 1.9 + SDL (341 324 316)
๋ค์์ SDL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ Ruby ๋ฒ์ ์ ์ฒซ ๋ฒ์งธ ์๋์
๋๋ค. -rsdl
require ๋ฌธ ๋์ ๋ช
๋ น ์ค์ ์ฌ์ฉํ์ฌ SDL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ๋ก๋ ํ ์ ์์ผ๋ฉด 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์ ๋๋ค. ํ์ดํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ด ํ ์ ์์ต๋๋ค (๋๋ ๋ชจ๋ ํค๋ ์ค์ ๋ก ํค ์ฝ๋ mod 4๊ฐ ๋ฐฉํฅ ๋ฐฐ์ด [LEFT, UP, DOWN, RIGHT]์ ์ธ๋ฑ์ฑํฉ๋๋ค). ํนํ ์ฌ๋ง ํ์ธ IF ๋ฌธ์์ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด์ ๋ฒ์ ์ ๋นํด ์ด๊ฒ์ ํฌ๊ฒ ๊ฐ์ ํ์ผ๋ฉฐ, ํ์ฌ ์ง๋ฌธ์ ์ ์ ๊ณผ ๋ ๋ฐ์ ํ๊ฒ ์ผ์นํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฌ์์ ์ค์ํ๊ธฐ ์ํด ์์ ํด์ผ ํ ํ ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค. ์ฆ, ์์์ด ํ์ฌ ๊ผฌ๋ฆฌ ์์ ์์ฑ ๋ ์ ์์ต๋๋ค. ๊ฒฐ์ ๋!
๊ฒ์์ด ์๋ฃ๋ ํ ์ ์๋ฅผ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ธ์ํฉ๋๋ค.
๋ต๋ณ
์๋ฐ, 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;}}}}
์คํฌ๋ฆฐ ์ท
ํด์ค
์ผ๋ง ์ ๋๋ ์๋ฐ๋ก ํด๋์ 2D ๊ฒ์์ ๋ง๋๋ ํํ ๋ฆฌ์ผ์ ์ ๊ณตํ๋ zetcode ๋ผ๋ ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ค . ์ ๊ณต๋ ์ฝ๋ ๋ ์ค๋ค์ดํฌ ๊ฒ์์ ์ํด ์ ๊ณต๋ ํํ ๋ฆฌ์ผ์ ์ํฅ์ ๋ง์ด๋ฐ์ต๋๋ค โฆ์ด ์์ ์์ ๋ฐฉ๊ธ ํด๋์ ๊ฒ์์ ์ฝ๋ฉํ๊ธฐ ์์ํ๊ณ ํํ ๋ฆฌ์ผ์ โTโ๋ก ๋ฐ๋์ต๋๋ค.
์ฌ๋๋ค์ด ๊ฒ์์ ํ ์ ์๋๋ก ๋์ค์ ํธ์งํ๊ณ ์คํ ํ์ผ์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
EDITS
- 9/9/12 : ๋ฆฌ์์ค ํด๋์์ ์ด๋ฏธ์ง๋ฅผ ์ ๋๋ก๋ก๋ ํ ์ ์์ต๋๋ค. ๋ด ์ฝ๋๊ฐ ์๋ํ๊ณ ์ง๋ฌธ์ ๋ชจ๋ ๊ธฐ์ค์ ์ถฉ์กฑํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์งํํ ๊ฒ์ ๋๋ค.
- 9/11/12 : ๋ฆฌ์์ค ํ์ผ์์ ์ฌ์ง์๋ก๋ํ๋ ์์ ์ ๊ณ์ํ๊ฒ ์ต๋๋ค. ZetCode ํํ ๋ฆฌ์ผ์์ ์ ๊ณต ํ ๊ทธ๋ฆผ์ ์ถ๊ฐํ์ต๋๋ค.
๋ต๋ณ
๊ฐํ : 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
์ธ๋ถ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค .
๋ต๋ณ
ํ์ด์ฌ 2.7 : 869 ๊ฐ 816 818 817 816 ๋ฌธ์
์ง๋ ๋ช ์๊ฐ ๋์ ํจ๊ป ํดํนํ์ต๋๋ค. ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผํ๋ฉฐ mjgpy3์ ์๋ฃจ์ ๋ณด๋ค ๋ช ์ ๋ ์งง์ต๋๋ค (์ด์ฌํ ์๋ํ์ง๋ง ๋ ์งง๊ฒ ๋ง๋ค ์ ์์์ต๋๋ค. ์ด์ ํผ๊ณคํฉ๋๋ค). ๋๋๊ฒ๋, pygame๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ ๋ฑ์ด ํจ์ฌ ์งง์์ง์ง ์์์ต๋๋ค. ์งง๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์๊ณผ ํ์ ๋์ด ํ๊ฐ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋๋ฌด ๋น๋ฐ์ค๋ฝ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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 ๋ฐ์ดํธ๋ก ์ค์ผ ์ ์์ต๋๋ค. ๐ ์ ์๋ฅผ ์์
EDIT2 : ์ค์๋ก ์๋ชป๋ ๋ฒ์ ์ ๋ถ์ฌ ๋ฃ์์ต๋๋ค.
๋ค์์ ์ฃผ์ ์ฒ๋ฆฌ ๋ ๋ฒ์ ์ ๋๋ค.
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)