Java贪吃蛇

说明:X加速,Z减速,空格暂停,长度无上限直到死为止。

1、Game.java

 1 package game;
 2 
 3 import java.awt.BorderLayout;
 4 import javax.swing.JFrame;
 5 import control.Controller;
 6 import grid.Grid;
 7 import mysnake.Food;
 8 import mysnake.Ground;
 9 import mysnake.Snake;
10 import view.GamePanel;
11 
12 public class Game {
13 
14     public static void main(String[] args) {
16         Snake snake = new Snake();
17         Food food = new Food();
18         GamePanel gamepanel = new GamePanel();
19         Ground ground = new Ground();
20         Controller controller = new Controller(snake,food,ground,gamepanel);
21         JFrame frame = new JFrame("      Snake --- By xxxxxxx      "+ "↑↓←→ : move      Z : decelerate      X : accelerate      Space : pause");
22         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
23         gamepanel.setSize(Grid.WIDTH*Grid.CELL_SIZE,Grid.HEIGHT*Grid.CELL_SIZE);
24         frame.setSize(Grid.WIDTH*Grid.CELL_SIZE+10,Grid.HEIGHT*Grid.CELL_SIZE+35);
25         frame.add(gamepanel,BorderLayout.CENTER);
26         gamepanel.addKeyListener(controller);
27         snake.addListener(controller);
28         frame.addKeyListener(controller);
29         frame.setVisible(true);
30         controller.newGame();
31 }
32 }

2、Grid.java

1 package grid;
2 
3 public class Grid {
4     public static final int CELL_SIZE = 1;
5     public static final int WIDTH = 888;
6     public static final int HEIGHT = 666;
7 }

