java后端开发day24--阶段项目(一)

news2025/7/8 14:24:40

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

GUI:Graphical User Interface 图形用户接口,采取图形化的方式显示操作界面
分为两套体系:AWT包(有兼容问题)和Swing包(常用)

拼图小游戏目的:

  1. 锻炼逻辑思维能力
  2. 知道前面学习的知识点在实际开发场景中的应用场景

1.主界面分析

请添加图片描述

1.创建主界面1

  • 到idea中创建一个宽603像素,高680像素的游戏主界面
  • 到idea中创建一个宽488像素,高430像素的登录界面
  • 到idea中创建一个宽488像素,高500像素的注册界面
1.LoginJFrame
package com.woziji.ui;

import javax.swing.*;

public class LoginJFrame extends javax.swing.JFrame{
    //登录界面
    //以后和登录相关的所有逻辑都写在这个类中
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,直接展示出来

        this.setSize(488,430);
        this.setVisible(true);
    }
}

2.RegisterJFrame
package com.woziji.ui;

public class RegisterJFrame extends javax.swing.JFrame{
    //注册界面
    //以后和注册相关的所有逻辑都写在这个类中
    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
    }
}

3.GameJFrame
package com.woziji.ui;

public class GameJFrame extends javax.swing.JFrame {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    public GameJFrame() {
        this.setSize(603,680);
        this.setVisible(true);
    }
}

4.App
import com.woziji.ui.GameJFrame;
import com.woziji.ui.LoginJFrame;
import com.woziji.ui.RegisterJFrame;

public class App {
    public static void main(String[] args) {
        //表示程序的入口
        //如果我们想开启一个界面,就创建谁的对象
        new LoginJFrame();
        new GameJFrame();
        new RegisterJFrame();
    }
}

2.创建主界面2

用继承改写上述主界面,并思考用继承改写的好处

1.LoginJFrame
package com.woziji.ui;

import javax.swing.*;

public class LoginJFrame extends javax.swing.JFrame{
    //登录界面
    //以后和登录相关的所有逻辑都写在这个类中
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,直接展示出来

        this.setSize(488,430);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 登录");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

2.RegisterJFrame
package com.woziji.ui;

public class RegisterJFrame extends javax.swing.JFrame{
    //注册界面
    //以后和注册相关的所有逻辑都写在这个类中
    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

3.GameJFrame
package com.woziji.ui;

public class GameJFrame extends javax.swing.JFrame {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    public GameJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }
}

2.菜单分析

请添加图片描述
请添加图片描述

快捷键:

  • 按住方法名 ctrl+B 查看源码
  • 选中代码块 ctrl+alt+m 重命名并抽取方法
  • 单击接口名 alt+回车 重写所有方法

1.菜单制作

 private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
        JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
        JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);
    }

2.截止到这里的GameJFrame的代码如下

package com.woziji.ui;

import javax.swing.*;

public class GameJFrame extends javax.swing.JFrame {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }

    private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
        JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
        JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

3.功能分析

1.添加图片

请添加图片描述
坐标:
请添加图片描述
隐藏容器:取消默认居中
请添加图片描述

private void initImage() {
        int number = 1;
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j,105*i,105,105);
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
                number++;
            }

2.截止到这里的GameJFrame的代码如下

package com.woziji.ui;

import javax.swing.*;

public class GameJFrame extends javax.swing.JFrame {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化图片
        initImage();

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }

    private void initImage() {
        int number = 1;
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j,105*i,105,105);
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
                number++;
            }
        }
    }

    private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
        JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
        JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置,只有取消了才可以设置坐标
        this.setLayout(null);
    }
}

3.打乱图片

请添加图片描述

练习:打乱一维数组中的数据

int[] temperArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
要求:打乱一维数组中的数据,并按照4个一组的方式添加到二维数组中。

package com.woziji.test;

