java swing 小游戲 貪吃蛇

cenmin 8年前發布 | 2K 次閱讀 Java

本人做了些修改
修正如下:
1、修正了按鍵與行進方向相反而死的bug
2、修正了連續按鍵可以加速的bug
</div>

 

GreedySnake.java         

package com.fred.test;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Color;
import java.util.Random;
import java.util.List;
import java.util.LinkedList;
import javax.swing.JPanel;
import javax.swing.JFrame;

class Food{
    Snake snake;
    int x,y;
    boolean flag;
    Food(Snake snake){
        this.snake = snake;
        flag = true;
        int x = 0;
        int y = 0;
        while(flag){
            flag = false;
            x = Math.abs(new Random().nextInt()%40);
            y = Math.abs(new Random().nextInt()%40);
            if(snake.head.x==x && snake.head.y==y) flag = true;
            for(Point it:snake.body) if(it.x==x && it.y==y) flag = true;
        }
        this.x = x;
        this.y = y;
    }

}
class Snake{
    int size,length,dir;
    List<Point> body;
    Point head;
    Snake(Point head){
        size = 10;
        length = 5;dir = 4;
        this.head = head;
        body = new LinkedList<Point>();
        for(int i=0;i<length-1;i++){
            Point p = new Point(head.x,head.y+1+i);
            body.add(p);
        }
    }
    boolean isEat(Food food){
        if(head.x==food.x && head.y==food.y) return true;
        return false;
    }
    boolean isOut(){
        if(head.x<0 || head.y<0 || head.x>=40 || head.y>=40)
            return true;
        return false;
    }
    boolean isPitch(){
        for(Point it:body)
            if(head.x==it.x && head.y==it.y){
                dead(1);
                return true;
            }
        return false;
    }
    void dead(int way){
        System.exit(way);
    }
}
class MyPanel extends JPanel implements KeyListener,Runnable{
    Snake snake;
    Food food;
    int speed;
    MyPanel(Snake snake,Food food){
        this.snake = snake;
        this.food = food;
        speed = 526;
    }
    public void paint(Graphics g){
        super.paint(g);
        g.fillRect(0,0,400,400);
        g.setColor(Color.YELLOW);
        g.fillRect(snake.head.x*snake.size,snake.head.y*snake.size,snake.size,snake.size);
        g.setColor(Color.ORANGE);
        for(Point it:snake.body) g.fillRect(it.x*snake.size,it.y*snake.size,snake.size,snake.size);
        g.setColor(Color.GREEN);
        g.fillRect(food.x*snake.size,food.y*snake.size,snake.size,snake.size);
    }
    //自動行進
    public void keyPressed(Integer dir){

        Point oxy = new Point(snake.head);
            if(dir==3){
                snake.head.x--;
            }
            else if(dir==4){
                snake.head.x++;
            }
            else if(dir==1){
                snake.head.y--;
            }
            else if(dir==2){
                snake.head.y++;
            }else return;

        if(snake.isOut()) snake.dead(1);

        snake.body.add(0,oxy);
        if(snake.isEat(food)){
            snake.length++;
            if(speed >= 50) speed-=25;
            food = new Food(snake);
        }else snake.body.remove(snake.length-1);

        if(snake.isPitch()) snake.dead(2);
        repaint();
    }
    //按鍵僅用于修改蛇的方向
    public void keyPressed(KeyEvent e){
        int key = e.getKeyCode();
        //按鍵和行進方向相反,按鍵無效直接返回!
        if(((key==KeyEvent.VK_LEFT && snake.dir==4)||(key==KeyEvent.VK_UP && snake.dir==2)
                ||(key==KeyEvent.VK_DOWN && snake.dir==1)||(key==KeyEvent.VK_RIGHT && snake.dir==3))){
            return;
        }
            if(key == KeyEvent.VK_LEFT){
                snake.dir = 3;
            }
            else if(key == KeyEvent.VK_RIGHT){
                snake.dir = 4;
            }
            else if(key == KeyEvent.VK_UP){
                snake.dir = 1;
            }
            else if(key == KeyEvent.VK_DOWN){
                snake.dir = 2;
            }else return;


    }
    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){}

    public synchronized void run(){
         while(true){
            try{Thread.sleep(speed);
            }catch(Exception e){}
            keyPressed(snake.dir);
        }
    }
}
public class GreedySnake extends JFrame{
    MyPanel mp;
    Snake snake;
    Food food;
    Thread t;
    public GreedySnake(){
        snake = new Snake(new Point(5,5));
        food = new Food(snake);
        mp = new MyPanel(snake,food);
        t = new Thread(mp);
        t.start();
        add(mp);
        addKeyListener(mp);
        setTitle("GreedySnake");
        setSize(40*10 + 15,40*10 + 38);
        setLocation(200,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public static void main(String[] args){
        new GreedySnake();
    }
}
 本文由用戶 cenmin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!