坦克大战1.0,java时间处理机制

news2024/11/20 7:25:41

1.java 绘图坐标体系

1.1 坐标体系-介绍

下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。

1672213954880

1.2坐标体系-像素

计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较。

2.绘图原理

Component类提供了两个和绘图相关最重要的方法:

  1. paint(Graphics g)绘制组件的外观。

  2. repaint()刷新组件的外观。

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件.

在以下情况paint()将会被调用:

  1. 窗口最小化再最大化
  2. 窗口的大小发生变化
  3. repaint方法被调用

3.介绍-快速入门

import javax.swing.*;
import java.awt.*;


public class DrawCircle extends JFrame { //JFrame对应窗口,可以理解成是一个画框

    //定义一个面板
    private MyPanel mp = null;

    public static void main(String[] args) {
        new DrawCircle();
        System.out.println("退出程序~");
    }

    public DrawCircle() {//构造器
        //初始化面板
        mp = new MyPanel();
        //把面板放入到窗口(画框)
        this.add(mp);
        //设置窗口的大小
        this.setSize(400, 300);
        //当点击窗口的小×,程序完全退出.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}

//1.先定义一个MyPanel, 继承JPanel类, 画图形,就在面板上画
class MyPanel extends JPanel {


    //说明:
    //1. MyPanel 对象就是一个画板
    //2. Graphics g 把 g 理解成一支画笔
    //3. Graphics 提供了很多绘图的方法
    //Graphics g
    @Override
    public void paint(Graphics g) {//绘图方法
        super.paint(g);//调用父类的方法完成初始化.
//        System.out.println("paint 方法被调用了~");
        //画出一个圆形.
        g.drawOval(10, 10, 100, 100);


//        //演示绘制不同的图形..
//        //画直线 drawLine(int x1,int y1,int x2,int y2)
//        g.drawLine(10, 10, 100, 100);
//        //画矩形边框 drawRect(int x, int y, int width, int height)
//        g.drawRect(10, 10, 100, 100);
//        //画椭圆边框 drawOval(int x, int y, int width, int height)
//        //填充矩形 fillRect(int x, int y, int width, int height)
//        //设置画笔的颜色
//        g.setColor(Color.blue);
//        g.fillRect(50, 50, 100, 100);
//
//        //填充椭圆 fillOval(int x, int y, int width, int height)
//        g.setColor(Color.red);
//        g.fillOval(60, 60, 100, 100);
//
//        //画图片 drawImage(Image img, int x, int y, ..)
//        //1. 获取图片资源, /bg.png 表示在该项目的根目录去获取 bg.png 图片资源
//        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
//        g.drawImage(image, 10, 10, 170, 210, this);
//        //画字符串 drawString(String str, int x, int y)//写字
//        //给画笔设置颜色和字体
//        g.setColor(Color.red);
//        g.setFont(new Font("隶书", Font.BOLD, 50));
//        //这里设置的 100, 100, 是 "北京你好"左下角
//        g.drawString("北京你好", 100, 100);
//        //设置画笔的字体 setFont(Font font)
//        //设置画笔的颜色 setColor(Color c)


    }
}

1672216338870

1672216477387

1672216719899

1672216857429

1672217033822

4.绘出坦克

1672217216293

package com.yt.tankgame;

public class Tank {
    private int x;//指定坦克的横坐标
    private int y;//指定坦克的纵坐标

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
package com.yt.tankgame;

//创建自己的坦克
public class Hero extends Tank{
    public Hero(int x, int y) {
        super(x, y);
    }
}
package com.yt.tankgame;

import javax.swing.*;
import java.awt.*;

//坦克大战的绘图区域
public class MyPanel extends JPanel {
    //定义我的坦克
    Hero hero = null;

    public MyPanel(){
        hero = new Hero(100,100);//初始化自己的坦克
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,750,750);//填充矩形,默认是黑色

        //画出坦克-封装到方法
        drawTank(hero.getX(),hero.getY(),g,0,0);

    }

    //编写方法,画出坦克

    /**
     *
     * @param x 坦克的左上x坐标
     * @param y 坦克的左上y坐标
     * @param g 画笔
     * @param direction 方向 ,上下左右
     * @param type 我们的坦克,还是敌方坦克
     */
    public void drawTank(int x, int y,Graphics g, int direction,int type){
        //根据不同类型的坦克,设置不同的颜色
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.cyan);
                break;
            case 1://敌方的坦克
                g.setColor(Color.yellow);
                break;
        }

        //根据坦克的方向来绘制坦克
        switch (direction){
            case 0://0表示向上
                g.fill3DRect(x,y,10,60,false);//画出坦克左边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边的轮子
                g.drawOval(x+10,y+20,20,20);//画出坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y);//画出炮筒

                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
}

测试

import javax.swing.*;

public class YtTankGame01 extends JFrame {
    //定义MyPanel
    MyPanel mp = null;

    public static void main(String[] args) {
        new YtTankGame01();
    }

    public YtTankGame01(){
        mp = new MyPanel();
        this.add(mp);//将面板(就是绘制游戏的区域)添加到窗口中
        this.setSize(750,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

}

5.java 事件处理机制

5.0移动小球

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.WindowListener;

/**
 * 演示小球通过键盘控制上下左右的移动-> 讲解Java的事件控制
 */
public class BallMove extends JFrame { //窗口
    MyPanel mp = null;
    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }

    //构造器
    public BallMove() {
        mp = new MyPanel();
        this.add(mp);
        this.setSize(400, 300);
        //窗口JFrame 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

//面板, 可以画出小球
//KeyListener 是监听器, 可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {

    //为了让小球可以移动, 把他的左上角的坐标(x,y)设置变量
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x, y, 20, 20); //默认黑色
    }

    //有字符输出时,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {
    }
    //当某个键按下,该方法会触发
    @Override
    public void keyPressed(KeyEvent e) {

        //System.out.println((char)e.getKeyCode() + "被按下..");

        //根据用户按下的不同键,来处理小球的移动 (上下左右的键)
        //在java中,会给每一个键,分配一个值(int)
        if(e.getKeyCode() == KeyEvent.VK_DOWN) {//KeyEvent.VK_DOWN就是向下的箭头对应的code
            y++;
        } else if(e.getKeyCode() == KeyEvent.VK_UP) {
            y--;
        } else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            x--;
        } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            x++;
        }

