做网站和做推广有什么区别/传统营销与网络营销的整合方法

做网站和做推广有什么区别,传统营销与网络营销的整合方法,家用电脑和宽带做网站,手机排行榜2023前十名绘制页面 首先绘制指定宽和高的窗体 JFrame frame new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗…

绘制页面

首先绘制指定宽和高的窗体

        JFrame frame = new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置frame.setLocationRelativeTo(null);frame.setVisible(true);

这里的窗体就是上一章的代码,其中为了让游戏一直在我们屏幕的最上层,使用了setAlwaysOnTop方法;并且想让游戏开始时就在屏幕的居中位置,使用了setLocationRelativeTo方法。

效果:

绘制背景

图像用JLabel里的ImageIcon添加就可以,那么是先添加石头方块还是先添加背景图呢

应该是先添加石头方块,因为在同一重叠区域内,后添加的JLabel会放在图层最底下

确定第一块石头的坐标(46,50)和大小(100,100);我们就可以添加所有的石头方块了,先手动添加

public class GameWidget {public static void main(String[] args) {JFrame frame = new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置frame.setLocationRelativeTo(null);//取消默认布局frame.setLayout(null);//第一个方块左边是(50,90)JLabel label0 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\0.png"));label0.setBounds(50,90,100,100);frame.getContentPane().add(label0);JLabel label1 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\1.png"));label1.setBounds(150,90,100,100);frame.getContentPane().add(label1);JLabel label2 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\2.png"));label2.setBounds(250,90,100,100);frame.getContentPane().add(label2);JLabel label3 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\3.png"));label3.setBounds(350,90,100,100);frame.getContentPane().add(label3);JLabel label4 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\4.png"));label4.setBounds(50,190,100,100);frame.getContentPane().add(label4);JLabel label5 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\5.png"));label5.setBounds(150,190,100,100);frame.getContentPane().add(label5);JLabel label6 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\6.png"));label6.setBounds(250,190,100,100);frame.getContentPane().add(label6);JLabel label7 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\7.png"));label7.setBounds(350,190,100,100);frame.getContentPane().add(label7);JLabel label8 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\8.png"));label8.setBounds(50,290,100,100);frame.getContentPane().add(label8);JLabel label9 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\9.png"));label9.setBounds(150,290,100,100);frame.getContentPane().add(label9);JLabel label10 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\10.png"));label10.setBounds(250,290,100,100);frame.getContentPane().add(label10);JLabel label11 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\11.png"));label11.setBounds(350,290,100,100);frame.getContentPane().add(label11);JLabel label12 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\12.png"));label12.setBounds(50,390,100,100);frame.getContentPane().add(label12);JLabel label13= new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\13.png"));label13.setBounds(150,390,100,100);frame.getContentPane().add(label13);JLabel label14 = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\14.png"));label14.setBounds(250,390,100,100);frame.getContentPane().add(label14);JLabel label15= new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\15.png"));label15.setBounds(350,390,100,100);frame.getContentPane().add(label15);JLabel label = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));label.setBounds(26,30,450,484);frame.getContentPane().add(label);//设置窗口可见frame.setVisible(true);

 效果为

 


代码优化

二维数组加循环嵌套

我们可以将图像从0到15共16个数字作为二维数组的索引,0,1,2,3为第一行;这样我们在后续调用图像的时候,图像路径直接调用data[i][j]就可以了。

        JFrame frame = new JFrame();frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setSize(514,595);frame.setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层frame.setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置frame.setLocationRelativeTo(null);//取消默认布局frame.setLayout(null);//用二维数组记录图像的idint[][] data= {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};for(int i=0;i<4;i++){for(int j=0;j<4;j++){//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\"+data[i][j]+".png"));imagelabel.setBounds(100*j+50,100*i+90,100,100);frame.getContentPane().add(imagelabel);}}//加背景图像JLabel bglabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));bglabel.setBounds(26,30,450,484);frame.getContentPane().add(bglabel);//设置窗口可见frame.setVisible(true);

我们把行数看做i,列数看做j;可以看见我们每个方块的坐标其实可以用j*100+50和i*100+50表示。


继承优化

为了方便我们自己添加后续的功能,我们可以自己创建一个窗口类去继承JFrame

public class MainFrame extends JFrame {}

 继承好JFrame后,我们可以把之前的代码粘贴过来,并且把所有关于窗体的代码放在一个方法里面,所有绘制石头的代码放在一个方法里面