3、Food.java

 1 package mysnake;
 2 
 3 import java.awt.Color;
 4 import java.awt.Graphics;
 5 import java.awt.Point;
 6 import java.util.Random;
 7 import grid.Grid;
 8 
 9 public class Food extends Point{
10     private int xx = new Random().nextInt(7);
11     public boolean isSnakeEatFood(Snake snake){
12         if((((snake.getHead().x*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==this.x*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
13                 (snake.getHead().y>(this.y-Grid.CELL_SIZE*10))&&
14                         (snake.getHead().y<(this.y+Grid.CELL_SIZE*10)))||
15         (((snake.getHead().x*Grid.CELL_SIZE)==this.x*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
16                 (snake.getHead().y>(this.y-Grid.CELL_SIZE*10))&&
17                                 (snake.getHead().y<(this.y+Grid.CELL_SIZE*10)))||
18         (((snake.getHead().y*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==this.y*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
19                 (snake.getHead().x>(this.x-Grid.CELL_SIZE*10))&&
20                    (snake.getHead().x<this.x+Grid.CELL_SIZE*10))||
21         (((snake.getHead().y*Grid.CELL_SIZE)==this.y*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
22                 (snake.getHead().x>(this.x-Grid.CELL_SIZE*10))&&
23                    (snake.getHead().x<this.x+Grid.CELL_SIZE*10))){
24             return true;
25     }else{
26         return false;
27     }
28 }
29 
30     public void drawMe(Graphics g){
31         switch(xx){
32         case 0:g.setColor(Color.RED);break;
33         case 1:g.setColor(Color.ORANGE);break;
34         case 2:g.setColor(Color.YELLOW);break;
35         case 3:g.setColor(Color.GREEN);break;
36         case 4:g.setColor(Color.BLUE);break;
37         case 5:g.setColor(Color.CYAN);break;
38         case 6:g.setColor(Color.PINK);break;
39         }
40         g.fill3DRect(x*Grid.CELL_SIZE,y*Grid.CELL_SIZE,Grid.CELL_SIZE*10,Grid.CELL_SIZE*10,true);
41     }
42     
43     public void newFood(Point p){
44         this.setLocation(p);
45     }
46 }

4、Ground.java

 1 package mysnake;
 2 
 3 import java.awt.Color;
 4 import java.awt.Graphics;
 5 import java.util.Random;
 6 import grid.Grid;
 7 
 8 public class Ground{
 9     private int[][] rocks = new int[Grid.WIDTH][Grid.HEIGHT]; 
10     private int xx = new Random().nextInt(7);
11     public boolean isSnakeEatRock(Snake snake){
12         for(int i=0;i<Grid.WIDTH;i++){
13             for(int j=0;j<Grid.HEIGHT;j++){
14         if((rocks[i][j]==1)&&
15                 ((((snake.getHead().x*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==i*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
16                 (snake.getHead().y>(j-Grid.CELL_SIZE*10))&&
17                 (snake.getHead().y<(j+Grid.CELL_SIZE*10)))||
18 (((snake.getHead().x*Grid.CELL_SIZE)==i*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
19         (snake.getHead().y>(j-Grid.CELL_SIZE*10))&&
20                         (snake.getHead().y<(j+Grid.CELL_SIZE*10)))||
21 (((snake.getHead().y*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==j*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
22         (snake.getHead().x>(i-Grid.CELL_SIZE*10))&&
23            (snake.getHead().x<i+Grid.CELL_SIZE*10))||
24 (((snake.getHead().y*Grid.CELL_SIZE)==j*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
25         (snake.getHead().x>(i-Grid.CELL_SIZE*10))&&
26            (snake.getHead().x<i+Grid.CELL_SIZE*10))))
27         {return true;}}}
28          return false;
29 }
30     
31     public boolean catchfood(Food food){
32         for(int i=0;i<Grid.WIDTH;i++){
33             for(int j=0;j<Grid.HEIGHT;j++){
34         if((rocks[i][j]==1)&&((((food.x*Grid.CELL_SIZE+10*Grid.CELL_SIZE>i*Grid.CELL_SIZE)
35                 &&(food.x*Grid.CELL_SIZE<(i*Grid.CELL_SIZE+Grid.CELL_SIZE*10)))&&
36                 ((food.y*Grid.CELL_SIZE+10*Grid.CELL_SIZE>j*Grid.CELL_SIZE)&&
37                         (food.y*Grid.CELL_SIZE<(j*Grid.CELL_SIZE+Grid.CELL_SIZE*10))))))
38         {return true;}}}
39          return false;
40 }
41     
42     public Ground(){
43         for(int i=0;i<100;i++){
44             int a = new Random().nextInt(Grid.WIDTH);
45             int b = new Random().nextInt(Grid.HEIGHT);
46             if(b<0){b=Grid.HEIGHT-1;}
47             if(b+10>=Grid.HEIGHT){b=0;}
48             if(a<0){a=Grid.WIDTH-1;}
49             if(a+10>=Grid.WIDTH){a=0;}
50             rocks[a][b] = 1;
51             }
52         }
53     
54     public void drawMe(Graphics g){
55         switch(xx){
56         case 0:g.setColor(Color.RED);break;
57         case 1:g.setColor(Color.ORANGE);break;
58         case 2:g.setColor(Color.YELLOW);break;
59         case 3:g.setColor(Color.GREEN);break;
60         case 4:g.setColor(Color.BLUE);break;
61         case 5:g.setColor(Color.CYAN);break;
62         case 6:g.setColor(Color.PINK);break;
63         }
64     for(int x=0;x<Grid.WIDTH;x++){
65         for(int y=0;y<Grid.HEIGHT;y++){
66             if(rocks[x][y]==1){
67                 g.fill3DRect(x*Grid.CELL_SIZE,y*Grid.CELL_SIZE,Grid.CELL_SIZE*10,Grid.CELL_SIZE*10,true);
68             }
69         }
70     }
71 }
72 }

5、Snake.java

  1 package mysnake;
  2 
  3 import java.awt.Color;
  4 import java.awt.Graphics;
  5 import java.awt.Point;
  6 import java.util.HashSet;
  7 import java.util.LinkedList;
  8 import java.util.Set;
  9 import grid.Grid;
 10 
 11 public class Snake {
 12         
 13         public Snake(){
 14             init();
 15         }
 16         
 17         public void init(){
 18             int x = Grid.WIDTH/2;
 19             int y = Grid.HEIGHT/2;
 20             for(int i=0;i<33;i++){
 21                 body.addFirst(new Point(x--,y));
 22             }
 23         olddirection = newdirection = LEFT;
 24         life = true;
 25         efil = true;
 26         efil1 = 0;
 27         threadspeed = 10;
 28         }
 29     
 30         public static final int UP = 0;
 31         public static final int DOWN = 1;
 32         public static final int LEFT = 2;
 33         public static final int RIGHT = 3;
 34         
 35         private int olddirection,newdirection;
 36         private LinkedList<Point> body = new LinkedList<Point>();
 37         private Set<Snakelisten> listener = new HashSet<Snakelisten>();
 38         private boolean life;
 39         private boolean efil;
 40         private int efil1;
 41         private int threadspeed;
 42         public Point getHead(){
 43             return body.getFirst();
 44         }
 45         public void move(){
 46             int x = body.getFirst().x;
 47             int y = body.getFirst().y;    
 48             switch(efil1){case 0: 
 49                 if((olddirection+newdirection!=5)&&(olddirection+newdirection!=1)){
 50                     olddirection = newdirection;
 51                 }
 52                 body.removeLast();
 53                 switch(olddirection){
 54                 case UP:y--;if(y<0){y=Grid.HEIGHT-1;}break;
 55                 case DOWN:y++;if(y+10>=Grid.HEIGHT){y=0;}break;
 56                 case LEFT:x--;if(x<0){x=Grid.WIDTH-1;}break;
 57                 case RIGHT:x++;if(x+10>=Grid.WIDTH){x=0;}break;
 58                 }
 59                 Point newHead = new Point(x,y);
 60                 body.addFirst(newHead);
 61                 break;
 62                 case 1:break;}    
 63         }
 64         public void changeDirection(int direction){            
 65             newdirection = direction;        
 66         }
 67         public void eatFood(){
 68             int x = body.getFirst().x;
 69             int y = body.getFirst().y;
 70             for(int i=0;i<10;i++){
 71             switch(olddirection){
 72             case UP:y--;if(y<0){y=Grid.HEIGHT-1;}break;
 73             case DOWN:y++;if(y+10>=Grid.HEIGHT){y=0;}break;
 74             case LEFT:x--;if(x<0){x=Grid.WIDTH-1;}break;
 75             case RIGHT:x++;if(x+10>=Grid.WIDTH){x=0;}break;
 76             }
 78             Point newHead = new Point(x,y);
 79             body.addFirst(newHead);}
 80         }
 81         public boolean isEatBody(){
 82             for(int i=22;i<body.size();i++){
 83             if((((this.getHead().x*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==
 84                     body.get(i).x*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
 85                     (this.getHead().y>(body.get(i).y-Grid.CELL_SIZE*10))&&
 86                     (this.getHead().y<(body.get(i).y+Grid.CELL_SIZE*10)))||
 87     (((this.getHead().x*Grid.CELL_SIZE)==body.get(i).x*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
 88             (this.getHead().y>(body.get(i).y-Grid.CELL_SIZE*10))&&
 89                             (this.getHead().y<(body.get(i).y+Grid.CELL_SIZE*10)))||
 90     (((this.getHead().y*Grid.CELL_SIZE+Grid.CELL_SIZE*10)==body.get(i).y*Grid.CELL_SIZE+1*Grid.CELL_SIZE)&&
 91             (this.getHead().x>(body.get(i).x-Grid.CELL_SIZE*10))&&
 92                (this.getHead().x<body.get(i).x+Grid.CELL_SIZE*10))||
 93     (((this.getHead().y*Grid.CELL_SIZE)==body.get(i).y*Grid.CELL_SIZE+9*Grid.CELL_SIZE)&&
 94             (this.getHead().x>(body.get(i).x-Grid.CELL_SIZE*10))&&
 95                (this.getHead().x<body.get(i).x+Grid.CELL_SIZE*10))){
 96                 return true;
 97             }}
 98             return false;
 99         }
100         public boolean foodcatchsnakebody(Food food){
101             for(int i=10;i<body.size();i++)
102             {
103                 if(((food.x*Grid.CELL_SIZE+10*Grid.CELL_SIZE>body.get(i).x*Grid.CELL_SIZE)
104                         &&(food.x*Grid.CELL_SIZE<(body.get(i).x*Grid.CELL_SIZE+Grid.CELL_SIZE*10)))&&
105                         ((food.y*Grid.CELL_SIZE+10*Grid.CELL_SIZE>body.get(i).y*Grid.CELL_SIZE)&&
106                                 (food.y*Grid.CELL_SIZE<(body.get(i).y*Grid.CELL_SIZE+Grid.CELL_SIZE*10))))
107                             
108                 return true;
109             }
110             return false;
111         }
112         public void drawMe(Graphics g){
113             g.setColor(Color.WHITE);
114             for(Point i:body){
115                 g.fill3DRect(i.x*Grid.CELL_SIZE,i.y*Grid.CELL_SIZE,Grid.CELL_SIZE*10,Grid.CELL_SIZE*10,true);
116             }
117         }
118         private class SnakeDriver implements Runnable{
119 
120             @Override
121             public void run() {
122                 while(life){
123                     move();
124                     for(Snakelisten i:listener){
125                         i.move(Snake.this);
126                     }
127                     try{Thread.sleep(threadspeed);}
128                     catch(InterruptedException e){
129                         e.printStackTrace();
130                     }
131                 }
132                 
133             }
134             
135         }
136         public void addListener(Snakelisten l){
137             if(l!=null){
138                 this.listener.add(l);
139             }
140         }
141         public void start(){
142             new Thread(new SnakeDriver()).start();
143         }
144 
145         public void die() {
146             life = false;
147         }
148         public void pause(){
149             if(efil){
150                 efil = false;
151                 efil1 = 1;
152             }
153             else{
154                 efil = true;
155                 efil1 = 0;
156             }
157         }
158 
159         public void acc() {
160             if(threadspeed>1)threadspeed--;
161         }
162 
163         public void slow() {
164             if(threadspeed<19)threadspeed++;
165         }
166 }

6、Snakelisten.java

1 package mysnake;
2 
3 public interface Snakelisten {
4     void move(Snake snake);
5 }

7、GamePanel.java

 1 package view;
 2 
 3 import java.awt.Color;
 4 import java.awt.Graphics;
 5 import javax.swing.JPanel;
 6 import grid.Grid;
 7 import mysnake.Food;
 8 import mysnake.Ground;
 9 import mysnake.Snake;
10 
11 public class GamePanel extends JPanel{
12     
13     private Food food;
14     private Snake snake;
15     private Ground ground;
16     
17     public void display(Snake snake,Food food,Ground ground){
18         this.snake = snake;
19         this.food = food;
20         this.ground = ground;
21         this.repaint();
22     }
23 
24     @Override
25     protected void paintComponent(Graphics g) {
26         g.setColor(Color.BLACK);
27         g.fillRect(0,0,Grid.WIDTH*Grid.CELL_SIZE,Grid.HEIGHT*Grid.CELL_SIZE);
28         if(ground!=null&&snake!=null&&food!=null){
29         this.snake.drawMe(g);
30         this.ground.drawMe(g);
31         this.food.drawMe(g);
32         }
33     }
34     
35 }

8.Controller.java

  1 package control;
  2 
  3 import java.awt.Point;
  4 import java.awt.event.KeyAdapter;
  5 import java.awt.event.KeyEvent;
  6 import java.util.Random;
  7 import grid.Grid;
  8 import mysnake.Food;
  9 import mysnake.Ground;
 10 import mysnake.Snake;
 11 import mysnake.Snakelisten;
 12 import view.GamePanel;
 13 
 14 public class Controller extends KeyAdapter implements Snakelisten{
 15     
 16     private Snake snake;
 17     private Food food;
 18     private Ground ground;
 19     private GamePanel gamepanel;
 20 
 21     public Controller(Snake snake, Food food, Ground ground, GamePanel gamepanel) {
 22         super();
 23         this.snake = snake;
 24         this.food = food;
 25         this.ground = ground;
 26         this.gamepanel = gamepanel;
 27     }
 28 
 29     @Override
 30     public void keyPressed(KeyEvent e) {
 31         switch(e.getKeyCode()){
 32         case KeyEvent.VK_UP:snake.changeDirection(Snake.UP);break;
 33         }
 34         switch(e.getKeyCode()){
 35         case KeyEvent.VK_DOWN:snake.changeDirection(Snake.DOWN);break;
 36         }
 37         switch(e.getKeyCode()){
 38         case KeyEvent.VK_LEFT:snake.changeDirection(Snake.LEFT);break;
 39         }
 40         switch(e.getKeyCode()){
 41         case KeyEvent.VK_RIGHT:snake.changeDirection(Snake.RIGHT);break;
 42         }
 43         switch(e.getKeyCode()){
 44         case KeyEvent.VK_SPACE:snake.pause();break;
 45         }
 46         switch(e.getKeyCode()){
 47         case KeyEvent.VK_X:snake.acc();break;
 48         }
 49         switch(e.getKeyCode()){
 50         case KeyEvent.VK_Z:snake.slow();break;
 51         }
 52         
 53     }
 54 
 55     @Override
 56     public void move(Snake snake) {
 57         gamepanel.display(snake, food, ground);
 58         if(food.isSnakeEatFood(snake)){
 59             snake.eatFood();
 60             food.newFood(getPoint());
 61         }
 62         if(ground.isSnakeEatRock(snake)){
 63             snake.die();
 64             try {
 65                 Thread.sleep(1000);
 66             } catch (InterruptedException e) {
 67                 e.printStackTrace();
 68             }
 69             System.exit(0);
 70         }
 71         if(ground.catchfood(food)){
 72             food.newFood(getPoint());
 73         }
 74         if(snake.isEatBody()){
 75             snake.die();
 76             try {
 77                 Thread.sleep(1000);
 78             } catch (InterruptedException e) {
 79                 e.printStackTrace();
 80             }
 81             System.exit(0);
 82         }
 83         if(snake.foodcatchsnakebody(food)){
 84             food.newFood(getPoint());
 85         }
 86     }
 87     
 88     public void newGame(){
 89         snake.start();
 90         food.newFood(getPoint());
 91     }
 92     
 93     public Point getPoint(){
 94         Random random = new Random();
 95         int x = random.nextInt(Grid.WIDTH);
 96         int y = random.nextInt(Grid.HEIGHT);
 97         if(x<0){x=Grid.WIDTH-1;}
 98         if((x+10)>Grid.WIDTH){x=0;}
 99         if(y<0){y=Grid.HEIGHT-1;}
100         if(y+10>Grid.HEIGHT){y=0;}
101         return new Point(x,y);
102     }
103 }

 

posted @ 2018-02-13 23:39  Helix006  阅读(302)  评论(0编辑  收藏  举报