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

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


    相关文章
    |
    6天前
    |
    缓存 安全 Java
    《volatile使用与学习总结:》多层面分析学习java关键字--volatile
    《volatile使用与学习总结:》多层面分析学习java关键字--volatile
    8 0
    |
    3天前
    |
    前端开发 Java 开发工具
    Java GUI编程:跨平台应用的设计与开发
    Java GUI编程:跨平台应用的设计与开发
    |
    6天前
    |
    安全 Java 编译器
    杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
    杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
    7 1
    |
    7天前
    |
    消息中间件 负载均衡 Java
    学习Java中的反应式编程
    学习Java中的反应式编程
    |
    1天前
    |
    前端开发 Java 开发工具
    Java GUI编程:跨平台应用的设计与开发
    Java GUI编程:跨平台应用的设计与开发
    |
    2天前
    |
    Java 数据安全/隐私保护 容器
    Java详解:GUI容器组件 | 功能组件
    Java详解:GUI容器组件 | 功能组件
    |
    2天前
    |
    Java 容器
    Java详解:GUI图形用户界面设计—容器组件及面板布局方式
    Java详解:GUI图形用户界面设计—容器组件及面板布局方式
    |
    5天前
    |
    缓存 NoSQL Java
    Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
    Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
    11 0
    |
    5天前
    |
    存储 NoSQL Java
    Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
    Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
    11 0
    |
    5天前
    |
    存储 NoSQL Java
    Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
    Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
    10 0