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完成读取数据。

实现代码

 
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.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/162712.shtml

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

相关文章

外贸自建站服务器怎么选?网站搭建的工具?

外贸自建站服务器用哪个好&#xff1f;如何选海洋建站的服务器&#xff1f; 外贸自建站是企业拓展海外市场的重要手段之一。而在这个过程中&#xff0c;选择一个适合的服务器对于网站的稳定运行和优化至关重要。海洋建站将为您介绍如何选择适合的外贸自建站服务器。 外贸自建…

CSDN如何完整转载别人的文章并做自己的笔记

1、这篇文章介绍主体的转载&#xff08;粘贴&#xff09;方法&#xff1a; 转载&#xff1a;CSDN快速转载文章方法&#xff08;简单&#xff09;_csdn转载_biggolden1的博客-CSDN博客 2、这篇文章解决&#xff0c;对于含有代码块的文章粘贴后&#xff0c;出现的额外行号块问题…

【STM32外设系列】GPS定位模块(ATGM336H)

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、GPS模块简介二、使用方法2.1 引脚介绍2.2 数据帧介绍2.3 关于不同的启动方式 三、前置知识3.1 strstr函数3.2…

DevSecOps 的未来

采用 可以做的事情还有很多。您编码和构建的内容是您看到嵌入 CI/CD 管道的大部分进展的地方。随着世界在不同的云环境中变得更加由 API 驱动&#xff0c;我们将考虑如何将安全角度嵌入到所有这些事物中&#xff0c;无论平台如何构建。这是一个涉及人员的工作流程。您做得越多&…

基于H1ve一分钟搭好CTF靶场

写在前面 ◉ ‿ ◉ 上一篇文章给大家详细介绍了基于H1ve搭建CTF靶场&#xff0c;以及过程中可能遇到的报错及解决方法&#xff0c;那么这篇文章&#xff0c;我总结了一下&#xff0c;将不会遇到报错的方法给到大家&#xff0c;但是前提是你的服务器最好是一个全新的哦~~~ 我…

Qt框架学习(1)

1.安装Qt官网 2.Qt中的快捷键 快捷键解释F4头文件和实现文件切换ShiftF2变量:跳转到声明;函数:跳转到定义;F5调试程序F3查找下一个CtrlShiftR修改所有选中的名称F10单步(略过)调试,执行当前程序语句F11单步(跟踪)调试,如果有函数则进入函数F9设置\取消断点CtrlShiftS保存所有文…

C++基础从0到1入门编程(四)类和对象

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; C基础从0到1入门编程&#xff08;三&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心…

Spring boot @Bean

Bean 是 Spring 框架中的一个注解&#xff0c;它的作用是将一个方法标记为 Spring 容器中的一个 Bean。具体来说&#xff0c;当你在一个类中使用 Bean 注解修饰一个方法时&#xff0c;这个方法将会在 Spring 容器中执行&#xff0c;并且返回的对象也会被 Spring 容器管理。 Be…

香蕉派BPI-M4 Zero单板计算机采用全志H618,板载2GRAM内存

Banana Pi BPI-M4 Zero 香蕉派 BPI-M4 Zero是BPI-M2 Zero的最新升级版本。它在性能上有很大的提高。主控芯片升级为全志科技H618 四核A53, CPU主频提升25%。内存升级为2G LPDDR4&#xff0c;板载8G eMMC存储。它支持5G WiFi 和蓝牙, USB接口也升级为type-C。 它具有与树莓派 …

23. 深度学习 - 多维向量自动求导

Hi, 你好。我是茶桁。 前面几节课中&#xff0c;我们从最初的理解神经网络&#xff0c;到讲解函数&#xff0c;多层神经网络&#xff0c;拓朴排序以及自动求导。 可以说&#xff0c;最难的部分已经过去了&#xff0c;这节课到了我们来收尾的阶段&#xff0c;没错&#xff0c;生…

Android定位make有哪些target $ mgrep “build“ |grep target |grep image

环境 $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Gold 5122 CPU 3.60GHz stepping : 4 microcode : 0x2006e05 cpu MHz : 1200.086 cache…

大模型训练效率提升至2.6倍,腾讯Angel机器学习框架升级

在算力紧缺的背景下&#xff0c;如何提升大模型训练和推理的效率&#xff0c;并降低成本&#xff0c;成为业界关注的焦点。 11月23日&#xff0c;腾讯披露&#xff0c;腾讯混元大模型背后的自研机器学习框架Angel再次升级&#xff0c;大模型训练效率提升至主流开源框架的2.6倍…

SQL Server删除重复数据只保留一条

介绍 最近在导入数据库数据, 有时候给的数据源文件,存在重复数据, 需要清除但是还需要保留一条记录的需求. 本文将介绍如何使用SQL Server来实现这个需求。 流程 下面是实现删除重复数据的流程&#xff0c;我们可以用表格展示每个步骤&#xff1a; 步骤 描述 步骤一 先…

算法通关村第十二关-白银挑战字符串经典题目

大家好我是苏麟 , 今天带来字符串相关的题目 . 大纲 反转问题字符串反转K个一组反转仅仅反转字母反转字符串中的单词 反转问题 字符串反转 描述 : 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s的形式给出。 题目 : LeetCode 344. 反转…

webshell之扩展免杀

由于很多企业为了防止源码泄露&#xff0c;都会使用加密扩展将代码进行加密&#xff0c;那么我们就可以就将计就计&#xff0c;将webshell也利用扩展加密&#xff0c;将特征消除&#xff0c;从而达到免杀的效果 1.php-beast 扩展地址 下载dll&#xff0c;并添加至ext中 在php…

优化数据分析——理解与运用各类指标

写在开头 数据分析在当今信息时代扮演着至关重要的角色&#xff0c;而指标则是我们理解数据、揭示模式、支持决策的关键工具。本文将深入讨论各类指标的应用场景和解读方法&#xff0c;以帮助更全面、深入地理解数据。 1. 中心趋势指标 1.1 均值&#xff1a;更深层次的理解 …

MySQL中自增id用完怎么办?

MySQL中自增id用完怎么办&#xff1f; MySQL里有很多自增的id&#xff0c;每个自增id都是定义了初始值&#xff0c;然后不停地往上加步长。虽然自然数是没有上限的&#xff0c;但是在计算机里&#xff0c;只要定义了表示这个数的字节长度&#xff0c;那它就有上限。比如&#…

【2023持续更新】网络安全工程师常用工具集合

文章目录 SQL注入检测 SQL注入检测 https://github.com/r0oth3x49/ghauri

python数据结构与算法-15_堆与堆排序

堆(heap) 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;中间又穿插了一把树和二叉树&#xff0c; 本章我们开始介绍另一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序&#xff0c;相比前两种排序算法要稍难实现一些。 最后我…

Linux开发工具(含gdb调试教程)

文章目录 Linux开发工具&#xff08;含gdb调试教程&#xff09;1、Linux 软件包管理器 yum2、Linux开发工具2.1、Linux编辑器 -- vim的使用2.1.1、vim的基本概念2.1.2、vim的基本操作2.1.3、vim正常模式命令集2.1.4、vim末行模式命令集 2.2、vim简单配置 3、Linux编译器 -- gcc…