    public void paintStone(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\"+data[i][j]+".png"));imagelabel.setBounds(100*j+50,100*i+90,100,100);frame.getContentPane().add(imagelabel);}}//加背景图像JLabel bglabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));bglabel.setBounds(26,30,450,484);frame.getContentPane().add(bglabel);}

这里我们会发现frame会报错,但是不需要将其添加为成员变量;因为我们继承了JFrame,JFrame类中的方法我们都有,所以我们可以将frame变成super,而且我们并没有对父类JFrame中的方法进行重写,所以super可以省略,最终两个方法代码为:

public class MainFrame extends JFrame {//用二维数组记录图像的idint[][] data= {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};public void widgetInit(){setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setSize(514,595);setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置setLocationRelativeTo(null);//取消默认布局setLayout(null);//设置窗口可见setVisible(true);}public void paintStone(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\"+data[i][j]+".png"));imagelabel.setBounds(100*j+50,100*i+90,100,100);getContentPane().add(imagelabel);}}//加背景图像JLabel bglabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));bglabel.setBounds(26,30,450,484);getContentPane().add(bglabel);}

 我们希望两个方法+窗口visible显示在这个Mainframe创建对象的时候就显示,那么我们可以写入构造函数中

    public MainFrame() {widgetInit();paintStone();//设置窗口可见setVisible(true);}

我们在test文件中创建Mainframe的对象,进行测试,效果正常。


打乱石头方块

我们只需要对二维数组中的索引进行打乱就可以

使用random.nextInt(4)分别作为当前二维数组元素要交换的索引下标的行数和列数,遍历一遍二维数组,进行交换就可以

    public void dataInit(){Random rand = new Random();for(int i=0;i<4;i++){for(int j=0;j<4;j++){int x=rand.nextInt(4);int y=rand.nextInt(4);int temp=data[x][y];data[x][y]=data[i][j];data[i][j]=temp;}}}

效果为


移动业务

首先要给我们的窗体增加键盘输入上下左右的监听

        //之前的键盘监听格式是窗口对象frame.addKeyListener(KeyListener的实现类)//第一个this是代表本类MainFrame的对象//第二个this代表实现类KeyListener的对象this.addKeyListener(this);

像这段代码中注释所示,为了不让我们的代码更加繁琐,我们可以用this(代表本类的对象)去分别代表窗体Mainframe类的对象以及实现类KeyListener的对象去加入键盘的监听事件。

接下来系统会提示我们对实现类中的方法进行重写,我们挑选KeyPressed方法进行重写,并利用getKeyCode去调用我们要实现的移动业务方法move

    public void move(int keyCode){if (keyCode == 37) {System.out.println("左移动业务代码执行");} else if (keyCode == 38) {System.out.println("上移动业务代码执行");} else if (keyCode == 39) {System.out.println("右移动业务代码执行");} else if (keyCode == 40) {System.out.println("下移动业务代码执行");}}@Overridepublic void keyPressed(KeyEvent e) {//判断键盘输入是否为上下左右,对应移动业务int keyCode = e.getKeyCode();move(keyCode);}

 寻找零号元素

    public void dataInit(){Random rand = new Random();for(int i=0;i<4;i++){for(int j=0;j<4;j++){int x=rand.nextInt(4);int y=rand.nextInt(4);int temp=data[x][y];data[x][y]=data[i][j];data[i][j]=temp;}}//找到0号元素for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]==0){xindex=i;yindex=j;break;}}}}

这里的两个零号元素需要作为成员变量,因为还有move方法要调用


进行判断并移动位置

public class MainFrame extends JFrame implements KeyListener {public MainFrame() {//之前的键盘监听格式是窗口对象frame.addKeyListener(KeyListener的实现类)//第一个this是代表本类MainFrame的对象//第二个this代表实现类KeyListener的对象this.addKeyListener(this);//初始化窗口widgetInit();//打乱石头顺序dataInit();//绘制石头方块paintStone();//设置窗口可见setVisible(true);}//记录零号元素int xindex;int yindex;//用二维数组记录图像的idint[][] data= {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};public void dataInit(){Random rand = new Random();for(int i=0;i<4;i++){for(int j=0;j<4;j++){int x=rand.nextInt(4);int y=rand.nextInt(4);int temp=data[x][y];data[x][y]=data[i][j];data[i][j]=temp;}}//找到0号元素for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]==0){xindex=i;yindex=j;break;}}}}public void widgetInit(){setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setSize(514,595);setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置setLocationRelativeTo(null);//取消默认布局setLayout(null);}public void paintStone(){//为了刷新,我们要先清空之前的Label,要不然直接调用这个方法会放在图层的最底下,不能显示getContentPane().removeAll();for(int i=0;i<4;i++){for(int j=0;j<4;j++){//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\"+data[i][j]+".png"));imagelabel.setBounds(100*j+50,100*i+90,100,100);getContentPane().add(imagelabel);}}//加背景图像JLabel bglabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));bglabel.setBounds(26,30,450,484);getContentPane().add(bglabel);//remove后需要repaint进行label的刷新getContentPane().repaint();}public void move(int keyCode){if (keyCode == 37) {//判断是不是在最右边,不是的话,右边的石头方块就会向左移动if(yindex!=3){int temp=data[xindex][yindex];data[xindex][yindex]=data[xindex][yindex+1];data[xindex][yindex+1]=temp;yindex++;}System.out.println("左移动业务代码执行");} else if (keyCode == 38) {if(xindex!=3){int temp=data[xindex][yindex];data[xindex][yindex]=data[xindex+1][yindex];data[xindex+1][yindex]=temp;xindex++;}System.out.println("上移动业务代码执行");} else if (keyCode == 39) {if(yindex!=0){int temp=data[xindex][yindex];data[xindex][yindex]=data[xindex][yindex-1];data[xindex][yindex-1]=temp;yindex--;}System.out.println("右移动业务代码执行");} else if (keyCode == 40) {if(xindex!=0){int temp=data[xindex][yindex];data[xindex][yindex]=data[xindex-1][yindex];data[xindex-1][yindex]=temp;xindex--;}System.out.println("下移动业务代码执行");}}@Overridepublic void keyPressed(KeyEvent e) {//判断键盘输入是否为上下左右,对应移动业务int keyCode = e.getKeyCode();move(keyCode);//移动后需要刷新paintStone();}//--------------------------------------------------

假如说我们进行上移动操作,那么我们的空白格需要和下面的石头格子进行交换位置,那就要判断xindex是不是已经是3了,如果是3,那么就撞墙了,不能再进行交换了。

除此之外,我们每进行一次move操作,就需要刷新一下页面。

绘制页面方法需要先对之前的label进行removeall操作,再进行白板添加,再进行repaint进行刷新。 


游戏判定胜利

添加作弊器

当我的getKeyCode为90也就是键入z的时候,我希望能够直接让所有的石头块为正常状态

        }else if (keyCode == 90) {data=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}

判断胜利winJudge方法 

    private boolean winJudge() {//将目前的data和windata进行对比for (int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]!=windata[i][j]){return false;}}}//赢了就绘制胜利图像,且应该结束游戏return true;}

我们先创建胜利状态下的数组windata

    int[][] windata={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

胜利状态

我们现在需要在绘制页面进行判断,如果已经胜利了,加入胜利标志,而且不能再进行移动了

        //如果胜利,我们需要先加入胜利的Labelif(winJudge()){//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\win.png"));imagelabel.setBounds(124,230,266,88);getContentPane().add(imagelabel);//此时游戏已经胜利,不应该再移动了}
    public void move(int keyCode){//游戏胜利不能再移动了if(winJudge()){return;}

现在我们用作弊器测试一下效果

老铁没毛病 


统计步数

记录一下我们用了多少步数,增加成员变量count。上下左右移动的时候都count++,最后在paint方法中加入我们的步数label

        //左上角加入步数JLabel footcount =new JLabel("目前已用步数:"+count);footcount.setBounds(50,20,100,20);getContentPane().add(footcount);

重新游戏

在paint方法中加入JButton,需要取消默认布局,取消焦点

点击之后,我们需要重置步数,重置数据,重新绘制

        //添加按钮JButton regamebtn =new JButton("重新开始");regamebtn.setBounds(350,20,100,20);getContentPane().add(regamebtn);regamebtn.setFocusable(false);//添加按钮的点击监听regamebtn.addActionListener(this);

这里我们可以用内部匿名类,也可以再implements接口ActionListener去用this作为ActionListener的实现类对象,然后需要我们重写方法,在重写方法里面进行重置步数等命令

    @Overridepublic void actionPerformed(ActionEvent e) {//重置步数count=0;//重置data数据dataInit();//重新绘制paintStone();}

运行效果

全体代码

package yuhan;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;public class MainFrame extends JFrame implements KeyListener, ActionListener {public MainFrame() {//之前的键盘监听格式是窗口对象frame.addKeyListener(KeyListener的实现类)//第一个this是代表本类MainFrame的对象//第二个this代表实现类KeyListener的对象this.addKeyListener(this);//初始化窗口widgetInit();//打乱石头顺序dataInit();//绘制石头方块paintStone();//设置窗口可见setVisible(true);}//记录零号元素int xindex;int yindex;//统计步数int count;//用二维数组记录图像的idint[][] data = {{0, 1, 2, 3},{4, 5, 6, 7},{8, 9, 10, 11},{12, 13, 14, 15}};int[][] windata = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};public void dataInit() {Random rand = new Random();for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {int x = rand.nextInt(4);int y = rand.nextInt(4);int temp = data[x][y];data[x][y] = data[i][j];data[i][j] = temp;}}//找到0号元素for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (data[i][j] == 0) {xindex = i;yindex = j;return;}}}}public void widgetInit() {setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setSize(514, 595);setTitle("石头迷阵单机版v1.0");//想让游戏一直在屏幕的最上层setAlwaysOnTop(true);//想让窗体开始时在屏幕的居中位置setLocationRelativeTo(null);//取消默认布局setLayout(null);}public void paintStone() {//为了刷新,我们要先清空之前的Label,要不然直接调用这个方法会放在图层的最底下,不能显示getContentPane().removeAll();//左上角加入步数JLabel footcount = new JLabel("目前已用步数:" + count);footcount.setBounds(50, 20, 100, 20);getContentPane().add(footcount);//添加按钮JButton regamebtn = new JButton("重新开始");regamebtn.setBounds(350, 20, 100, 20);getContentPane().add(regamebtn);regamebtn.setFocusable(false);//添加按钮的点击监听regamebtn.addActionListener(this);//如果胜利,我们需要先加入胜利的Labelif (winJudge()) {//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\win.png"));imagelabel.setBounds(124, 230, 266, 88);getContentPane().add(imagelabel);//此时游戏已经胜利,不应该再移动了}for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {//第一个方块左边是(50,90)JLabel imagelabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\" + data[i][j] + ".png"));imagelabel.setBounds(100 * j + 50, 100 * i + 90, 100, 100);getContentPane().add(imagelabel);}}//加背景图像JLabel bglabel = new JLabel(new ImageIcon("D:\\Java资料\\资料\\进阶篇\\day04\\资料\\image\\background.png"));bglabel.setBounds(26, 30, 450, 484);getContentPane().add(bglabel);//remove后需要repaint进行label的刷新getContentPane().repaint();}public void move(int keyCode) {//游戏胜利不能再移动了if (winJudge()) {return;}if (keyCode == 37) {//判断是不是在最右边,不是的话,右边的石头方块就会向左移动if (yindex != 3) {int temp = data[xindex][yindex];data[xindex][yindex] = data[xindex][yindex + 1];data[xindex][yindex + 1] = temp;yindex++;count++;}System.out.println("左移动业务代码执行");} else if (keyCode == 38) {if (xindex != 3) {int temp = data[xindex][yindex];data[xindex][yindex] = data[xindex + 1][yindex];data[xindex + 1][yindex] = temp;xindex++;count++;}System.out.println("上移动业务代码执行");} else if (keyCode == 39) {if (yindex != 0) {int temp = data[xindex][yindex];data[xindex][yindex] = data[xindex][yindex - 1];data[xindex][yindex - 1] = temp;yindex--;count++;}System.out.println("右移动业务代码执行");} else if (keyCode == 40) {if (xindex != 0) {int temp = data[xindex][yindex];data[xindex][yindex] = data[xindex - 1][yindex];data[xindex - 1][yindex] = temp;xindex--;count++;}System.out.println("下移动业务代码执行");} else if (keyCode == 90) {data = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};}}@Overridepublic void keyPressed(KeyEvent e) {//判断键盘输入是否为上下左右,对应移动业务int keyCode = e.getKeyCode();move(keyCode);//移动后需要刷新paintStone();}private boolean winJudge() {//将目前的data和windata进行对比for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (data[i][j] != windata[i][j]) {return false;}}}//赢了就绘制胜利图像,且应该结束游戏return true;}//--------------------------------------------------@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {//重置步数count = 0;//重置data数据dataInit();//重新绘制paintStone();}
}
package yuhan;public class test {public static void main(String[] args) {new MainFrame();}
}

 效果

至此,石头迷阵游戏代码编写完毕,用了很多之前的类、接口、重写方法、构造方法这些面向对象思想。 

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

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

相关文章

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署&#xff0c;但是如果服务器厂商屏蔽了 udp 端口&#xff0c;那就没法了 针对 udp 被服务器厂商屏蔽的情况&#xff0c;需要使用一款 udp2raw 或 socat 类似的工具&#xff0c;来将 udp 打包成 tcp 进行通信 这里以…

系统可观测性(5)OpenTelemetry基础使用

系统可观测性(5)OpenTelemetry基础概念 Author: Once Day Date: 2025年3月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译整理自《OpenTelemetry Docs》&a…

Jenkins 集成DingDing 推送

现状分析 开发频繁发布代码&#xff0c;和测试没有及时沟通&#xff0c;导致测试返工、bug漏测等 解决方案 Jenkins 集成DingDing机器人&#xff0c;在构建时触发推送 DingDing端机器人配置 1、在钉钉电脑端建立群聊 2、点击群右上角设置&#xff0c;点击【智能群助手】 …

硬件驱动——51单片机:独立按键、中断、定时器/计数器

目录 一、独立按键 1.原理 2.封装函数 3.按键控制点灯 数码管 二、中断 1.原理 2.步骤 3.中断寄存器IE 4.控制寄存器TCON 5.打开外部中断0和1 三、定时器/计数器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按键控制频率的动态闪烁 一、独立按键 1…

基于PMU的14节点、30节点电力系统状态估计MATLAB程序

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介&#xff1a; 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步向量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; …

Apifox Helper 自动生成API接口文档

在我们开发过程中我们在编写请求地址和编写请求参数的时候特别花费时间耗费了我们很多时间&#xff0c;作为一个程序员&#xff0c;更应该把精力时间集中在开发上&#xff0c; Apifox Helper 是 Apifox 团队针对 IntelliJ IDEA 环境所推出的插件&#xff0c;可以在 IDEA 环境中…

堆概念和结构

1. 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中通常 把堆使用顺序结构的数组来存储 &#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事&#xff0c…

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…

使用 Arduino 和 ThingSpeak 通过互联网进行实时温度和湿度监测

使用 ThingSpeak 和 Arduino 通过 Internet 进行温度和湿度监控 湿度和温度是许多地方(如农场、温室、医疗、工业家庭和办公室)非常常见的测量参数。我们已经介绍了使用 Arduino 进行湿度和温度测量,并在 LCD 上显示数据。 在这个物联网项目中,我们将使用ThingSpeak在互联…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

如何筛选能实现共享自助健身房“灵活性”的物联网框架?

共享自助健身房已经成为一种新兴的健身方式&#xff0c;这种模式方便快捷&#xff0c;尤其适合i人健身爱好者&#xff0c;市场接受度还是挺好的。对于无人自助式的健身房要想实现灵活性&#xff0c;要挑选什么样的物联网框架呢&#xff1f; 1. 支持多种通信协议 共享自助健身…

大数据学习(68)- Flink和Spark Streaming

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

(链表)24. 两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…

【Linux】从互斥原理到C++ RAII封装实践

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

大数据-spark3.5安装部署之local模式

spark&#xff0c;一个数据处理框架和计算引擎。 下载 local模式即本地模式&#xff0c;就是不需要任何其他节点资源就可以在本地执行spark代码的环境。用于练习演示。 上传解压 使用PortX将文件上传至/opt 进入/opt目录&#xff0c;创建目录module&#xff0c;解压文件至/o…

Manus “Less structure,More intelligence ”独行云端处理器

根据市场调研机构Statista数据显示&#xff0c;全球的AR/AR的市场规模预计目前将达到2500亿美元&#xff0c;Manus作为VR手套领域的领军企业&#xff0c;足以颠覆你的认知。本篇文章将带你解读Manus产品&#xff0c;针对用户提出的种种问题&#xff0c;Manus又将如何解决且让使…

Oracle数据库存储结构--逻辑存储结构

数据库存储结构&#xff1a;分为物理存储结构和逻辑存储结构。 物理存储结构&#xff1a;操作系统层面如何组织和管理数据 逻辑存储结构&#xff1a;Oracle数据库内部数据组织和管理数据&#xff0c;数据库管理系统层面如何组织和管理数据 Oracle逻辑存储结构 数据库的逻…

芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾

2025年3月13日&#xff0c;全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展&#xff08;embedded world 2025&#xff09;圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中&#xff0c;芯驿电子 ALINX 展位人头攒动&#xff0c;多款尖端产品吸引客户…

Nexus File类型Blob Stores迁移至Minio操作指南(上)

#作者&#xff1a;闫乾苓 文章目录 目的前期准备查看file类型Blob Stores数据目录位置aws cli客户端连接工具OrientDB cli客户端连接工具在minio中新建 bucket 目的 增强nexus构件数据的高可用性和扩展性 前期准备 查看并记录需要迁移的Blob Store及repository 查看fil…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…