GUI贪吃蛇

启动类StartGame

 1 public class StartGame {
 2     public static void main(String[] args) {
 3         JFrame jFrame = new JFrame("给我吃");
 4         jFrame.setBounds(10,10,900,720);
 5         jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 6         jFrame.setResizable(false);//窗口大小不可变
 7         jFrame.setVisible(true);
 8         jFrame.add(new GamePanel());
 9     }
10 }

数据类把贪吃蛇和界面的图片放进去

 1 //贪吃蛇的图片
 2 public class Data {
 3 
 4     public static URL HeadUrl = Data.class.getResource("/statics/header.png");
 5     public static URL BodyUrl = Data.class.getResource("/statics/body.png");
 6     public static URL FoodUrl = Data.class.getResource("/statics/food.png");
 7 
 8     public static ImageIcon head = new ImageIcon(HeadUrl);
 9     public static ImageIcon body = new ImageIcon(BodyUrl);
10     public static ImageIcon food = new ImageIcon(FoodUrl);
11 
12     public static URL UpUrl = Data.class.getResource("/statics/up.png");
13     public static URL DownUrl = Data.class.getResource("/statics/down.png");
14     public static URL RightUrl = Data.class.getResource("/statics/right.png");
15     public static URL LeftUrl = Data.class.getResource("/statics/left.png");
16 
17     public static ImageIcon up = new ImageIcon(UpUrl);
18     public static ImageIcon down = new ImageIcon(DownUrl);
19     public static ImageIcon right = new ImageIcon(RightUrl);
20     public static ImageIcon left = new ImageIcon(LeftUrl);
21 
22 }

画板类

public class GamePanel extends JPanel implements KeyListener, ActionListener {
    //蛇的长度和坐标
    int length;
    int[] snakeX = new int[600];
    int[] snakeY = new int[500];
    String fx ;

    boolean isStart = false;//游戏状态
    boolean isFail = false;//失败状态

    int foodX;
    int foodY;

    Timer timer = new Timer(100, this);
    Random random = new Random();

    public GamePanel() {
        init();
        this.setFocusable(true);
        this.addKeyListener(this);


    }

    public void init() {
        length = 3;
        fx="right";
        snakeX[0] = 100;
        snakeY[0] = 100;
        snakeX[1] = 75;
        snakeY[1] = 100;
        snakeX[2] = 50;
        snakeY[2] = 100;
        foodX = 25 + 25 * random.nextInt(34);
        foodY = 75 + 25 * random.nextInt(22);

    }

    //游戏面板
    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        Data.head.paintIcon(this, g, 25, 11);//顶部图片
        g.fillRect(25, 75, 850, 600);
        //蛇头方向
        switch (fx) {
            case "right":
                Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "left":
                Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "up":
                Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "down":
                Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
        }

        //身体图片
        for (int i = 1; i < length; i++) {

            Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
        }
        //开始提示
        if (isStart == false) {
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.drawString("按下空格开始游戏", 300, 300);
            timer.start();

        } //失败提示
        if (isFail == true) {
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.drawString("游戏失败,请重新开始", 300, 300);

        }
        //食物图片
        Data.food.paintIcon(this, g, foodX, foodY);

    }

    //键盘监听事件

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();//获取键盘按键
        if (keyCode == KeyEvent.VK_SPACE) {
            //判断失败后重新载入
            if (isFail){
                isFail=false;
                init();
            }else {
                isStart = !isStart;//没失败暂停
            }
            repaint();//刷新画面
        }
        //按键改变方向
        if (keyCode == KeyEvent.VK_LEFT) {
            if (!fx.equals("right")) {
                fx = "left";
            }
        } else if (keyCode == KeyEvent.VK_RIGHT) {
            if (!fx.equals("left")) {
                fx = "right";
            }
        } else if (keyCode == KeyEvent.VK_UP) {
            if (!fx.equals("down")) {
                fx = "up";
            }
        } else if (keyCode == KeyEvent.VK_DOWN) {
            if (!fx.equals("up")) {
                fx = "down";
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    //事件监听
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart && isFail==false) {

            //吃食物
            if (foodX == snakeX[0] && foodY == snakeY[0]) {
                length++;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(22);
            }
            //身体向前移动
            for (int i = length - 1; i > 0; i--) {
                snakeX[i] = snakeX[i - 1];
                snakeY[i] = snakeY[i - 1];
            }

            switch (fx) {
                case "up":
                    snakeY[0] = snakeY[0] - 25;
                    if (snakeY[0] ==75) {
                        isFail=true;
                    }
                    break;
                case "down":
                    snakeY[0] = snakeY[0] + 25;
                    if (snakeY[0] == 650) {
                        isFail=true;
                    }
                    break;
                case "right":
                    snakeX[0] = snakeX[0] + 25;
                    if (snakeX[0] == 850) {
                        isFail=true;
                    }
                    break;
                case "left":
                    snakeX[0] = snakeX[0] - 25;
                    if (snakeX[0] ==25) {
                        isFail=true;
                    }
                    break;
            }

            //失败判定
            for (int i = 1; i < length; i++) {
                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                    isFail = true;
                }

            }

            repaint();
        }
        timer.start();
    }
}

 

posted @ 2022-03-02 20:10  每天--自然醒  阅读(23)  评论(0)    收藏  举报