        //让面板重绘
        this.repaint();
    }

    //当某个键释放(松开),该方法会触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}

5.1基本说明

java事件处理是采取“委派事件模型"。当事件发生时,产生事件的对象,会把此"信息”传递给"事件的监听者"处理,这里所说的“信息"实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为"事件的对象”。

1672300359400

5.2事件处理机制深入理解

1672300589953

1672300767607

1672300783817

6.可以移动的坦克

1672304359059

Tank类

package com.yt.tankgame02;

public class Tank {
    private int x;//指定坦克的横坐标
    private int y;//指定坦克的纵坐标
    private int direct;//表示坦克方向 0上 1右 2下 3左
    private int speed = 1;

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    //上右下左移动方法
    public void moveUp(){
        y -= speed;
    }

    public void moveRight(){
        x += speed;
    }

    public void moveDown(){
        y += speed;
    }

    public void moveLeft(){
        x -= speed;
    }

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

Hero类

package com.yt.tankgame02;

//创建自己的坦克
public class Hero extends Tank{
    public Hero(int x, int y) {
        super(x, y);
    }
}
MyPanel类
package com.yt.tankgame02;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

//坦克大战的绘图区域
//为了监听键盘事件,实现KeyListener
public class MyPanel extends JPanel implements KeyListener {
    //定义我的坦克
    Hero hero = null;

    public MyPanel(){
        hero = new Hero(100,100);//初始化自己的坦克
        hero.setDirect(5);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,750,750);//填充矩形,默认是黑色

