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.pswp.cn/news/162712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162712.shtml
英文地址,請注明出處:http://en.pswp.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…