Java gui学习 贪吃蛇

简介: Java gui学习

javaEE基础看了两遍了,第一次没记笔记都忘了,无奈从头学记笔记了。

本着 代码审计的目的学习java,到gui这里,走不动道了,发现很有意思。

前后编写了两个小demo。一个是冰墩墩.jar,一个是jar包后门植入。

源码三个文件

    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 ImageIcon up = new ImageIcon(upUrl);
        public static URL downUrl = Data.class.getResource("statics\\down.png");
        public static ImageIcon down = new ImageIcon(downUrl);
        public static URL leftUrl = Data.class.getResource("statics\\left.png");
        public static ImageIcon left = new ImageIcon(leftUrl);
        public static URL rightUrl = Data.class.getResource("statics\\right.png");
        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);
    }

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    public class GamePanel extends JPanel implements KeyListener, ActionListener{
        //面板
        static int code;
        int length;//蛇的长度
        int [] snakeX = new int [600];//蛇的身体
        int [] snakeY = new int [500];
        String fx;
        boolean isStart = false;//游戏是否开始
        //每隔多少秒执行一次 -- 设置移动速度 
        Timer timer = new Timer( 125, this);
        //定义一个食物
        int foodx;
        int foody;
        Random random = new Random();
        //添加死亡判断
        boolean isFail = false;
        //积分系统
        int score;
        public GamePanel(){
            init();
            //获取键盘的监听事件
            this.setFocusable(true);//让焦点聚集在游戏上
            this.addKeyListener(this);
            timer.start();
        }
        public void init(){
            length = 3;//初始长度为3
            snakeX[0] = 100;snakeY[0] =100;//设置初始位置(头部坐标)
            snakeX[1] = 75;snakeY[1] =100;//第一个身体
            snakeX[2] = 50;snakeY[2] =100;//第二个身体
            fx = "R"; //默认方向为右
            foodx = 25 + 25*random.nextInt(34);
            foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子
            score = 0;
        }
        //画板;画界面;画蛇
        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<length;i++){//循环打印身体长度
                Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
            }
            //画食物
            Data.food.paintIcon(this, g, foodx, foody);
            //画积分
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体样式,粗体,和大小
            g.drawString("长度"+length, 750, 30);//画字体
            g.drawString("分数"+score, 750,55);//画字体
            //开始提示
            if(isStart==false){
                //画一个文字
                g.setColor(Color.WHITE);//设置画笔颜色
                g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
                g.drawString("按下空格开始游戏", 300, 300);//画字体
            }
            //失败
            if(isFail){
                //画一个文字
                g.setColor(Color.WHITE);//设置画笔颜色
                g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
                g.drawString("游戏失败,按下空格重新开始", 300, 300);//画字体
            }
        }
        //接受键盘的输入:监听
        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            //键盘按下的监听事件
            //获取按下的键盘是哪一个键
            int keyCode = e.getKeyCode();
            if((keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A)&&fx=="R"){
                keyCode=KeyEvent.VK_RIGHT;
            }else if((keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D)&&fx=="L"){
                keyCode=KeyEvent.VK_LEFT;
            }else if((keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W)&&fx=="D"){
                keyCode=KeyEvent.VK_DOWN;
            }else if((keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S)&&fx=="U"){
                keyCode=KeyEvent.VK_UP;
            }
            //如果按下的是空格,启动或暂停
            if(keyCode==KeyEvent.VK_SPACE){
                if(isFail){//失败,游戏再来一遍
                    isFail = false;
                    init();//重新初始化
                }else{
                    isStart = !isStart;
                }
                repaint();//刷新界面
            }
            if(keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){
                fx = "L";
            }
            if(keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D){
                fx = "R";
            }
            if(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){
                fx = "U";
            }
            if(keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){
                fx = "D";
            }
        }
        //定时器,监听时间
        @Override
        public void actionPerformed(ActionEvent e) {
            //如果游戏处于开始状态,而且游戏没有结束
            if(isStart&&isFail==false){
                for(int i = length-1; i > 0; i--){//除了脑袋身体都向前移动
                    snakeX[i] = snakeX[i-1];
                    snakeY[i] =  snakeY[i-1];
                }
                //控制方向头部移动
                if(fx.equals("R")){
                    snakeX[0] = snakeX[0] + 25;
                    //边界判断
                    if(snakeX[0]>850){
                        snakeX[0] = 25;//回到原始位置
                    }
                }else if(fx.equals("L")){
                    snakeX[0] = snakeX[0] - 25;
                    //边界判断
                    if(snakeX[0]<25){
                        snakeX[0] = 850;//回到原始位置
                    }
                }else if(fx.equals("U")){
                    snakeY[0] -= 25;
                    //边界判断
                    if(snakeY[0]<75){
                        snakeY[0] = 650;//回到原始位置
                    }
                }else if(fx.equals("D")){
                    snakeY[0] += 25;
                    //边界判断
                    if(snakeY[0]>650){
                        snakeY[0] = 75;//回到原始位置
                    }
                }
                //如果吃到食物:坐标重合
                if(snakeX[0]==foodx&&snakeY[0]==foody){
                    //长度加一
                    score +=10 ;
                    //重新生成食物
                    foodx = 25 + 25*random.nextInt(34);
                    foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子
                    length += 1;
                }
                //结束判断
                for(int i = 1;i < length;i++){
                    if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                        isFail = true;//设置失败
                    }
                }
                //移动完要刷新界面
                repaint();
            }
            //让计时器动起来
            timer.start();
        }
        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            //键盘按下,弹起
        }
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            //键盘释放
        }
    }

    import javax.swing.*;
    public class startGame {
        public static void main(String[] args) {
            // 窗体
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.setBounds(100,100,900,720);
            frame.setResizable(false);
            frame.setTitle("贪吃蛇🐍    by private null");
            frame.add(new GamePanel());
        }

    有个bug算是,但也不是,java是跨平台的 win上空格不能开始游戏,放到linux里 可以正常玩

    也不知道是电脑问题 还是啥问题,


    相关文章
    |
    11天前
    |
    Java
    Java实现贪吃蛇游戏
    本文介绍了如何使用Java实现一个简单的贪吃蛇游戏。
    45 4
    |
    8天前
    |
    Java 调度 开发者
    Java线程池ExecutorService学习和使用
    通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
    30 10
    |
    11天前
    |
    Java 数据库连接 数据库
    【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
    《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
    42 4
    |
    11天前
    |
    前端开发 Java 数据库连接
    【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
    深度解读JavaWeb开发在Java学习中的重要性
    24 4
    |
    11天前
    |
    存储 移动开发 算法
    【潜意识Java】Java基础教程:从零开始的学习之旅
    本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
    31 1
    |
    3月前
    |
    XML Java 编译器
    Java学习十六—掌握注解:让编程更简单
    Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
    118 43
    Java学习十六—掌握注解:让编程更简单
    |
    3月前
    |
    存储 SQL 小程序
    JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
    这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
    59 2
    JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
    |
    2月前
    |
    Java 大数据 API
    14天Java基础学习——第1天:Java入门和环境搭建
    本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
    |
    2月前
    |
    JavaScript Java 项目管理
    Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
    基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
    |
    3月前
    |
    小程序 Oracle Java
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
    这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
    70 0
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用