        //画出坦克-封装到方法
        drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);

    }

    //编写方法,画出坦克

    /**
     *
     * @param x 坦克的左上x坐标
     * @param y 坦克的左上y坐标
     * @param g 画笔
     * @param direction 方向 ,上下左右
     * @param type 我们的坦克,还是敌方坦克
     */
    public void drawTank(int x, int y,Graphics g, int direction,int type){
        //根据不同类型的坦克,设置不同的颜色
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.cyan);
                break;
            case 1://敌方的坦克
                g.setColor(Color.yellow);
                break;
        }

        //根据坦克的方向来绘制对应形状的坦克
        //direction表示方向,0:向上  1向右 2向下 3向左
        switch (direction){
            case 0://0表示向上
                g.fill3DRect(x,y,10,60,false);//画出坦克左边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边的轮子
                g.drawOval(x+10,y+20,20,20);//画出坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y);//画出炮筒
                break;
            case 1://1表示向右
                g.fill3DRect(x,y,60,10,false);//画出坦克上边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画出坦克中间
                g.fill3DRect(x,y+30,60,10,false);//画出坦克下边的轮子
                g.drawOval(x+20,y+10,20,20);//画出坦克中间的盖子
                g.drawLine(x+30,y+20,x+60,y+20);//画出炮筒
                break;
            case 2://2表示向下
                g.fill3DRect(x,y,10,60,false);//画出坦克左边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边的轮子
                g.drawOval(x+10,y+20,20,20);//画出坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y+60);//画出炮筒
                break;
            case 3://3表示向左
                g.fill3DRect(x,y,60,10,false);//画出坦克上边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画出坦克中间
                g.fill3DRect(x,y+30,60,10,false);//画出坦克下边的轮子
                g.drawOval(x+20,y+10,20,20);//画出坦克中间的盖子
                g.drawLine(x+30,y+20,x,y+20);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //处理w s a d 键的按下情况
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W){
            //按下w键,改变坦克方向
            hero.setDirect(0);
            hero.moveUp();
        } else if (e.getKeyCode() == KeyEvent.VK_D){
            hero.setDirect(1);
            hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_S){
            hero.setDirect(2);
            hero.moveDown();
        } else if (e.getKeyCode() == KeyEvent.VK_A){
            hero.setDirect(3);
            hero.moveLeft();
        }
        //务必要重绘,才能显示出变化
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

测试类

package com.yt.tankgame02;

import javax.swing.*;

public class YtTankGame02 extends JFrame {
    //定义MyPanel
    MyPanel mp = null;

    public static void main(String[] args) {
        new YtTankGame02();
    }

    public YtTankGame02(){
        mp = new MyPanel();
        this.add(mp);//将面板(就是绘制游戏的区域)添加到窗口中
        this.addKeyListener(mp);//让JFrame监听mp的键盘事件
        this.setSize(750,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

}

7.作业-绘制敌人坦克

1672304537538

1672305816259

package com.yt.tankgame02;

public class EnemyTank extends Tank{
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}

1672305846516

package com.yt.tankgame02;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

//坦克大战的绘图区域
//为了监听键盘事件,实现KeyListener
public class MyPanel extends JPanel implements KeyListener {
    //定义我的坦克
    Hero hero = null;
    //定义敌人的坦克,放入到Vector中
    Vector<EnemyTank> enemyTanks = new Vector<>();
    int enemyTankSize = 3;

    public MyPanel(){
        hero = new Hero(100,100);//初始化自己的坦克
        hero.setSpeed(5);
        //初始化敌人的坦克
        for (int i = 0; i < enemyTankSize; i++) {
            //创建敌人的坦克
            EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);
            //设置方向
            enemyTank.setDirect(2);
            //加入
            enemyTanks.add(enemyTank);
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,750,750);//填充矩形,默认是黑色

        //画出坦克-封装到方法
        drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);

        //画出敌人的坦克,遍历Vector
        for (int i=0; i< enemyTanks.size(); i++){
            //取出坦克
            EnemyTank enemyTank = enemyTanks.get(i);
            drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirect(),0);
        }

    }

    //编写方法,画出坦克

    /**
     *
     * @param x 坦克的左上x坐标
     * @param y 坦克的左上y坐标
     * @param g 画笔
     * @param direction 方向 ,上下左右
     * @param type 我们的坦克,还是敌方坦克
     */
    public void drawTank(int x, int y,Graphics g, int direction,int type){
        //根据不同类型的坦克,设置不同的颜色
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.cyan);
                break;
            case 1://敌方的坦克
                g.setColor(Color.yellow);
                break;
        }

        //根据坦克的方向来绘制对应形状的坦克
        //direction表示方向,0:向上  1向右 2向下 3向左
        switch (direction){
            case 0://0表示向上
                g.fill3DRect(x,y,10,60,false);//画出坦克左边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边的轮子
                g.drawOval(x+10,y+20,20,20);//画出坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y);//画出炮筒
                break;
            case 1://1表示向右
                g.fill3DRect(x,y,60,10,false);//画出坦克上边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画出坦克中间
                g.fill3DRect(x,y+30,60,10,false);//画出坦克下边的轮子
                g.drawOval(x+20,y+10,20,20);//画出坦克中间的盖子
                g.drawLine(x+30,y+20,x+60,y+20);//画出炮筒
                break;
            case 2://2表示向下
                g.fill3DRect(x,y,10,60,false);//画出坦克左边的轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边的轮子
                g.drawOval(x+10,y+20,20,20);//画出坦克中间的盖子
                g.drawLine(x+20,y+30,x+20,y+60);//画出炮筒
                break;
            case 3://3表示向左
                g.fill3DRect(x,y,60,10,false);//画出坦克上边的轮子
                g.fill3DRect(x+10,y+10,40,20,false);//画出坦克中间
                g.fill3DRect(x,y+30,60,10,false);//画出坦克下边的轮子
                g.drawOval(x+20,y+10,20,20);//画出坦克中间的盖子
                g.drawLine(x+30,y+20,x,y+20);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //处理w s a d 键的按下情况
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W){
            //按下w键,改变坦克方向
            hero.setDirect(0);
            hero.moveUp();
        } else if (e.getKeyCode() == KeyEvent.VK_D){
            hero.setDirect(1);
            hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_S){
            hero.setDirect(2);
            hero.moveDown();
        } else if (e.getKeyCode() == KeyEvent.VK_A){
            hero.setDirect(3);
            hero.moveLeft();
        }
        //务必要重绘,才能显示出变化
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

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

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

