java--拼图游戏

1、了解拼图游戏基本功能:

拼图游戏内容由若干小图像块组成的,通过鼠标点击图像块上下左右移动,完成图像的拼凑。

2、拼图游戏交互界面设计与开发:

通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 ,实现拼图游戏的基本功能。

3、图片的加载与分割:

使用Image类实现图片的缩放,ImageIO类实现图片的读写加载,通过接口类Icon,BufferedImage类获取BufferedImage类的对象实现图片分割。

4、图片随机打乱和交换:

产生随机数 Random rand=new Random();

           rand.nextInt(hs*ls)------[0,8]

具体操作:生成两个随机数表示数组下标,互换两个数组元素的位置,按钮的方法getX和getY可以获取按钮的坐标,利用按钮的单击事件的处理ActionListener可以使其图片交换。

5、判赢:

当用户移动按钮后进行判断,代码写在监听器的actionPerformed方法中,判断拼图是否成功,主要取决于每一个按钮通过索引下标获取的位置值,与当前按钮的位置值是否相同。

6、计时和计数功能的实现:

计时功能的实现主要是线程的设计,线程的定义方法:第一:继承Thread类,第二:实现Runnable接口,创建带实现接口的子类对象的Thread对象,MainJFrame实现Runnable接口,重写run方法;而计数则在主窗体中通过rp.times实现对变量的使用来计数。

7、游戏记录的保存:

当用户拼图成功后,记录当前信息到文件中,FileWriter追加写信息,FileReader完成读取数据。
 

游戏截图 

程序源代码

登录界面部分(用户名:admin  密码:123)

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;public class LoginPintu extends JFrame{JLabel jl1,jl2,jl3,jl4;JTextField jtf;//文本框JPasswordField jpf;//密码JButton jb1,jb2;public LoginPintu() {this.setTitle("拼图游戏");setBounds(400,350,500,400);//设置窗体为流式布局setLayout(new GridLayout(20,1));//空布局setLayout(null);init();setVisible(true);setDefaultCloseOperation(EXIT_ON_CLOSE);jb1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {if(jtf.getText().trim().equals("admin")&&new String(jpf.getPassword()).trim().equals("123")) {JOptionPane.showMessageDialog(null, "欢迎进入游戏!");new MainJFrame();}else if(jtf.getText().trim().length()==0||new String(jpf.getPassword()).trim().length()==0) {JOptionPane.showMessageDialog(null, "用户名或密码不能为空!");}else {JOptionPane.showMessageDialog(null, "用户名或密码错误!");}}});jb2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//	System.exit(0);//获取事件源对象JButton jb=(JButton)e.getSource();jtf.setText(jb.getText());}});}public void init() {jl1=new JLabel("拼图游戏登录窗口");jl2=new JLabel("用户名:");jl3=new JLabel("密码:");jtf=new JTextField(10);jpf=new JPasswordField(10);jb1=new JButton("登录");jb2=new JButton("取消");jl1.setBounds(150,30,200,60);jl2.setBounds(100, 120, 180, 30);jtf.setBounds(200, 120, 180, 30);jl3.setBounds(100, 180, 180, 30);jpf.setBounds(200, 180, 180, 30);jb1.setBounds(100, 260, 100, 30);jb2.setBounds(220, 260, 100, 30);Font font = new Font("楷体",Font.PLAIN,25);jl1.setFont(font);jl1.setForeground(Color.red);add(jl1);add(jl2);add(jtf);add(jl3);add(jpf);add(jb1);add(jb2);
}
public static void main(String[] args) {new LoginPintu(); }
}

 左面板部分

