zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    error :expected initializer before
    数字转字符
    转载转载转载指针占几个字节
    转载转载转载
    二维数组1
    响应式布局
    flex布局
    wepy踩坑经历
    css命名规范(转载)
    28.设计模式
  • 原文地址:https://www.cnblogs.com/VRGamer-006/p/8447726.html
Copyright © 2011-2022 走看看