相关文章

金融业务如何高性能传输数据

对系统要求高&#xff0c;通常按金融级标准设计。金融数据传输要求速度快&#xff0c;流量大&#xff0c;极强容灾。 案例分析 简化版券商算法交易平台对接交易所&#xff1a; 涉及场景多。既有事务数据&#xff0c;也有市场数据模型简单。只涉及到2个主体复杂度可选。连接交…

【结构型】装饰模式(Decorator)

目录装饰模式(Decorator)适用场景装饰模式实例代码&#xff08;Java&#xff09;装饰模式(Decorator) 动态地给一个对象添加一些额外的职责。就增加功能而言&#xff0c;装饰模式 (Decorator) 比生成子类更加灵活。 适用场景 在不影响其他对象的情况下&#xff0c;以动态、透…

2023让工作效率直线飞升

2022年马上就要过去&#xff0c;过去的一年&#xff0c;腾讯云HiFlow和众多腾讯系应用也帮助了许多企业完成数字化转型&#xff0c;许多没有代码基础的业务人员也能通过搭建工作流&#xff0c;高效的处理生活&工作的繁杂事务&#xff0c;时间精力节省50%。把时间花在更重要…

开源 | 携程机票跨端 Kotlin DSL 数据库框架 SQLlin

作者简介禹昂&#xff0c;携程机票移动端资深工程师&#xff0c;专注于 Kotlin 移动端跨平台领域&#xff0c;Kotlin 中文社区核心成员&#xff0c;图书《Kotlin 编程实践》译者。一、背景2022年9月 Kotlin 1.7.20 发布之后&#xff0c;Kotlin Multiplatform Mobile&#xff08…

【计算机图形学入门】笔记7:Shading着色1(光照与基本着色模型)

07Shading着色&#xff08;光照与基本着色模型&#xff09;1.深度缓冲Z-buffering1.画家算法&#xff1a;先把远处的东西画在屏幕上&#xff0c;再画近处的&#xff0c;从而近处物体覆盖远处物体。&#xff08;油画家&#xff09;2.深度缓冲2.Shading着色1.我们目前学了哪些知识…

CleanMyMacX2023系统清理优化工具使用评测

如果你的macbook有点年头空间不够开始卡顿了&#xff0c;或者你是windows用户刚转来的&#xff0c;我强烈建议你安装一个cleanmymac&#xff01;Mac电脑清理是可以直接使用储存空间管理&#xff08;关于本机->储存空间->管理&#xff09;来清理&#xff0c;但是这里的其他…

Android开发笔记(一百九十)增强了日志功能的第二版Logcat

从Android Studio Dolphin开始&#xff0c;查看应用日志的Logcat全面升级&#xff0c;堪称Logcat 2.0版本。下面就让我们看看LogcatV2.0究竟带来了什么新特性吧。 对于Android Studio的老用户来说&#xff0c;小海豚版本新出的LogcatV2.0在用法上有不小的差异&#xff0c;一开始…

Fisher卡方全流程汇总

Fisher卡方 卡方检验研究数据的独立性&#xff0c;在分析样本量较少&#xff08;比如小于40&#xff09;&#xff0c;也或者期望频数出现小于5时&#xff0c;此时使用fisher卡方检验较为适合。SPSSAU医学研究模块中的卡方检验时&#xff0c;有提供2*2即4表格时提供fisher卡方检…

魔方(14)133魔方、一阶鬼魔魔方、双心魔方