import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
//左面板类
public class LeftJPanel extends JPanel {JLabel  jl;int width=700;int height=700;//构造方法//标签创建,指定图片,放置到面板中public LeftJPanel(){//左面板大小setSize(width,height);jl=new JLabel();jl.setSize(width,height);//把标签添加到面板中this.add(jl);}public void init(URL url){//绝对路径:访问文件是从盘符开始// ImageIcon icon=new ImageIcon("D:\\1picture\\s4.jpg");//相对路径:访问路径不是从盘符开始,可以是\,也可以是一个文件夹// ImageIcon icon=new ImageIcon("s4.jpg");//参数是字符串的相对路径,相对于当前项目根目录//相对路径下url的获取//	   //绝对路径的url的获取
//	   URL url=null;
//	try {
//		url = new URL("file:\\D:\\1picture\\5.jpg");
//	} catch (MalformedURLException e) {
//		// TODO Auto-generated catch block
//		e.printStackTrace();
//	}ImageIcon icon=new ImageIcon(url);//方法一:图片缩放
//	   Image image = icon.getImage();
//	   Image image2 = image.getScaledInstance(700, 700, 1);
//	   ImageIcon icon2 = new ImageIcon(image2);
//	   jl.setIcon(icon2);//链式编程方式实现图片缩放jl.setIcon(new ImageIcon(icon.getImage().getScaledInstance(width, height, 1)));//刷新界面validate();}
}

 右面板部分

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.Random;import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;import jdk.jfr.events.FileWriteEvent;
//右面板实现ActionListener接口,右面板也就成为了监听器
public class RightJPanel extends JPanel implements ActionListener{//面板的大小int width=700;int height=700;//定义按钮数组JButton[] jbs;//设置分割的行列数int hs=2,ls=2;//按钮的宽度和高度,指定是小图图片缩放的尺寸int widthbut,heightbut;//图片原始高度宽度int widthtp,heighttp;//小图的原始宽度高度int widthxt,heightxt;//实现步数计算的变量int times;//空白按钮JButton kb;public RightJPanel(){//面板布局是空布局setLayout(null);setSize(width,height);//init();}//创建按钮,并放置到右面板public void init(URL url) {//面板组件初始化前,先清除所有已有的组件this.removeAll();//创建按钮数组jbs=new JButton[hs*ls];//为每一个按钮实现初始化//计算按钮的宽度和高度//面板是700*700,拆分成3*3的9个区域//每一块区域的宽度  700/3//每一块区域的高度 700/3widthbut=width/ls;heightbut=height/hs;BufferedImage buf=null;try {buf = ImageIO.read(url);//获取原图的宽度、高度widthtp=buf.getWidth();heighttp=buf.getHeight();//获取小图的宽度和高度widthxt=widthtp/ls;heightxt=heighttp/hs;//每一块按钮的坐标位置确定for(int i=0;i<jbs.length;i++){jbs[i]=new JButton();jbs[i].setSize(widthbut,heightbut);//jbs[i].setText(i+"");//添加按钮前要确定坐标位置//横坐标 i=0   0    i=1   233    i=2   466//i=3   0   i=4  233//纵坐标 i=3jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);//jbs[i].setIcon(null);//小图的获取BufferedImage subimage = buf.getSubimage(i%ls*widthxt, i/ls*heightxt, widthxt, heightxt);//小图的缩放Image image = subimage.getScaledInstance(widthbut, heightbut, 1);//将小图图片放置到按钮上jbs[i].setIcon(new ImageIcon(image));//添加按钮到右面板add(jbs[i]);//设置按钮不可用jbs[i].setEnabled(false);//设置按钮的监听,当按钮被单击,会到右面板中找actionPerformed方法执行jbs[i].addActionListener(this);}jbs[hs*ls-1].setIcon(null);kb=jbs[hs*ls-1];} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//打乱按钮在面板中显示的顺序public void randomOrder(){//创建随机数对象Random rand=new Random();//打乱多次for(int i=0;i<hs*ls;i++){//随机索引int index1=rand.nextInt(hs*ls);int index2=rand.nextInt(hs*ls);int x1=jbs[index1].getX();int y1=jbs[index1].getY();int x2=jbs[index2].getX();int y2=jbs[index2].getY();jbs[index1].setLocation(x2, y2);jbs[index2].setLocation(x1, y1);jbs[i].setEnabled(true);}}//按钮的单击事件执行的代码@Overridepublic void actionPerformed(ActionEvent e) {// 判断单击按钮和空白按钮是否相邻,如果相邻,则位置互换//获取用户单击的按钮 ,通过ActionEvent e的方法gerSource获取事件源JButton jb=(JButton)(e.getSource());//获取单击按钮和空白按钮的坐标int x1=jb.getX();int y1=jb.getY();int x2=kb.getX();int y2=kb.getY();//判断是否可以移动//Math.abs(x1-x2)/widthbut + Math.abs(y1-y2)/heightbut==1if (Math.abs(x1-x2)/widthbut + Math.abs(y1-y2)/heightbut==1){jb.setLocation(x2, y2);kb.setLocation(x1, y1);times++;}//判断是否拼图成功if (isWin()){JOptionPane.showMessageDialog(null, "恭喜你,拼图成功");//使得按钮不可用for(int i=0;i<jbs.length;i++){jbs[i].setEnabled(false);}//提示用户输入名称//使用输入对话框String name = JOptionPane.showInputDialog("请输入你的姓名:");String info = hs+"*"+ls+"拼图记录:"+name+"的步数是:"+times+"\r\n";JOptionPane.showMessageDialog(null, hs+"*"+ls+"拼图记录:"+name+"的步数是:"+times+"\r\n");try {FileWriter fw = new FileWriter("D:\\游戏记录.dat",true);fw.write(info);fw.close();}catch (IOException e1) {e1.printStackTrace();}}}//判断是否拼图成功public boolean isWin() {//获取每一个按钮的坐标for(int i=0;i<jbs.length;i++){//jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);由之前坐标设置给出下面的x,yint x=jbs[i].getX()/widthbut;int y=jbs[i].getY()/heightbut;//判断,通过下标值,也可以获取按钮的坐标   横坐标  i%ls    纵坐标 i/lsif (i%ls!=x || i/ls!=y  ){return false;}}return true;}
}

