阶段项目——拼图小游戏
Java学习笔记(新手纯小白向)
第一章 JAVA基础概念
第二章 JAVA安装和环境配置
第三章 IntelliJ IDEA安装
第四章 运算符
第五章 运算符联系
第六章 判断与循环
第七章 判断与循环练习
第八章 循环高级综合
第九章 数组介绍及其内存图
第十章 数组基础练习
第十一章 方法基础及简单应用
第十二章 方法基础练习
第十三章 前续知识综合练习
第十四章 面向对象基础
第十五章 面向对象综合训练
第十六章 字符串基础
第十七章 字符串基础练习
第十八章 ArrayList集合
第十九章 ArrayList集合基础练习
第二十章 面向对象进阶
第二十一章 面向对象进阶基础练习
第二十二章 阶段项目——拼图小游戏
目录
Java学习笔记(新手纯小白向)
前言
代码示例
一、UI界面搭建
1.游戏主界面
2.登录界面
3.注册界面
二、业务逻辑编写
1.用户类
2.生成验证码的工具类
三、游戏主入口
四、游戏打包exe说明
总结
前言
本篇章主要展示了阶段项目——拼图小游戏,该项目基本包括了之前所学的所有知识点,可以很好得巩固所学知识点。
代码示例
一、UI界面搭建
1.游戏主界面
//创建游戏主界面
public class GameJFrame extends JFrame implements KeyListener, ActionListener {//创建获取随机数的对象Random r = new Random();//定义二维数组,记录图片的编号int[][] imageCode = new int[4][4];//定义二维数组,记录胜利后图片的编号int[][] win = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};//定义变量x和y,记录空白方块在二维数组中的位置int x = 0;int y = 0;//定义变量path,记录当前加载图片的相对路径String path = "gigsawgame\\image\\animal\\animal1\\";//定义变量step,记录移动的步数int step = 0;//创建选项下的条目对象JMenuItem replayItem = new JMenuItem("重新游戏");JMenuItem reLoginItem = new JMenuItem("重新登录");JMenuItem closeItem = new JMenuItem("关闭游戏");JMenuItem rewardItem = new JMenuItem("谢谢打赏");JMenuItem girlItem = new JMenuItem("美女");JMenuItem animalItem = new JMenuItem("动物");JMenuItem sportsItem = new JMenuItem("运动");//定义空参构造,对界面进行初始化public GameJFrame() {//初始化游戏主界面initJFrame();//初始化菜单initJMenuBar();//初始化数据initImageCode();//初始化图片initImage();//设置界面是否显示,建议写在最后this.setVisible(true);}//打乱图片编号private void initImageCode() {//定义一维数组,记录图片编号int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};//打乱数组中号码的顺序for (int i = 0; i < tempArr.length; i++) {//获取随机索引int index = r.nextInt(tempArr.length);//进行数据交换int temp = tempArr[i];tempArr[i] = tempArr[index];tempArr[index] = temp;}//定义变量index,记录一维数组的索引int index = 0;//将打乱后的一维数组中的编号,添加到二维数组中for (int i = 0; i < imageCode.length; i++) {for (int j = 0; j < imageCode[i].length; j++) {if (tempArr[index] == 0) {x = i;y = j;}imageCode[i][j] = tempArr[index];index++;}}}//将图片加载到界面中private void initImage() {//清空已经出现的图片this.getContentPane().removeAll();//如果胜利,加载胜利图片if (victory()) {JLabel winJLabel = new JLabel(new ImageIcon("gigsawgame\\image\\win.png"));winJLabel.setBounds(203, 283, 197, 73);this.getContentPane().add(winJLabel);}//加载步数计数器JLabel stepCount = new JLabel("步数:" + step);stepCount.setBounds(50, 30, 100, 20);this.getContentPane().add(stepCount);//使用循环添加每一行图片for (int i = 0; i < 4; i++) {//使用循坏添加每一列图片for (int j = 0; j < 4; j++) {//定义变量code,记录图片编号int code = imageCode[i][j];//创建ImageIcon图片对象,并创建JLabel管理容器JLabel jLabel = new JLabel(new ImageIcon(path+ code + ".jpg"));//指定图片位置jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);//给图片添加边框jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//将JLabel管理容器添加到界面中(将JLabel管理容器添加到隐藏容器之中)this.getContentPane().add(jLabel);}}//添加背景图片(后添加的在下方)JLabel background = new JLabel(new ImageIcon("gigsawgame\\image\\background.png"));background.setBounds(40, 40, 508, 560);this.getContentPane().add(background);//刷新界面this.getContentPane().repaint();}//设置菜单栏基础信息private void initJMenuBar() {//创建菜单栏对象JMenuBar jMenuBar = new JMenuBar();//创建菜单上面的两个选项:功能、关于我们JMenu functionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("关于我们");//创建功能选项中的更换图片选项JMenu replaceImage = new JMenu("更换图片");//匹配选项与条目//匹配功能选项与其条目functionJMenu.add(replaceImage);functionJMenu.add(replayItem);functionJMenu.add(reLoginItem);functionJMenu.add(closeItem);//匹配功能选项下的更换图片选项与其条目replaceImage.add(girlItem);replaceImage.add(animalItem);replaceImage.add(sportsItem);//匹配关于我们选项与其条目aboutJMenu.add(rewardItem);//给条目绑定事件replayItem.addActionListener(this);reLoginItem.addActionListener(this);closeItem.addActionListener(this);rewardItem.addActionListener(this);girlItem.addActionListener(this);animalItem.addActionListener(this);sportsItem.addActionListener(this);//将选项添加到菜单栏中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(WindowConstants.EXIT_ON_CLOSE);//取消默认的居中放置this.setLayout(null);//添加游戏操作(给整个界面添加键盘监听事件)this.addKeyListener(this);}//空实现keyTyped方法@Overridepublic void keyTyped(KeyEvent e) {}//实现键盘按下不松按键操作方法,查看完整图片@Overridepublic void keyPressed(KeyEvent e) {//定义变量keyCode,记录按下按键的值int keyCode = e.getKeyCode();if (keyCode == 65) {//清空之前的图片this.getContentPane().removeAll();//加载完整图片JLabel jLabel = new JLabel(new ImageIcon(path + "all.jpg"));jLabel.setBounds(83, 134, 420, 420);this.getContentPane().add(jLabel);//加载背景图片JLabel background = new JLabel(new ImageIcon("gigsawgame\\image\\background.png"));background.setBounds(40, 40, 508, 560);this.getContentPane().add(background);}//重新加载图片this.getContentPane().repaint();}//实现键盘松开按键操作方法,使图片可以左上右下移动及一键通关@Overridepublic void keyReleased(KeyEvent e) {//如果游戏胜利,则结束方法if (victory()) {return;}//定义变量keyCode,记录按键的值int keyCode = e.getKeyCode();//对按键进行判断,做出对应行为switch (keyCode) {//左键操作case 37 -> {//判断是否为空白方块是否位于最右侧if (y == 3) {return;} else {imageCode[x][y] = imageCode[x][y + 1];imageCode[x][y + 1] = 0;y++;//移动一次,步数增加一次step++;}//调用方法initImage,重新加载图片initImage();}//上键操作case 38 -> {//判断是否为空白方块是否位于最下侧if (x == 3) {return;} else {imageCode[x][y] = imageCode[x + 1][y];imageCode[x + 1][y] = 0;x++;//移动一次,步数增加一次step++;}//调用方法initImage,重新加载图片initImage();}//右键操作case 39 -> {//判断是否为空白方块是否位于最左侧if (y == 0) {return;} else {imageCode[x][y] = imageCode[x][y - 1];imageCode[x][y - 1] = 0;y--;//移动一次,步数增加一次step++;}//调用方法initImage,重新加载图片initImage();}//下键操作case 40 -> {//判断是否为空白方块是否位于最上侧if (x == 0) {return;} else {imageCode[x][y] = imageCode[x - 1][y];imageCode[x - 1][y] = 0;x--;//移动一次,步数增加一次step++;}//调用方法initImage,重新加载图片initImage();}//松开A键,恢复之前的打乱效果case 65 -> {initImage();}//松开按键W,实现一键通关case 87 -> {imageCode = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};initImage();}}}//定义方法victory,判断游戏是否胜利public boolean victory() {for (int i = 0; i < imageCode.length; i++) {for (int j = 0; j < imageCode[i].length; j++) {if (imageCode[i][j] != win[i][j]) {return false;}}}return true;}//给菜单栏中选项下的条目对象绑定事件@Overridepublic void actionPerformed(ActionEvent e) {//获取被点击的条目对象Object clickItem = e.getSource();//判断并执行if (clickItem == replayItem) {//步数归零step = 0;//重新打乱图片编号initImageCode();//重新加载图片initImage();} else if (clickItem == reLoginItem) {//关闭当前游戏界面this.setVisible(false);//打开登录界面new LoginJFrame();} else if (clickItem == closeItem) {//关闭虚拟机System.exit(0);} else if (clickItem == rewardItem) {//创建一个弹框对象JDialog jDialog = new JDialog();//创建图片管理容器JLabelJLabel jLabel = new JLabel(new ImageIcon("gigsawgame\\image\\reward.jpg"));//设置管理容器的位置和宽高jLabel.setBounds(0, 0, 514, 514);//把管理容器添加到弹框中jDialog.getContentPane().add(jLabel);//设置弹框的大小jDialog.setSize(600, 600);//设置弹框置顶jDialog.setAlwaysOnTop(true);//设置弹框居中jDialog.setLocationRelativeTo(null);//弹窗不关闭,则无法操作下面的界面jDialog.setModal(true);//让弹窗显示jDialog.setVisible(true);} else if (clickItem == girlItem) {//步数归零step = 0;//随机获取美女图片编号int beautyCode = r.nextInt(13) + 1;path = "gigsawgame\\image\\girl\\girl" + beautyCode + "\\";//重新打乱图片编号initImageCode();//重新加载图片initImage();} else if (clickItem == animalItem) {//步数归零step = 0;//随机获取动物图片编号int animalCode = r.nextInt(8) + 1;path = "gigsawgame\\image\\animal\\animal" + animalCode + "\\";//重新打乱图片编号initImageCode();//重新加载图片initImage();} else if (clickItem == sportsItem) {//步数归零step = 0;//随机获取运动图片编号int sportsCode = r.nextInt(10) + 1;path = "gigsawgame\\image\\sport\\sport" + sportsCode + "\\";//重新打乱图片编号initImageCode();//重新加载图片initImage();}}
}
2.登录界面
//创建登录界面
public class LoginJFrame extends JFrame implements MouseListener {//数据初始化//创建集合user,存储正确的用户名和密码static ArrayList<User> users = new ArrayList<>();static {users.add(new User("张三", "123"));users.add(new User("李四", "abc"));}//加载用户名、密码和验证码输入框JTextField usernameField = new JTextField();JPasswordField passwordField = new JPasswordField();JTextField iCodeField = new JTextField();//加载显示密码按钮、登录按钮、注册按钮和验证码内容管理器JButton passwordVisible = new JButton();JButton loginButton = new JButton();JButton registerButton = new JButton();JLabel rightCode = new JLabel();//加载正确验证码String rightICode = ICodeUtil.getCode();//定义空参构造,对界面进行初始化public LoginJFrame() {//初始化登录主界面initJFrame();//初始化图片、输入框及按钮initTextButton();//设置界面是否显示,建议写在最后this.setVisible(true);}//设置输入框、按钮及图片private void initTextButton() {//清空已经出现的图片、输入框及按钮this.getContentPane().removeAll();//加载输入框基础图片JLabel usernameImage = new JLabel(new ImageIcon("gigsawgame\\image\\login\\用户名.png"));usernameImage.setBounds(105, 129, 47, 17);JLabel passwordImage = new JLabel(new ImageIcon("gigsawgame\\image\\login\\密码.png"));passwordImage.setBounds(112, 202, 32, 16);JLabel iCodeImage = new JLabel(new ImageIcon("gigsawgame\\image\\login\\验证码.png"));iCodeImage.setBounds(100, 274, 56, 21);//设置用户名、密码和验证码输入框的基础信息usernameField.setBounds(200, 123, 150, 29);passwordField.setBounds(200, 196, 150, 29);iCodeField.setBounds(200, 270, 75, 29);//设置正确验证码内容管理器的基础信息rightCode.setText(rightICode);rightCode.setBounds(275, 270, 75, 29);//设置显示密码按钮、登录按钮和注册按钮的基础信息passwordVisible.setBounds(332, 196, 18, 29);passwordVisible.setIcon(new ImageIcon("gigsawgame\\image\\login\\显示密码.png"));loginButton.setBounds(64, 320, 128, 47);loginButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\登录按钮.png"));registerButton.setBounds(275, 320, 128, 47);registerButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\注册按钮.png"));//去除按钮的默认边框及背景passwordVisible.setBorderPainted(false);passwordVisible.setContentAreaFilled(false);loginButton.setBorderPainted(false);loginButton.setContentAreaFilled(false);registerButton.setBorderPainted(false);registerButton.setContentAreaFilled(false);//加载背景图片JLabel background = new JLabel(new ImageIcon("gigsawgame\\image\\login\\background.png"));background.setBounds(0, 0, 470, 390);//给按钮及验证码内容管理器绑定事件rightCode.addMouseListener(this);passwordVisible.addMouseListener(this);loginButton.addMouseListener(this);registerButton.addMouseListener(this);//将图片、输入框及按钮添加到界面中this.getContentPane().add(usernameImage);this.getContentPane().add(usernameField);this.getContentPane().add(passwordImage);this.getContentPane().add(passwordVisible);this.getContentPane().add(passwordField);this.getContentPane().add(iCodeImage);this.getContentPane().add(iCodeField);this.getContentPane().add(rightCode);this.getContentPane().add(loginButton);this.getContentPane().add(registerButton);this.getContentPane().add(background);//刷新界面this.getContentPane().repaint();}//设置界面基础信息private void initJFrame() {//设置界面的宽高this.setSize(488, 430);//设置界面的标题this.setTitle("用户登录");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默认的居中放置this.setLocationRelativeTo(null);}//展示用户名或密码错误提示弹窗private void tipJDialog(String tip) {//创建弹窗JDialog tipJDialog = new JDialog();//设置弹窗大小tipJDialog.setSize(200, 150);//设置弹窗置顶tipJDialog.setAlwaysOnTop(true);//设置弹窗居中tipJDialog.setLocationRelativeTo(null);//设置弹窗不关闭无法操作下方界面tipJDialog.setModal(true);//添加提示内容JLabel tips = new JLabel(tip);tips.setBounds(0, 0, 200, 150);tipJDialog.getContentPane().add(tips);//使弹窗可见tipJDialog.setVisible(true);}//实现按钮的鼠标监听事件方法@Overridepublic void mouseClicked(MouseEvent e) {//获取点击的按钮Object source = e.getSource();//根据点击按钮不同,做出相应操作if (source == rightCode) {//更换一个新的验证码rightICode = ICodeUtil.getCode();rightCode.setText(rightICode);}}@Overridepublic void mousePressed(MouseEvent e) {//获取按下的按钮Object source = e.getSource();//根据按下按钮不同,做出相应操作if (source == passwordVisible) {//切换显示密码按钮的背景图片passwordVisible.setIcon(new ImageIcon("gigsawgame\\image\\login\\显示密码按下.png"));} else if (source == loginButton) {//切换登录按钮的背景图片loginButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\登录按下.png"));} else if (source == registerButton) {//切换注册按钮的背景图片registerButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\注册按下.png"));}}@Overridepublic void mouseReleased(MouseEvent e) {//获取松开的按钮Object source = e.getSource();//根据松开按钮不同,做出相应操作if (source == passwordVisible) {//恢复显示密码按钮的背景图片passwordVisible.setIcon(new ImageIcon("gigsawgame\\image\\login\\显示密码.png"));} else if (source == loginButton) {//获取用户输入的用户名,密码,验证码String username = usernameField.getText();String password = passwordField.getText();String iCode = iCodeField.getText();//判断验证码是否正确//判断用户名和密码是否为空//判断用户名、密码是否正确if (iCode.equalsIgnoreCase(rightICode)) {if (username.length() != 0 || password.length() != 0) {if (contains(username, password)){new GameJFrame();}else {tipJDialog("用户名或密码错误");}} else {tipJDialog("用户名或者密码为空");}} else {tipJDialog("验证码输入错误");//更换一个新的验证码rightICode = ICodeUtil.getCode();rightCode.setText(rightICode);}//恢复登录按钮的背景图片loginButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\登录按钮.png"));} else if (source == registerButton) {//恢复注册按钮的背景图片registerButton.setIcon(new ImageIcon("gigsawgame\\image\\login\\注册按钮.png"));}}//判断用户在集合中是否存在public boolean contains(String username, String password) {for (int i = 0; i < users.size(); i++) {if (username.equals(users.get(i).getUsername()) && password.equals(users.get(i).getPassword())) {return true;}}return false;}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}
}
3.注册界面
//创建注册界面
public class RegisterJFrame extends JFrame {//定义空参构造,对界面进行初始化public RegisterJFrame() {//初始化注册主界面initJFrame();//初始化图片及输入框}//设置界面基础信息private void initJFrame() {//设置界面的宽高this.setSize(488, 500);//设置界面的标题this.setTitle("用户注册");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默认的居中放置this.setLocationRelativeTo(null);//设置界面是否显示,建议写在最后this.setVisible(true);}
}
二、业务逻辑编写
1.用户类
public class User {//定义用户的属性private String username;private String password;//定义空参构造和带参构造public User() {}public User(String username, String password) {this.username = username;this.password = password;}//定义所有成员变量的get和set方法public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
2.生成验证码的工具类
public class ICodeUtil {//私有化空参构造private ICodeUtil() {}//定义静态方法getCode,获取验证码public static String getCode() {//创建获取随机数的对象Random r = new Random();//创建字符数组,存储验证码char[] code = new char[5];//随机添加一个数字code[0] = (char) (r.nextInt(10) + 48);//定义字符数组,存储大小写字母char[] letter = new char[52];//将大小写字母添加进letter字符数组for (int i = 0; i < letter.length; i++) {if (i >= 26) {letter[i] = (char) (97 + i - 26);} else {letter[i] = (char) (65 + i);}}//随机将大小写字母加入code字符数组for (int i = 1; i < code.length; i++) {code[i] = letter[r.nextInt(letter.length)];}//将数组中的字符打乱char temp;int index = 0;for (int i = 0; i < code.length; i++) {index = r.nextInt(code.length - 1);temp = code[i];code[i] = code[index];code[index] = temp;}return new String(code);}
}
三、游戏主入口
//程序的启动入口
public class App {public static void main(String[] args) {//想开启哪个界面,就创建谁的对象
// new RegisterJFrame();new LoginJFrame();
// new GameJFrame();}
}
四、游戏打包exe说明
说明文本及工具在百度网盘中。链接: https://pan.baidu.com/s/1QxUXy_1ksPxfZ5xYvJQwnQ?pwd=0806 提取码: 0806
若过期,请在评论区留言。
总结
拼图小游戏有助于了解Java的GUI相关知识,但在以后并不常用,了解即可。因此,该项目的重中之重还是游戏的业务逻辑,及对所学知识的巩固。
相关文章:
阶段项目——拼图小游戏
Java学习笔记(新手纯小白向) 第一章 JAVA基础概念 第二章 JAVA安装和环境配置 第三章 IntelliJ IDEA安装 第四章 运算符 第五章 运算符联系 第六章 判断与循环 第七章 判断与循环练习 第八章 循环高级综合 第九章 数组介绍及其内存图 第十章 数…...

基于本地消息表实现分布式事务(最终一致性)
前言 传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。 但是在微服务架构下,将一个应用拆分成了…...
大数据mapper书写范式hdfs
文章目录 1. 大数据mapper书写范式hdfs 1. 大数据mapper书写范式hdfs import json import sysdef read_input(input_stream):for line in input_stream:yield line.rstrip(\n)def load_json_data(json_line):try:data json.loads(json_line)unique_id data.get(id)combined_…...

ubuntu将软件放到任务栏
右键点击这个 pycharm 方法1: 方法2: sudo nano /usr/share/applications/PyCharm.desktop 编辑这个 [Desktop Entry] NamePyCharm CommentPyCharm Integrated Development Environment Exec/path/to/PyCharm.sh Icon/path/to/PyCharm.svg Terminalf…...

Spring Boot 参数校验 Validation 使用
概述 当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是必不可少的活。前、后端校验都是保证参数的准确性的手段之一,前端校验并不安全,任何人都可以通过接口来调用我们的服务,就算…...

基于el-table的表格点选和框选功能
开篇 本篇文章旨在实现一个基于el-table的表格点选和框选功能,除此之外,还支持多种模式的切换、自定义勾选日期等。且,该表格后续可能还会持续优化! 功能介绍 表格点选和框选功能(没有点击ctrl键的情况下)…...

LabVIEW压电陶瓷阻抗测试系统
开发了一种基于LabVIEW软件与PXI模块化仪器的压电陶瓷阻抗测试系统。该系统能在高电压工作条件下测量压电陶瓷的阻抗特性,包括阻抗模值与阻抗角的频率特性,为压电陶瓷的进一步分析与应用提供了重要参考。 项目背景 现有的阻抗测试仪大多只能在低电压条件…...

电销机器人能大幅度提升效率
1、安全稳定性能好 营销机器人的稳定性非常强,在使用性能方面会有更好的优势,而且用的过程中也可以不断的这些模块更新和功能升级,所以会不断的满足大家更多的使用要求,在操作使用的时候非常简单和方便,直接就可以给客…...

虚拟机能访问网页但ping不通百度
最近遇到了奇怪的问题,虚拟机能访问网页,但ping不通百度,记录一下问题的排查过程。 能访问网页,说明DNS、TCP和HTTP没有问题,ping不通,说明ICMP应该出了问题。 首先通过traceroute追踪报文的转发过程&…...
RK3588开发笔记-buildroot编译配置
目录 前言 一、buildroot简介 二、buildroot配置编译 buildroot config配置 buildroot 编译 buildroot 如何单独编译某个软件包 何时需要完全重建 如何完全重建 总结 前言 Rockchip RK3588 是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在…...

Java设计模式(适配器模式)
定义 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。 角色 目标抽象类(Target):目标抽象类定义客户所需的接口(在类适配器中,目标抽象类只能是接口)。 适配器类…...

机器学习框架巅峰对决:TensorFlow vs. PyTorch vs. Scikit-Learn实战分析
1.引言 1.1机器学习框架的重要性 在机器学习的黄金时代,框架的选择对于开发高效、可扩展的模型至关重要。合适的框架可以极大地提高开发效率,简化模型的构建和训练过程,并支持大规模的模型部署。因此,了解和选择最合适的机器学习…...

基于STM32的智能窗帘控制系统
目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家居智能窗帘控制办公室窗帘自动调节常见问题及解决方案 常见问题解决方案结论 1. 引言 智能窗帘控制系统能够通过时间、光照强度或远程控制,实现对…...

【算法】普里姆算法解决修路问题
应用场景——修路问题 1.某地有 7 个村庄(A,B,C,D,E,F,G),现在需要修路把 7 个村庄连通 2.各个村庄的距离用边线表示(权),比如 A - …...
Python 之Scikit-learn(二) -- Scikit-learn标准化数据
在机器学习中,数据标准化是一项关键的预处理步骤。标准化(Standardization)是将数据转换为具有均值为0和标准差为1的分布。这样可以确保特征在相同的尺度上,有助于提升某些机器学习算法的性能和稳定性。 Scikit-learn提供了一个简…...

机械学习—零基础学习日志(python编程)
零基础为了学人工智能,正在艰苦的学习 昨天给高等数学的学习按下暂停键,现在开始学习python编程。 我学习的思路是直接去阿里云的AI学习课堂里面学习。 整体感觉,阿里云的AI课堂还是有一些乱,早期课程和新出内容没有更新和归档…...

WEB应用(十三)---RCE
什么是RCE? Remote Command/Code Execute,远程命令或代码执行。通过构造特殊的字符串,将数据提交至Web应用程序,并利用该方式执行外部程序或系统命令实施攻击,类似于SQL注入。 Web应用程序使用了一些可以执行系统命令或…...
【云原生】Service服务暴露详细
Service服务 文章目录 Service服务一、Service介绍1.1、介绍1.2、Kubernetes中的Service 二、Service服务类型2.1、ClusterIP2.2、NodePort2.3、LadBalancer2.4、ExternalName 三、Service玩法3.1、定义Service3.2、端口定义别名3.3、多端口Service 四、Service类型4.1、Cluste…...
实名认证次数限制
在业务层实现实名认证次数限制 这个功能是通过以下步骤实现实名认证的次数限制: 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。成功认证后的限制࿱…...
【如何在Python中使用pathlib模块】
在Python中使用pathlib模块主要涉及创建Path对象,并利用这些对象提供的方法来执行文件系统的各种操作。以下是一些详细的步骤和示例,帮助你了解如何在Python中有效地使用pathlib模块。 1. 导入Path类 首先,从pathlib模块中导入Path类。 fr…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...