import java.awt.*; import java.awt.event.KeyEvent; public class Snake { int x,y,oldX,oldY; int id; private static int WIDTH=20,HEIGHT=20,dx=20,dy=20; static Direction dir=Direction.STOP; boolean head;//判断是否是是蛇头 SnakeClient sc=null; private boolean live; public Snake(int x, int y, boolean head,int id,SnakeClient sc) { this.x = x; this.y = y; this.head = head; this.id=id; this.sc=sc; } void draw(Graphics g){ move(); Color c=g.getColor(); if(head){ g.setColor(Color.red); }else{ g.setColor(Color.green); } g.fillRect(x, y, WIDTH, HEIGHT); g.setColor(Color.black); g.drawRect(x, y, WIDTH, HEIGHT); g.setColor(c); } public void keyPressed(KeyEvent e) { if(!head) return; int key=e.getKeyCode(); switch(key){ case KeyEvent.VK_UP: if(Direction.D==dir) break; dir=Direction.U; break; case KeyEvent.VK_DOWN: if(Direction.U==dir) break; dir=Direction.D; break; case KeyEvent.VK_LEFT: if(Direction.R==dir) break; dir=Direction.L; break; case KeyEvent.VK_RIGHT: if(Direction.L==dir) break; dir=Direction.R; break; case KeyEvent.VK_F2: if(!live){ sc.snakes.add(sc.s); } } } // 从蛇头到蛇尾编号id从0递增,根据id来移动蛇身,具体如下,记录下当前位置oldX,oldY // 当move()时,根据id-1的蛇身改变自己的位置; void move(){ oldX=x; oldY=y; if(!head){ if(dir==Direction.STOP) return; for(int i=0;i<sc.snakes.size();i++){ if(sc.snakes.get(i).id==id-1){ x=sc.snakes.get(i).oldX; y=sc.snakes.get(i).oldY; } } return; } switch(dir){ case U: y-=dy; break; case R: x+=dx; break; case D: y+=dy; break; case L: x-=dx; break; case STOP: break; } //新版贪吃蛇,当到达边界时从另外一边出来 if(x<3) x=383; if(x>383) x=3; if(y<25) y=405; if(y>405) y=25; } public Rectangle getRect(){ return new Rectangle(x,y,WIDTH-1,HEIGHT-1); } boolean eatEgg(Egg e){ if(!head) { return false; } else{ return e.getRect().intersects(this.getRect()); } } boolean hitSnake(Snake s){ if(!head) return false; if(s.getRect().intersects(this.getRect())){ live = false; return true; }else{ return false; } } } [java] view plaincopy import java.awt.*; import java.util.*; public class Egg { private static int WIDTH=20,HEIGHT=20; private static Random r=new Random(); int x=3+20*r.nextInt(20); int y=25+20*r.nextInt(20); void draw(Graphics g){ Color c=g.getColor(); g.setColor(Color.pink); g.fillOval(x, y, WIDTH, HEIGHT); g.setColor(c); } public Rectangle getRect(){ return new Rectangle(x,y,WIDTH,HEIGHT); } } |
public enum Direction { U,R,D,L,STOP; } |