游戏功能部分

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.filechooser.FileNameExtensionFilter;public class MainJFrame extends JFrame implements Runnable{//菜单//菜单栏JMenuBar jmenubar;//菜单  菜单、等级、帮助JMenu menu,menuclass,menuhelp;//菜单项  开始、退出、图片更换、关于游戏、游戏记录、清空记录JMenuItem itembegin,itemend,itemchange,itemabout,itemrecord,itemclear;//单选菜单项  简单、一般、困难JRadioButtonMenuItem itemeasy,itemnormal,itemhard;//中间面板JPanel jp;//左面板LeftJPanel lp;//右面板RightJPanel rp;//访问的图片URL url;//显示计时标签JLabel total_time;//起止时间long startTime,endTime;//创建线程对象,实现计时功能Thread th;//显示步数的标签JLabel total_count;//构造方法public MainJFrame(){//标题设置setTitle("拼图游戏");//窗体大小setSize(1440, 780);//窗体位置在容器/屏幕的正中间setLocationRelativeTo(null);//窗体大小不可变setResizable(false);//实现界面菜单初始化//创建一个线程对象th=new Thread(this);//界面菜单初始化menuinit();//各面板的初始化init();setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);//开始菜单itembegin.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//启动线程//如果线程没有启动,则调用start方法启动if(!th.isAlive()) th.start();startTime=System.currentTimeMillis();rp.times=0;rp.randomOrder();}});//结束游戏itemend.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(1);}});//选择难易度itemeasy,itemnormal,itemharditemeasy.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//第一,传递2*2到右面板rp.hs=2;rp.ls=2;//第二,调用右面板组件初始化的方法rp.init(url);}});itemnormal.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//第一,传递3*3到右面板rp.hs=3;rp.ls=3;//第二,调用右面板组件初始化的方法rp.init(url);}});itemhard.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//第一,传递4*4到右面板rp.hs=4;rp.ls=4;//第二,调用右面板组件初始化的方法rp.init(url);}});//游戏记录显示itemrecord.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//info存储要显示的内容String info="";try {//判断文件是否存在File f = new File("D:\\游戏记录.dat");if(f.exists()) {//创建指向***的文件字符输入流对象FileReader fr = new FileReader("D:\\游戏记录.dat");//读取数据char[] chs = new char[1024];int len;while((len=fr.read(chs))!=-1) {//读取的结果放在info中info+=new String(chs,0,len);}fr.close();//通过消息框显示结果JOptionPane.showMessageDialog(null, info);}else {JOptionPane.showMessageDialog(null, "游戏记录为空!");}}catch (IOException e1) {e1.printStackTrace();}}});//关于游戏itemabout.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(null, "关于拼图游戏\r\n版本:v2.0\r\n作者:LWL\r\n欢迎进入游戏!");}});//清空记录itemclear.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {File f = new File("D:\\游戏记录.dat");if(f.exists()) {f.delete();}}});//实现图片的更换itemchange.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//显示一个打开对话框,选择一个图片文件,将文件转换成url对象,调用左右面板的相应方法JFileChooser jfc=new JFileChooser();//设置文件的扩展名jfc.setFileFilter(new FileNameExtensionFilter("图片格式(jpg|png|gif|jpeg)", "jpg","png","gif","jpeg"));//弹出打开对话框int sd = jfc.showOpenDialog(MainJFrame.this);if (sd==jfc.APPROVE_OPTION)//如果用户选择了打开按钮{//获取用户选择的文件完整名称String file=jfc.getSelectedFile().getAbsolutePath();try {url=new URL("file:\\"+file);//更新两个面板的图片lp.init(url);rp.init(url);} catch (MalformedURLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});}public void init() {jp=new JPanel();//设置中间面板的布局方式jp.setLayout(new GridLayout(1,2));//提供左右面板的图片url=this.getClass().getResource("小狗.jpg");//创建左面板lp=new LeftJPanel();//对标签初始化lp.init(url);//将左面板添加到中间面板jp.add(lp);//创建右面板rp=new RightJPanel();//右面板的按钮初始化rp.init(url);//将右面板添加到中间面板jp.add(rp);//将中间面板添加到窗体add(jp);}public void menuinit() {jmenubar=new JMenuBar();menu=new JMenu("菜单");menuclass=new JMenu("等级");menuhelp=new JMenu("帮助");itembegin=new JMenuItem("开始游戏");itemend=new JMenuItem("结束游戏");itemchange=new JMenuItem("更换图片");itemabout=new JMenuItem("关于游戏");itemrecord=new JMenuItem("游戏记录");itemclear=new JMenuItem("清空记录");itemeasy=new JRadioButtonMenuItem("简单");itemnormal=new JRadioButtonMenuItem("一般");itemhard=new JRadioButtonMenuItem("困难");//为单选菜单分组,实现多选一ButtonGroup bg=new ButtonGroup();bg.add(itemeasy);bg.add(itemnormal);bg.add(itemhard);//添加菜单menu.add(itembegin);menu.add(itemend);menu.add(itemchange);menuclass.add(itemeasy);menuclass.add(itemnormal);menuclass.add(itemhard);menuhelp.add(itemabout);menuhelp.add(itemrecord);menuhelp.add(itemclear);jmenubar.add(menu);jmenubar.add(menuclass);jmenubar.add(menuhelp);//菜单栏添加到窗体this.setJMenuBar(jmenubar);itemeasy.setSelected(true);//创建一个线程对象th=new Thread(this);total_time=new JLabel("用时:");total_time.setForeground(Color.red);jmenubar.add(new JLabel("                    "));jmenubar.add(total_time);total_count=new JLabel("步数:");total_count.setForeground(Color.red);jmenubar.add(new JLabel("                    "));jmenubar.add(total_count);}public static void main(String[] args) {new MainJFrame();}//实现计时并定时显示的run()方法@Overridepublic void run() {while(true) {endTime=System.currentTimeMillis();total_time.setText("用时:"+(endTime-startTime)/1000+"秒");total_count.setText("步数:第"+rp.times+"步");try {Thread.sleep(500);}catch (InterruptedException e) {e.printStackTrace();}}}
}

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

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