public class Test {
    public static void main(String[] args) {
    //需求:
        //把一个一维数组中的数据:0~15,随机打乱,然后输出
        //然后再按照4个一组的方式添加到二维数组中

        //1.定义一个一维数组
        int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

        //2.随机打乱一维数组中的数据
        for (int i = 0; i < tempArr.length; i++) {
            //获取随机索引
            int randomIndex = (int)(Math.random()*tempArr.length);
            //拿着随机索引对应的值和i索引对应的值进行交换
            int temp = tempArr[i];
            tempArr[i] = tempArr[randomIndex];
            tempArr[randomIndex] = temp;
        }

        //3.遍历一维数组
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i]+" ");
        }
        System.out.println();

        //4.把一维数组中的数据按照4个一组的方式添加到二维数组中
        //方法一:遍历一维数组
       // int[][] arr = new int[4][4];
        //for (int i = 0; i < tempArr.length; i++) {
            //i/4 表示二维数组中的行索引
            //i%4 表示二维数组中的列索引
           // arr[i/4][i%4] = tempArr[i];
        
        //方法二:遍历二维数组
        int[][] arr = new int[4][4];
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = tempArr[index];
                index++;
            }
            System.out.println();
        }
        //5.遍历二维数组
        for (int j = 0; j < arr.length; j++) {
            for (int k = 0; k < arr[j].length; k++) {
                System.out.print(arr[j][k]+" ");
            }
            System.out.println();
        }
    }
}

4.截止到这里的GameJFrame的代码如下

package com.woziji.ui;

import javax.swing.*;


public class GameJFrame extends javax.swing.JFrame {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    //用来管理数据
    int[][] arr = new int[4][4];

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱)
        initData();

        //初始化图片
        initImage();

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }

    private void initData() {

                //1.定义一个一维数组
                int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

                //2.随机打乱一维数组中的数据
                for (int i = 0; i < tempArr.length; i++) {
                    //获取随机索引
                    int randomIndex = (int)(Math.random()*tempArr.length);
                    //拿着随机索引对应的值和i索引对应的值进行交换
                    int temp = tempArr[i];
                    tempArr[i] = tempArr[randomIndex];
                    tempArr[randomIndex] = temp;
                }

                //3.遍历一维数组
                for (int i = 0; i < tempArr.length; i++) {
                    System.out.print(tempArr[i]+" ");
                }
                System.out.println();
                //方法二:遍历二维数组

                int index = 0;
                for (int i = 0; i < arr.length; i++) {
                    for (int j = 0; j < arr[i].length; j++) {
                        arr[i][j] = tempArr[index];
                        index++;
                    }
                    System.out.println();
                }
            }

    private void initImage() {
        //添加图片的时候,就需要按照二维数组中管理的数据添加图片
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //获取二维数组中每个索引对应的数字
                int number = arr[i][j];
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j,105*i,105,105);
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
            }
        }
    }

    private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
        JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
        JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置,只有取消了才可以设置坐标
        this.setLayout(null);
    }
}

4.事件

事件是可以被组件识别的操作
当你对组件干了某件事情后,就会执行对应的代码

  • 事件源:按钮,图片,窗体
  • 事件:某些操作
    如:鼠标单击,鼠标划入
  • 绑定监听:当事件源上发生了某个事件,则执行某段代码
    KeyListener:键盘监听 MouseListener:鼠标监听 ActionListener:动作监听

1.ActionListener

package com.woziji.test;

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

public class MyJFrame extends JFrame
        implements ActionListener {

    //创建一个按钮
    JButton jb1 = new JButton("我是按钮");

    //创建第二个按钮
    JButton jb2 = new JButton("我是按钮2");


    public MyJFrame(){
        //设置宽高
        this.setSize(488,430);
        //设置标题
        this.setTitle("事件演示");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认居中放置
        this.setLayout(null);


        //设置按钮的宽高
        jb1.setBounds(0,0,100,50);
        //给按钮添加事件
        jb1.addActionListener(this);


        //设置按钮的宽高
        jb2.setBounds(100,0,100,50);
        //给按钮添加事件
        jb2.addActionListener(this);

        //把按钮添加到界面上
        this.add(jb1);
        this.add(jb2);

        //让界面展示出来
        this.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //对当前的按钮进行判断
        //获取当前被点击的按钮
        Object source = e.getSource();
        if(source == jb1){
            jb1.setSize(100,100);
        } else if(source == jb2){
            Random r = new Random();
            jb2.setLocation(r.nextInt(400),r.nextInt(400));
        }
    }

}