目录 133魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 一阶鬼魔魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 双心魔方 133魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组成部件 9个块&#xff0c;1个中心块&#xff0c;4个棱块&#xff…

ZYNQ - 以太网远程更新SD卡应用程序

写在前面 对于ZYNQ系列的板卡固化&#xff0c;可以通过JTAG接口&#xff0c;使用SDK固化到FLASH中&#xff0c;或者可将SD卡取出将SD卡中保存的固化工程进行修改&#xff0c;但在很多情况下&#xff0c;离线更新会很不方便&#xff0c;本文借鉴网上常见的远程更新QSPI FLASH的…

思维导图 制作

PPT e.g&#xff1a; WPS中ppt 新建 文本框一定要 在外框之内。 左键 全选中&#xff0c;就会出来如下。 可直接点居中&#xff0c;就不用浪费time调位置 全选中&#xff0c;右键&#xff0c;【组合】 形成整体&#xff0c;可复制到word中 选择性粘贴到word中 skill: 左键…

《Linux运维总结:Centos7.6源码安装单实例redis6.2.8》

一、部署redis服务 1.1、环境信息 环境信息如下&#xff1a; 主机IP操作系统Redis版本CPU架构192.168.1.191Centos7.66.2.8x86_641.2、二进制方式 1、安装环境依赖 [rootlocalhost ~]# yum -y install gcc2、安装包下载 [rootlocalhost ~]# wget https://download.redis.io…

Linux-线程(LWP)

文章目录线程线程概念进程今天的进程 vs之前的进程私有和共享资源实验验证线程的优点&#xff1a;线程的缺点&#xff1a;线程异常线程的用途&#xff1a;线程控制创建线程(1)先创建两个线程&#xff1a;链接时要引入第三方库。(2)创建多个线程&#xff1a;(3)线程的健壮性不强…

Pandas 替换 NaN 值

替换Pandas DataFram中的 NaN 值 问题 NaN 代表 Not A Number&#xff0c;是表示数据中缺失值的常用方法之一。它是一个特殊的浮点值&#xff0c;不能转换为 float 以外的任何其他类型。NaN 值是数据分析中的主要问题之一。为了得到理想的结果&#xff0c;对 NaN 进行处理是非…

LeetCode刷题复盘笔记—一文搞懂动态规划之53. 最大子数组和问题(动态规划系列第三十五篇)

今日主要总结一下动态规划的一道题目&#xff0c;53. 最大子数组和 题目&#xff1a;53. 最大子数组和 Leetcode题目地址 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#…

成年人的崩溃一触即发,掌握学习能力才能突破认知结界,干货满满!

成年人的崩溃一触即发&#xff0c;掌握学习能力才能突破认知结界&#xff01; 今年2月份&#xff08;2022-02&#xff09;&#xff0c;从小红书上购买了知识博主【老明读书】&#xff0c;针对学习能力的讲解分析&#xff0c;真是干货满满&#xff01;非常感谢老明&#xff0c;…

FPGA项目案例展示

MIPI视频拼接&#xff1a; 在无人机、智能驾驶中&#xff0c;摄像头多达十几路 为解决图像处理芯片&#xff08;如海思、高通平台&#xff09;的接口瓶颈 需要将多个摄像头合成一路处理。 SLVS-EC转MIPI SLVS-EC采集&#xff0c;LANE速率可达4.6G MIPI输出&#xff0c;速率2.…

基于ASP.net Mvc的超市管理系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把天美意超市管理与现在网络相结合&#xff0c;利用net语言建设天美意超市管理系统&#xff0c;实现天美意超市管理的信息化。则对于进一步提高天美意超市发展&#xff0c;丰富天美意超市管理系统能起到不少的促进作用。 天美…

SHELL 脚本练习 一

习题一 &#xff1a;在当前主机编写脚本文件history_max.sh显示主机中执行频率最高的前5个命令 习题二 &#xff1a; 判断主机是否存在rhel用户&#xff0c;如果存在则设置密码为redhat,如果不存在则创建用户 并设置密码 习题三 &#xff1a;通过设置变量HISTTIMEFORMAT&#x…

【小白课程】openKylin系统音频大体框架介绍

在桌面操作系统中&#xff0c;音频是至关重要的一环&#xff0c;音频的稳定支持直接决定了用户的听感以及使用体验&#xff0c;今天我们就给大家介绍openKylin桌面操作系统背后关于音频的那些故事。 先看一张框架图&#xff0c;这张图大致介绍了openKylin操作系统音频的框架组…