相关文章

java 实现串口通讯

1、引入依赖 <dependency><groupId>org.scream3r</groupId><artifactId>jssc</artifactId><version>2.8.0</version> </dependency>2、配置启动串口 Component public class ContextHolder implements ApplicationContextAw…

使用共享内存进行通信的代码和运行情况分析,共享内存的特点(拷贝次数,访问控制),加入命名管道进行通信的代码和运行情况分析

目录 示例代码 头文件(comm.hpp) log.hpp 基础版 -- 服务端 代码 运行情况 加入客户端 代码 运行情况 两端进行通信 客户端 代码 注意点 服务端 代码 两端运行情况 共享内存特点 拷贝次数少 管道的拷贝次数 共享内存的拷贝次数 没有访问控制 管道 共享…

神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!

分类 互联网 在 ChatGPT 问世之前&#xff0c;我们的编码方式很多时候都是面向搜索引擎编码&#xff0c;需要不断地进行搜索&#xff0c;然后复制粘贴&#xff0c;俗称复制粘贴工程师。 但是&#xff0c;随着ChatGPT的出现&#xff0c;这一切将彻底改变。 ChatGPT 是一种基于…

AI工具合集

网站&#xff1a;未来百科 | 为发现全球优质AI工具产品而生 (6aiq.com) 如今&#xff0c;AI技术涉及到了很多领域&#xff0c;比如去水印、一键抠图、图像处理、AI图像生成等等。站长之家之前也分享过一些&#xff0c;但是在网上要搜索找到它们还是费一些功夫。 今天发现了一…

STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别

背景 前段时间开发一个按键板驱动&#xff0c;该板用的STM32F103系列单片机&#xff0c;前任工程师用STM32CubeMX生成的工程&#xff0c;里面全是HAL库调用&#xff0c;我接手后&#xff0c;学习了下HAL库的用法&#xff0c;踩坑不少&#xff0c;特别是带IT后缀的函数&#xf…

【左程云算法全讲11】贪心算法 并查集

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

电子电器架构 —— 车载网关边缘节点总线转换

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数3000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…

系列十、你说你做过JVM调优和参数配置,请问如何盘点JVM系统的默认值?

