Java——GUI——贪吃蛇

1、图片素材

  1. 广告栏
    header.png
  2. 头部
    down.png
    left.png
    right.png
    up.png

2、StartGames类

  1. 创建JFame窗口
  2. 运行程序(main()方法)
    代码演示
package com.computer.snake;

import javax.swing.*;

public class StratGames {
    public static void main(String[] args) {
        //绘制一个静态窗口
        JFrame frame = new JFrame("计算机协会贪吃蛇小游戏");
        //设置界面的大小
        frame.setBounds(400,50,900,720);
        //禁止改变窗口大小
        frame.setResizable(false);
        //关闭窗口事件
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //显示窗口
        frame.add(new GamePanel());
        frame.setVisible(true);
    }
}

3、Data类

  1. 导入图片素材
    代码演示
package com.computer.snake;

import javax.swing.*;
import java.net.URL;

//存放外部数据
public class Data {
    //获取头部图片 定位图片的路径
    public static URL headerURL = Data.class.getResource("/statics/header.png");
    public static ImageIcon header = new ImageIcon(headerURL);
    //导入蛇头
    public static URL upURL = Data.class.getResource("/statics/up.png");
    public static URL downURL = Data.class.getResource("/statics/down.png");
    public static URL leftURL = Data.class.getResource("/statics/left.png");
    public static URL rightURL = Data.class.getResource("/statics/right.png");
    public static ImageIcon up = new ImageIcon(upURL);
    public static ImageIcon down = new ImageIcon(downURL);
    public static ImageIcon left = new ImageIcon(leftURL);
    public static ImageIcon right = new ImageIcon(rightURL);
    //导入身体
    public static URL bodyURL = Data.class.getResource("/statics/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);
    //导入食物
    public static URL foodURL = Data.class.getResource("/statics/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);
}

4、GamePanel类

  1. 游戏面板
  2. 动画效果
  3. 键盘监听
  4. 开始事件
  5. 暂停事件
  6. 结束事件
  7. 窗口监听
    代码演示
package com.computer.snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanel extends JPanel implements KeyListener, ActionListener {
    //蛇的长度
    int lenth;
    //蛇的xy坐标
    int[] snakeX = new int[600];
    int[] snakeY = new int[500];
    //蛇头的方向
    String fx; //R:右   L:左  U:上 D:下
    //游戏是否开始
    boolean isStart;
    //定时器
    Timer timer = new Timer(100,this);
    //食物的坐标
    int foodx;
    int foody;
    Random random = new Random();
    //失败判断
    boolean isFail;
    //积分
    int score;
    //构造器
    public GamePanel(){
        init();
        //获取键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
    }
    //初始化
    public void init(){
        lenth=3;
        //小蛇坐标
        snakeX[0] = 100;snakeY[0] = 100;
        snakeX[1] = 75;snakeY[1] = 100;
        snakeX[2] = 50;snakeY[2] = 100;
        //蛇头方向
        fx = "R";
        //游戏是否开始
        isStart=false;
        //食物的坐标
        foodx = 50 + 25*random.nextInt(32);
        foody = 100 +25*random.nextInt(22);
        //让时间动起来
        timer.start();
        //是否失败
        isFail = false;
        //分数
        score = 0;
    }
    //画板
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏

        //设置背景颜色
        this.setBackground(Color.WHITE);

        //绘制头部广告栏
        Data.header.paintIcon(this,g,25,11);

        //绘制游戏的区域
        g.fillRect(25,75,850,600);

        //绘制蛇头
        if (fx.equals("R")) {
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        } else if(fx.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        } else if (fx.equals("U")) {
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        } else if (fx.equals("D")) {
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }

        //绘制身体
        for (int i = 1; i <lenth ; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //积分榜
        g.setColor(Color.GREEN);
        g.setFont(new Font("小篆",Font.BOLD,20));
        g.drawString("长度"+lenth,790,30);
        g.drawString("分数"+score,790,55);

        //画食物
        Data.food.paintIcon(this,g,foodx,foody);

        //游戏提示;是否开始
        if (!isStart) {
            g.setColor(Color.WHITE);
            g.setFont(new Font("小篆",Font.BOLD,40));
            g.drawString("按下空格开始或暂停",300,300);
        }
        //游戏提示:失败提醒
        if (isFail) {
            //画一个文字
            g.setColor(Color.RED);
            g.setFont(new Font("小篆",Font.BOLD,40));
            g.drawString("游戏失败空格重新开始",300,300);
        }
    }






    @Override
    public void keyPressed(KeyEvent e) {
        //键盘按下不弹起
        int keyCode = e.getKeyCode();
        //如果按下的是空格
        if (keyCode==KeyEvent.VK_SPACE) {
            //失败,让游戏重来
            if (isFail) {
                init();
            } else {
                isStart = !isStart;
            }
            repaint();          //重新绘制界面
        }
        //键盘控制方向
        if (keyCode == KeyEvent.VK_LEFT && !fx.equals("R")) {
            fx = "L";
        } else if (keyCode == KeyEvent.VK_RIGHT && !fx.equals("L")) {
            fx = "R";
        } else if (keyCode == KeyEvent.VK_UP && !fx.equals("D")) {
            fx = "U";
        } else if (keyCode == KeyEvent.VK_DOWN && !fx.equals("U")) {
            fx = "D";
        }
    }




    //定时器,监听时间:执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) {
        //如果游戏属于启动状态
        if (isStart && !isFail) {
            //末尾添加身体
            for (int i = lenth-1; i > 0; i--) {
                snakeX[i] = snakeX[i-1];
                snakeY[i] = snakeY[i-1];

            }
            //通过方向控制头部移动
            if (fx.equals("R")) {
                snakeX[0] += 25;
                //边界判断
                if (snakeX[0]>840) {
                    isFail = !isFail;
                }
            } else if(fx.equals("L")){
                snakeX[0] -= 25;
                //边界判断
                if (snakeX[0] < 35) {
                    isFail = !isFail;
                }
            } else if (fx.equals("U")) {
                snakeY[0] -= 25;
                //边界判断
                if (snakeY[0]<85) {
                    isFail = !isFail;
                }
            } else if (fx.equals("D")) {
                snakeY[0] += 25;
                //边界判断
                if (snakeY[0]>640) {
                    isFail = !isFail;
                }
            }
            //如果蛇头的坐标和食物坐标重合了
            if (snakeX[0] == foodx && snakeY[0] == foody){
                //长度+1
                lenth++;
                score+=7;
                //重新生成食物
                foodx = 50 + 25*random.nextInt(32);
                foody = 100 +25*random.nextInt(22);
            }
            //失败判断
            for (int i = 1; i < lenth; i++) {
                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                    isFail = !isFail;
                }
            }
            //重新绘制界面
            repaint();
        }
        timer.start();  //让时间动起来
    }








    @Override
    public void keyReleased(KeyEvent e) {
            //释放某个键
    }
    @Override
    public void keyTyped(KeyEvent e) {
        //键盘按下弹起
    }
    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴在敲Bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值