package com.woziji.test;

public class Test3 {
    public static void main(String[] args) {
        new MyJFrame();
    }
}

2.MouseListener

  • 划入动作
  • 单击动作
    按下动作和松开动作
  • 划出动作

请添加图片描述

package com.woziji.test;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MyJFrame2 extends JFrame implements MouseListener {
    //创建一个按钮
    JButton jb1 = new JButton("我是按钮");

    public MyJFrame2() {
        //设置宽高
        this.setSize(488,430);
        //设置标题
        this.setTitle("事件演示");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认居中放置
        this.setLayout(null);

        //设置按钮的宽高
        jb1.setBounds(0,0,100,50);
        //给按钮绑定鼠标事件
        jb1.addMouseListener(this);

        //把按钮添加到界面上
        this.add(jb1);
        //让界面展示出来
        this.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("单击");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("按下不松");

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("松开");

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("划入");

    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("划出");

    }
}

package com.woziji.test;

public class Test3 {
    public static void main(String[] args) {
        //new MyJFrame();
        new MyJFrame2();
    }
}

3.KeyListener

请添加图片描述

package com.woziji.test;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class MyJFrame3 extends JFrame implements KeyListener {
    public MyJFrame3() {
        //设置宽高
        this.setSize(488,430);
        //设置标题
        this.setTitle("事件演示");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认居中放置
        this.setLayout(null);

        //给整个窗体绑定键盘事件
        //调用者this:本类对象,当前界面的对象,表示我要给整个界面添加监听
        //参数this:当事件被触发后,会执行本类中的对应代码
        this.addKeyListener(this);

        //让界面展示出来
        this.setVisible(true);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("这个不重要");
    }

    //细节1:
    //如果我们按下一个按键没有松开,那么会重复触发keyPressed方法
    //细节2:
    //键盘里那么多按键,如何进行区分
    //键盘上的每一个按键都有一个编号
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("按下不松");

    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("松开");
        //获取键盘上的每一个按键的编号
        int code = e.getKeyCode();
        if(code == 32){
            System.out.println("按下的是空格键");
        } else if(code == 65){
            System.out.println("按下的是A键");
        }
    }
}

package com.woziji.test;