一、JVM的参数类型 1.1、标配参数 java -versionjava -help 1.2、XX参数 1.2.1、Boolean类型 公式&#xff1a;-XX:或者- 某个属性值 表示开启、-表示关闭 # 是否打印GC收集细节 -XX:PrintGCDetails -XX:-PrintGCDetails# 是否使用串行垃圾收集器 -XX:UseSerialGC -XX:-UseS…

使用FFmpeg合并多个ts视频文件转为mp4格式

前言 爬取完视频发现都是ts文件&#xff0c;而且都是几百KB的视频片段&#xff0c;.ts 全名叫&#xff1a;MPEG Transport Stream&#xff0c;它是一个万能的多媒体容器&#xff0c;可以装下音频、视频、字幕。有时我们需要将.ts文件转换为其他更加广泛被支持的格式&#xff0…

springboot项目中没有识别到yml文件解决办法

springboot项目中没有识别到yml文件解决办法 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传] 1、这个意思就是没有配置数据库的数据源路径。所以需要配置数据源&#xff0c;比如mysql的驱动和路径。检查是否在properties或者yml文件中是否已经配置好。…

简单的用Python实现一下,采集某牙视频,多个视频翻页下载

前言 表弟自从学会了Python&#xff0c;每天一回家就搁那爬视频&#xff0c;不知道的以为是在学习&#xff0c;结果我昨天好奇看了一眼&#xff0c;好家伙&#xff0c;在那爬某牙舞蹈区&#xff0c;太过分了&#xff01; 为了防止表弟做坏事&#xff0c;我连忙找了个凳子坐下&…

图像分类(四) 全面解读复现GoogleNet_InceptionV1-V4

论文解读 InceptionV1 前言 论文题目: Going Deeper with Convolutions Googlenet论文原文地址:https://arxiv.org/pdf/1409.4842.pdf 之前看过VGG的论文&#xff08;VGG精读直达&#xff09;。当时VGG获得了 2014 ILSVRC 图像分类的第二名&#xff0c;今天来看一下第一名…

Yolov5

Yolov5 Anchor &#xff11;&#xff0e;Anchor是啥&#xff1f; anchor字面意思是锚&#xff0c;是个把船固定的东东&#xff08;上图&#xff09;&#xff0c;anchor在计算机视觉中有锚点或锚框&#xff0c;目标检测中常出现的anchor box是锚框&#xff0c;表示固定的参考框…

基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于金鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于金鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

使用Qt实现多人聊天工作室

目录 1、项目背景 2、技术分析 3、架构设计 3、1 服务器架构 3.1.1 模块划分 3.1.2 模块之间的交互 3、2 客户端架构 3.2.1 模块划分 3.2.2 模块之间交互 4、实现过程 4、1 功能实现 4.1.1 用户登录注册功能​编辑 4.1.2 用户主界面功能 4、2 设计实现 4.2.1 登录…

关于Flume-Kafka-Flume的模式进行数据采集操作

测试是否连接成功&#xff1a; 在主节点flume目录下输入命令: bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.loggerinfo,console # 这个file_to_kafka.conf文件就是我们的配置文件 然后在另一台节点输入命令进行消费数据&#xff1a; kafka-cons…

SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段

SQL INSERT INTO 语句用于在表中插入新记录。 INSERT INTO 语法 可以以两种方式编写INSERT INTO语句&#xff1a; 指定要插入的列名和值&#xff1a; INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);如果要为表的所有列添加值&#xff0c;则无需在SQL…

超详细vue3选项式父子组件传值

一、问题背景 最近遇到了一个情景&#xff1a; 子组件干完事情&#xff0c;需要对父组件的变量进行更新&#xff0c;因为父组件将该变量传递给子组件&#xff0c;但是不会双向绑定&#xff0c;这时候我们就需要传值或者触发回调去解决这个问题 我们将分为两个部分 1.父组件传…

力扣hot100 两数之和 哈希表

&#x1f468;‍&#x1f3eb; 力扣 两数之和 &#x1f60b; 思路 在一个数组中如何快速找到某一个数的互补数&#xff1a;哈希表 O(1)实现⭐ AC code class Solution {public int[] twoSum(int[] nums, int target){HashMap<Integer, Integer> map new HashMap<&g…

【机器学习12】集成学习

1 集成学习分类 1.1 Boosting 训练基分类器时采用串行的方式&#xff0c; 各个基分类器之间有依赖。每一层在训练的时候&#xff0c; 对前一层基分类器分错的样本&#xff0c; 给予更高的权重。 测试时&#xff0c; 根据各层分类器的结果的加权得到最终结果。 1.2 Bagging …