• 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 }
  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/VRGamer-006/p/8447726.html
Copyright © 2020-2023  润新知