public class Test3 {
    public static void main(String[] args) {
        //new MyJFrame();
        //new MyJFrame2();
        new MyJFrame3();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具

蜂蜜影视是一款基于猫影视开源项目 CatVodTVJarLoader 开发的智能电视软件&#xff0c;专为追求简洁与高效观影体验的用户设计。该软件从零开始编写&#xff0c;界面清爽&#xff0c;操作流畅&#xff0c;特别适合在智能电视上使用。其最大的亮点在于能够自动跳过失效的播放地址…

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊&#xff1a; Water Resource…

2025AI 有哪些重要的发展趋势?

2025 年&#xff0c;AI 有哪些重要的发展趋势&#xff1f; 看看大佬们的看法&#xff1a; 马斯克&#xff1a;“人形机器人生产、自动驾驶突破、脑机接口进化” 奥特曼&#xff1a;“2025年&#xff0c;AGI即将到来” 黄仁勋&#xff1a;“通用机器人元年、能源效率的提升”…

IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程

背景&#xff1a;最近DeepSeek比较火嘛&#xff0c;然后在githup上也看到了GitHub Copilot&#xff0c;就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件&#xff0c;发现Proxy支持的模型比较多&#xff0c;通用性和适配性比较好。所以本文记录一下pro…

【前端基础】Day 3 CSS-2

目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程&#xff0c;安装 - LLaMA Factory&#xff0c;上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装&#xff0c;但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…

汽车无人驾驶系统中的防撞设计

一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块&#xff0c;本文设计的系统以STM32F103C8T6单片机为主控制器&#xff0c;结合超声波测距、WiFi通信、人机交互等模块&#xff0c;实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…

Linux网络 DNS

DNS(Domain Name System) TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 &#xff0c; 但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 。 最初 , 通过互连网信息中…

EMQX中不同端口对应的接入协议

使用tcp接入时应使用mqtt://IP:1883 使用ws接入时应使用ws://IP:8083

SpringBoot原理-03.自动配置-方案

一.自动配置原理 探究自动配置原理&#xff0c;就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils&#xff0c;这里面定义了bean对象以及配置类&#xff0c;用来模拟第三方提供的依赖&#xff0c;首…

(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B

安装环境为&#xff1a;ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…

【软考-架构】1.2、指令系统-存储系统-cache

GitHub地址&#xff1a;https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程&#xff1a;取指令一一分析指令一一执行指令三个步骤&#xff0c;首先将程序计数器PC中的指令地址取出&#xff0c;送入地址总线&#xff0c;CPU依据…

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示&#xff1a;dp[i]&#xff0c;表示dp表中i下标位置的值 2. 状态转移方程&#xff1a;以i位置位置的状态&#xff0c;最近的一步来划分问题&#xff0c;比如可以将状态拆分成前状态来表示现状态&#xff0c;dp[i] …

2025-03-01 学习记录--C/C++-C语言 整数类型对比

C语言 整数类型对比 类型位数范围&#xff08;有符号&#xff09;范围&#xff08;无符号&#xff09;格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…

爬虫系列之【数据解析之正则】《二》

目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中&#xff0c;我们主要会遇到两种类型的文本数据&#xff1a; JSON格式数据 HTML文档数据 对于JSON字符串数据&#xff0c;通常使用Python的字典操作进行键…

RFID工具柜DW-G104R|智能存储,便捷高效

一、行业背景 RFID智能工具柜&#xff08;DW-G104R&#xff09;RFID工具管理柜是一种结合RFID技术和智能柜设备的新型工具管理设施&#xff0c;通过自动化管理可以提高工具管理的效率和准确性。 在工业生产中&#xff0c;工具柜是工具存储和管理的重要设备。传统工具柜存在管…

Linux软连接与时区日期

软连接 使用ln命令创建软连接。 在系统中创建软连接&#xff0c;可以将文件&#xff0c;文件夹连接到其他为止。 类似于Windows系统的快捷方式。 语法&#xff1a;ln -s 参数1 参数2 -s选项&#xff0c;创建软连接。 参数1&#xff0c;被链接的文件或文件夹。 参数2&#xff0…

2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip

2024ChatGPT大模型技术场景与商业应用视频精讲合集&#xff0c;共十三章&#xff0c;45课。 01. 第一章 ChatGPT&#xff1a;通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型&#xff1a;ChatGPT的核心支撑 2.1 底层…

HTTP四次挥手是什么?

四次挥手&#xff0c;这是TCP协议用来关闭连接的过程。四次挥手是确保两个主机之间能够安全、可靠地关闭连接的重要机制。我会用简单易懂的方式来讲解&#xff0c;帮助你理解它的原理和过程。 1. 什么是四次挥手&#xff1f; 定义 四次挥手是TCP协议用来关闭连接的过程。它通…

人工智能之数学基础:线性代数中的特殊矩阵

本文重点 矩阵是数学中一个重要的工具,在各个领域都有广泛的应用。其中,一些特殊矩阵由于具有独特的性质,在特定的问题中发挥着关键作用。 单位矩阵 单位矩阵是一种特殊的方阵,在矩阵乘法中起到类似于数字 “1” 的作用。对于一个的单位矩阵,其主对角线元素全为 1,其余…