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里 可以正常玩

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


    相关文章
    |
    14天前
    |
    XML Java 编译器
    Java学习十六—掌握注解:让编程更简单
    Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
    82 43
    Java学习十六—掌握注解:让编程更简单
    |
    22天前
    |
    存储 SQL 小程序
    JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
    这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
    24 2
    JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
    |
    7天前
    |
    JavaScript Java 项目管理
    Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
    基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
    |
    22天前
    |
    小程序 Oracle Java
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
    这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
    33 0
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
    |
    24天前
    |
    前端开发 Java 应用服务中间件
    Javaweb学习
    【10月更文挑战第1天】Javaweb学习
    29 2
    |
    26天前
    |
    存储 缓存 Java
    【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
    【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
    31 1
    |
    27天前
    |
    存储 搜索推荐 算法
    【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
    【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
    21 1
    |
    27天前
    |
    算法 Java API
    【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
    【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
    25 1
    |
    20天前
    |
    存储 算法 Java
    带你学习java的数组军队列
    带你学习java的数组军队列
    31 0
    |
    23天前
    |
    Java 大数据 开发工具
    java学习——环境准备(1)
    java学习——环境准备(1)
    39 0