if(body.get(i).equals(this.getHead())){
returntrue;
}
}
returnfalse;
}
publicvoiddrawMe(Graphicsg){
System.out.println("Snake'sdrawMe");
g.setColor(Color.BLUE);
for(Pointp:
body){
g.fill3DRect(p.x*Global.CELL_SIZE,p.y*Global.CELL_SIZE,
Global.CELL_SIZE,Global.CELL_SIZE,true);
}
}
publicPointgetHead(){
returnbody.getFirst();
}
privateclassSnakeDriverimplementsRunnable{
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(life){
move();
for(SnakeListenerl:
listeners){
l.snakeMoved(Snake.this);
}
try{
Thread.sleep(300);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
publicvoidstart(){
newThread(newSnakeDriver()).start();
}
publicvoidaddSnakeListener(SnakeListenerl){
if(l!
=null){
this.listeners.add(l);
}
}
}
packagePackage2;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjavax.swing.JPanel;
importPackage1.Food;
importPackage1.Ground;
importPackage1.Snake;
importPackageTool.Global;
publicclassGamePanelextendsJPanel{
privateSnakesnake;
privateFoodfood;
privateGroundground;
publicvoiddisplay(Snakesnake,Foodfood,Groundground){
System.out.println("GamePanel'sdisplay");
this.snake=snake;
this.food=food;
this.ground=ground;
this.repaint();
}
@Override
protectedvoidpaintComponent(Graphicsg){
//TODOAuto-generatedmethodstub
//super.paintComponent(g);
g.setColor(newColor(0xcfcfcf));
g.fillRect(0,0,Global.WIDTH*Global.CELL_SIZE,
Global.HEIGHT*Global.CELL_SIZE);
this.snake.drawMe(g);
this.food.drawMe(g);
this.ground.drawMe(g);
if(Snake.gameover){
g.setColor(Color.BLACK);
g.fillRect(0,0,Global.HEIGHT*Global.CELL_SIZE,
Global.HEIGHT*Global.CELL_SIZE);
g.setColor(Color.YELLOW);
g.setFont(newFont("宋体",Font.BOLD,30));
g.drawString("GAMEOVER",Global.HEIGHT*Global.CELL_SIZE/4,
Global.HEIGHT*Global.CELL_SIZE/2);
}
}
}
packagePackage3;
importjava.awt.Graphics;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importPackage1.Food;
importPackage1.Ground;
importPackage1.Snake;
importPackage2.GamePanel;
importPackageListener.SnakeListener;
publicclassControllerextendsKeyAdapterimplementsSnakeListener{
privateSnakesnake;
privateFoodfood;
privateGroundground;
privateGamePanelgamepanel;
publicController(Snakesnake,Foodfood,Groundground,GamePanelgamepanel){
super();
this.snake=snake;
this.food=food;
this.ground=ground;
this.gamepanel=gamepanel;
}
@Override
publicvoidkeyPressed(KeyEvente){
//TODOAuto-generatedmethodstub
//super.keyPressed(e);
switch(e.getKeyCode()){
caseKeyEvent.VK_UP:
snake.changeDirection(Snake.UP);
break;
caseKeyEvent.VK_DOWN:
snake.changeDirection(Snake.DOWN);
break;
caseKeyEvent.VK_LEFT:
snake.changeDirection(Snake.LEFT);
break;
caseKeyEvent.VK_RIGHT:
snake.changeDirection(Snake.RIGHT);
break;
}
}
@Override
publicvoidsnakeMoved(Snakesnake){
gamepanel.display(snake,food,ground);
if(food.isSnakeEatFood(snake)){
snake.eatFood();
food.newFood(ground.getPoint());
}
if(ground.isSnakeEatRock(snake)){
snake.die();
}
if(snake.isEatBody()){
snake.die();
}
}
publicvoidnewGame(){
snake.start();
food.newFood(ground.getPoint());
}
}
packagePackageListener;
importPackage1.Snake;
publicinterfaceSnakeListener{
voidsnakeMoved(Snakesnake);
}
packagePackageTool;
publicclassGlobal{
publicstaticfinalintCELL_SIZE=20;
publicstaticfinalintWIDTH=15;
publicstaticfinalintHEIGHT=15;
}
packageTestPackage;
importjava.awt.BorderLayout;
importjavax.swing.JFrame;
importPackage1.Food;
importPackage1.Ground;
importPackage1.Snake;
importPackage2.GamePanel;
importPackage3.Controller;
importPackageTool.Global;
publicclassGameTest{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Snakesnake=newSnake();
Foodfood=newFood();
Groundground=newGround();
GamePanelgamePanel=newGamePanel();
Controllercontroller=newController(
snake,food,ground,gamePanel);
JFrameframe=newJFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gamePanel.setSize(Global.WIDTH*Global.CELL_SIZE,
Global.HEIGHT*Global.CELL_SIZE);
frame.setSize(Global.WIDTH*Global.CELL_SIZE+10,
Global.HEIGHT*Global.CELL_SIZE+35);
frame.add(gamePanel,BorderLayout.CENTER);
gamePanel.addKeyListener(controller);
snake.addSnakeListener(controller);
frame.addKeyListener(controller);
frame.setVisible(true);
controller.newGame();
}
}