俄罗斯方块

一.准备工作

先创建一个新的Java项目命名为“俄罗斯方块”。再在该项目中创建一个文件夹命名为”images”,并将所需的图片素材拖入该文件夹。

二.代码呈现 

编写小方块类:

import java.awt.image.BufferedImage;


/**
 * 描述:小方块类
 * 属性:行,列以及单元格的图片
 * 方法: 左移一格,右移一格,下移一格
 */

public class Cell {
    private int row;
    private int col;
    private BufferedImage image;

    public Cell() {
    }

    public Cell(int row, int col, BufferedImage image) {
        this.row = row;
        this.col = col;
        this.image = image;
    }

    public int getRow() {
        return row;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public int getCol() {
        return col;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }
    //左移
    public void left() {
        col--;
    }
    //右移
    public void right() {
        col++;
    }
    //下移
    public void soft() {
        row++;
    }
}

编写四方格父类:

/**
 * 描述:四方格父类
 * 属性:Cell[]数组用于创建4个小方块
 * 方法:左移一格,右移一格,下移一格,变形
 */

public class Tetromino {
    protected Cell[] cells = new Cell[4];

    //左移
    public void moveLeft() {
        for (Cell cell : cells) {
            cell.left();
        }
    }
    //右移
    public void moveRight() {
        for (Cell cell : cells) {
            cell.right();
        }
    }
    //下移
    public void sftDrop() {
        for (Cell cell : cells) {
            cell.drop();
        }
    }
    //随机生成四方格
    public static Tetromino randomOne() {
        int num = (int)(Math.random() * 7);
        Tetromino tetromino = null;
        switch (num) {
            case 0 :
                tetromino = new I();
                break;
            case 1 :
                tetromino = new J();
                break;
            case 2 :
                tetromino = new L();
                break;
            case 3 :
                tetromino = new O();
                break;
            case 4 :
                tetromino = new S();
                break;
            case 5 :
                tetromino = new T();
                break;
            case 6 :
                tetromino = new Z();
                break;
        }
        return tetromino;
    }
    //编写旋转状态
    protected State[] states;
    //声明旋转次数
    protected int count = 10000;
    /**描述:四方格旋转状态的内部类
     * 属性:记录四方格的相对位置
     */
    class State {
        int row0,col0,row1,col1,row2,col2,row3,col3;

        public State(){

        }

        public State(int row0, int col0, int row1, int col1, int row2, int col2, int row3, int col3) {
            this.row0 = row0;
            this.col0 = col0;
            this.row1 = row1;
            this.col1 = col1;
            this.row2 = row2;
            this.col2 = col2;
            this.row3 = row3;
            this.col3 = col3;
        }

        public int getRow0() {
            return row0;
        }

        public void setRow0(int row0) {
            this.row0 = row0;
        }

        public int getRow1() {
            return row1;
        }

        public void setRow1(int row1) {
            this.row1 = row1;
        }

        public int getRow2() {
            return row2;
        }

        public void setRow2(int row2) {
            this.row2 = row2;
        }

        public int getRow3() {
            return row3;
        }

        public void setRow3(int row3) {
            this.row3 = row3;
        }

        public int getCol0() {
            return col0;
        }

        public void setCol0(int col0) {
            this.col0 = col0;
        }

        public int getCol1() {
            return col1;
        }

        public void setCol1(int col1) {
            this.col1 = col1;
        }

        public int getCol2() {
            return col2;
        }

        public void setCol2(int col2) {
            this.col2 = col2;
        }

        public int getCol3() {
            return col3;
        }

        public void setCol3(int col3) {
            this.col3 = col3;
        }
    }
    //编写顺时针旋转四方格方法
    public void rotateRight() {
        if (states.length == 0) {
            return;
        }
        //旋转次数加1
        count++;
        //获取当前状态
        State s = states[count % states.length];
        Cell cell = cells[0];
        int row = cell.getRow();
        int col = cell.getCol();
        //变形
        cells[1].setRow(row + s.row1);
        cells[1].setCol(col + s.col1);
        cells[2].setRow(row + s.row2);
        cells[2].setCol(col + s.col2);
        cells[3].setRow(row + s.row3);
        cells[3].setCol(col + s.col3);
    }
    //逆时针旋转四方格方法
    public void rotateLeft() {
        //旋转次数加1
        count--;
        //获取当前状态
        State s = states[count % states.length];
        Cell cell = cells[0];
        int row = cell.getRow();
        int col = cell.getCol();
        //变形
        cells[1].setRow(row + s.row1);
        cells[1].setCol(col + s.col1);
        cells[2].setRow(row + s.row2);
        cells[2].setCol(col + s.col2);
        cells[3].setRow(row + s.row3);
        cells[3].setCol(col + s.col3);
    }
    //顺时针旋转
    public void rotateRightAction() {
        Tetromino currentOne = null;
		currentOne.rotateRight();
        //判断是否越界或者重合,否则恢复原来的状态
        if (outOfBounds() || coincide()) {
            currentOne.rotateLeft();
        }
    }
    private boolean coincide() {
		// TODO Auto-generated method stub
		return false;
	}
	private boolean outOfBounds() {
		// TODO Auto-generated method stub
		return false;
	}
	//判断游戏是否结束,结束返回true,继续返回false
    public boolean isGameOver() {
        Cell[] cells = nextOne.cells;
        for (Cell cell : cells) {
            int row = cell.getRow();
            int col = cell.getCol();
            if (wall[row][col] != null) {
                return true;
            }
        }
        return false;
    }
    //判断当前行是否满,满返回true,没有满返回false
    public boolean isFullLine(int row) {
        Cell[] cells = wall[row];
        for (Cell cell : cells) {
            if (cell == null) {
                return false;
            }
        }
        return true;
    }
    //创建销行方法
    public void  destroyLine() {
        //统计当前形参行数
        int line = 0;
        Cell[] cells = currentOne.cells;
        for (Cell cell : cells) {
            int row = cell.getRow();
            //判断当前行是否满
            if (isFullLine(row)) {
                line++;
                //将消除行以上的方块下落到对应行数
                for (int i = row; i > 0; i--) {
                    System.arraycopy(wall[i - 1],0,wall[i],0,wall[0].length);
                }
                //重新创造第一行
                wall[0] = new Cell[9];
            }
        }
        //更新分数
        totalScore += scores_pool[line];
        //更新消除行数
        totalLine += line;
    }
    //判断四方格能否下落
    public boolean canDrop() {
        Cell[] cells = currentOne.cells;
        for (Cell cell : cells) {
            int row = cell.getRow();
            int col = cell.getCol();
            //判断能否全部到达底部
            if (row == wall.length - 1) {
                return false;
            } else if(wall[row + 1][col] != null) { //判断该位置是否有方块
                return false;
            }
        }
        return true;
    }
    //按键一次四方格下落一个
    public void sortDropAction() {
        //判断能否下落
        if (canDrop()) {
            //当前四方格下落一格
            currentOne.softDrop();
        } else {
            //把四方格嵌入墙中
            landToWall();
            //判断能否销行
            destroyLine();
            //判断游戏是否结束
            if (isGameOver()) {
                game_state = GAMEOVER;
            } else {
                //继续生成四方格
                currentOne = nextOne;
                nextOne = Tetromino.randomOne();
            }
        }

    }
    //把四方格嵌入墙中
    private void landToWall() {
        Cell[] cells = currentOne.cells;
        for (Cell cell : cells) {
            int row = cell.getRow();
            int col = cell.getCol();
            wall[row][col] = cell;
        }
    }
    //瞬间下落
    public void handDropAction() {
        while (canDrop()) {
            currentOne.softDrop();
        }
        //把四方格嵌入墙中
        landToWall();
        //判断能否销行
        destroyLine();
        //判断游戏是否结束
        if (isGameOver()) {
            game_state = GAMEOVER;
        } else {
            //继续生成四方格
            currentOne = nextOne;
            nextOne = Tetromino.randomOne();
        }
    }
    public void start() {
        game_state = PLAYING;
        KeyListener listener = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int code = e.getKeyCode();
                switch (code) {
                    case KeyEvent.VK_DOWN: //↓
                        sortDropAction(); //下落一格
                        break;
                    case KeyEvent.VK_LEFT://←
                        moveLeftAction(); //左移一格
                        break;
                    case KeyEvent.VK_RIGHT: //→
                        moveRightAction(); //右移一格
                        break;
                    case KeyEvent.VK_UP://↑
                        rotateRightAction();//顺时针旋转
                        break;
                    case KeyEvent.VK_SPACE://空格
                        handDropAction();//瞬间下落
                        break;
                    case KeyEvent.VK_P: //p
                        //判断游戏是否在运行,没有才能暂停
                        if (game_state == PLAYING) {
                            game_state = PAUSE;
                        }
                        break;
                    case KeyEvent.VK_C:
                        //游戏暂停后,才能继续
                        if (game_state == PAUSE) {
                            game_state = PLAYING;
                        }
                        break;
                    case KeyEvent.VK_R:
                        //重新开始游戏,把游戏状态变为正在游戏
                        game_state = PLAYING;
                        //界面清空
                        wall = new Cell[ROW][COL];
                        currentOne = Tetromino.randomOne();
                        nextOne = Tetromino.randomOne();
                        //数据清空
                        totalLine = 0;
                        totalScore = 0;
                        break;

                }
            }
        };
        //把俄罗斯方块窗口设置为焦点
        this.addKeyListener(listener);
        this.requestFocus();

        while(true){
            //判断,当前游戏状态在游戏中时,每隔0.5秒下落
            if(game_state == PLAYING){
                try {
                    Thread.sleep(700);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //判断能否下落
                if(canDrop()){
                    currentOne.softDrop();
                }else{
                    //嵌入到墙中
                    landToWall();
                    //判断能否消行
                    destroyLine();
                    //判断游戏是否结束
                    if(isGameOver()){
                        game_state = GAMEOVER;
                    }else{
                        currentOne = nextOne;
                        nextOne = Tetromino.randomOne();
                    }
                }
            }
            //重新绘制
            repaint();
        }
    }


}

编写俄罗斯方块主类:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

//俄罗斯方块主类
public class Tetris extends JPanel {
	static int ROW=18;
	static int COL=9;
	//声明正在下落的方块
    private Tetromino currentOne = Tetromino.randomOne();
    //声明将要下落的方块
    private Tetromino nextOne = Tetromino.randomOne();
    //声明游戏主区域
    private Cell[][] wall = new Cell[ROW][COL];
    //声明单元格像素为48像素
    private static final int CELL_SIZE=48;
    //游戏分数池
    int[] scores_pool = {0, 1, 2, 5, 10};
    //游戏总分
    private int totalScore = 0;
    //游戏消除总行数
    private int totalLine = 0;
    //游戏的状态:游戏中,游戏暂停,游戏结束
    private static final int PLAYING=0;
    private static final int PAUSE=1;
    private static final int GAMEOVER=2;
    //声明变量来存放当前游戏状态
    private int game_state;
    //数组显示当前游戏状态
    String[] show_state= {"P[暂停]","C[继续]","R[重开]"};
    //静态载入图片
    public static BufferedImage I;
    public static BufferedImage J;
    public static BufferedImage L;
    public static BufferedImage O;
    public static BufferedImage S;
    public static BufferedImage T;
    public static BufferedImage Z;
    public static BufferedImage backImage;

    static {
        try {
            I = ImageIO.read(new File(pathname:"images/I.png"));
            J = ImageIO.read(new File(pathname:"images/J.png"));
            L = ImageIO.read(new File(pathname:"images/L.png"));
            O = ImageIO.read(new File(pathname:"images/O.png"));
            S = ImageIO.read(new File(pathname:"images/S.png"));
            T = ImageIO.read(new File(pathname:"images/T.png"));
            Z = ImageIO.read(new File(pathname:"images/Z.png"));
            backImage=ImageIO.read(new File(pathname:"images/background.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    public static void main(String[] args) {
        //创建窗口对象
        JFrame frame = new JFrame(title:"俄罗斯方块");
        //创建游戏窗口(即面板)
        Tetris panel = new Tetris();
        //把面板嵌入到窗口中
        frame.add(panel);
        //设置可见
        frame.setVisible(true);
        //设置窗口尺寸
        frame.setSize(width:810,height:940);
        //设置窗口居中
        frame.setLocationRelativeTo(null);
        //设置窗口关闭时程序中止
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //游戏逻辑封装在方法中
        panel.start();
    }
    @Override
    public void paint(Graphics g) {
    	g.drawImage(backImage,x:0,y:0,observer:null);
    	
    	//平移坐标轴
    	g.translate(x:22, y:15);
    	
    	//绘制游戏主区域
    	paintWall(g);
    	
    	//绘制正在下落的四方格
    	paintCurrentOne(g);
    	
    	//绘制下一个下落的四方格
    	paintNextOne(g);
    	
    	//绘制游戏得分
    	paintScore(g);
    	
    	//绘制游戏当前状态
    	paintState(g);
    }
    //绘制游戏当前状态
    private void paintState(Graphics g) {
    	if(game_state==PLAYING) {
    		g.drawString(show_state[0],x:500,y:660);
    	}else if(game_state==PAUSE) {
    		g.drawString(show_state[1],x:500,y:660);
    	}else if(game_state==GAMEOVER) {
    		g.drawString(show_state[2],x:500,y:660);
    		g.setColor(Color.red);
    		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,size:60));
    		g.drawString(str:"GAMEOVER!",x:30,y:400);
    	}
    }
    
    private void paintNextOne(Graphics g) {
    	Cell[] cells=nextOne.cells;
    	for(Cell cell:cells) {
    		int x=cell.getCol()*CELL_SIZE+370;
    		int y=cell.getRow()*CELL_SIZE+25;
    		g.drawImage(cell.getImage(),x,y,observer:null);
    	}
    }
    private void paintCurrentOne(Graphics g) {
    	Cell[] cells=currentOne.cells;
    	for(Cell cell:cells) {
    		int x=cell.getCol()*CELL_SIZE;
    		int y=cell.getRow()*CELL_SIZE;
    		g.drawImage(cell.getImage(),x,y,observer:null);
    	}
    }
    
    private void paintWall(Graphics g) {
    	for(int i=0;i<wall.length;i++) {
    		for(int j=0;j<wall[i].length;j++) {
    			int x=j*CELL_SIZE;
    			int y=i*CELL_SIZE;
    			Cell cell=wall[i][j];
    			//判断当前单元格是否有小方格,如果无则绘制矩形,否则将小方块嵌到墙中
    			if(cell==null) {
    				g.drawRect(x,y,CELL_SIZE,CELL_SIZE);
    			}else {
    				g.drawImage(cell.getImage(), x, y, observer.null);
    			}
    		}
    	}
    }
    //判断方块是否出界,出界返回true,没有则返回false
    public boolean outOfBounds() {
        Cell[] cells = currentOne.cells;
        for (Cell cell : cells) {
            int col = cell.getCol();
            int row = cell.getRow();
            if (col < 0 || col > COL - 1 || row < 0 || row > ROW - 1) {
                return true;
            }
        }
        return false;
    }
    //判断方块是否重合,重合返回true,没有返回false
    public boolean coincide() {
        Cell[] cells = currentOne.cells;
        for (Cell cell : cells) {
            int col = cell.getCol();
            int row = cell.getRow();
            if (wall[row][col] != null) {
                return true;
            }
        }
        return false;
    }
    //按键←触发左移
    public void moveLeftAction() {
        currentOne.moveLeft();
        //判断是否越界或者重合,如果是则右移恢复原来的状态,不是则左移
        if (outOfBounds() || coincide()) {
            currentOne.moveRight();
        }
    }
    //按键→触发右移
    public void moveRightAction() {
        currentOne.moveRight();
        //判断是否越界或者重合,如果是则左移恢复原来的状态,不是则右移
        if (outOfBounds() || coincide()) {
            currentOne.moveLeft();
        }
    }

}

分别创建并初始化7种形状:

public class I extends Tetromino{
    public I() {
        cells[0] = new Cell(0,4,Tetris.I);
        cells[1] = new Cell(0,3,Tetris.I);
        cells[2] = new Cell(0,5,Tetris.I);
        cells[3] = new Cell(0,6,Tetris.I);
        //两种状态
        states = new State[2];
        //相对坐标
        states[0] = new State(0,0,0,-1,0,1,0,2);
        states[1] = new State(0,0,-1,0,1,0,2,0);
    }
}
public class J extends Tetromino{
    public J() {
        cells[0] = new Cell(0,4,Tetris.J);
        cells[1] = new Cell(0,3,Tetris.J);
        cells[2] = new Cell(0,5,Tetris.J);
        cells[3] = new Cell(1,5,Tetris.J);
        //4种状态
        states = new State[4];
        states[0] = new State(0,0,0,1,0,1,1,1);
        states[1] = new State(0,0,-1,0,1,0,1,-1);
        states[2] = new State(0,0,0,1,0,-1,-1,-1);
        states[3] = new State(0,0,1,0,-1,0,-1,1);
    }
}
public class L extends Tetromino{
    public L() {
        cells[0] = new Cell(0,4,Tetris.L);
        cells[1] = new Cell(0,3,Tetris.L);
        cells[2] = new Cell(0,5,Tetris.L);
        cells[3] = new Cell(1,3,Tetris.L);
        //4种状态
        states = new State[4];
        //初始化
        states[0] = new State(0,0,0,-1,0,1,1,-1);
        states[1] = new State(0,0,-1,0,1,0,-1,-1);
        states[2] = new State(0,0,0,1,0,-1,-1,1);
        states[3] = new State(0,0,1,0,-1,0,1,1);
    }
}
public class O extends Tetromino{
    public O() {
        cells[0] = new Cell(0,4,Tetris.O);
        cells[1] = new Cell(0,5,Tetris.O);
        cells[2] = new Cell(1,4,Tetris.O);
        cells[3] = new Cell(1,5,Tetris.O);
        //0种状态
        states = new State[0];
    }
}
public class S extends Tetromino{
    public S() {
        cells[0] = new Cell(0,4,Tetris.S);
        cells[1] = new Cell(0,5,Tetris.S);
        cells[2] = new Cell(1,3,Tetris.S);
        cells[3] = new Cell(1,4,Tetris.S);
        //2种状态
        states = new State[2];
        //初始化相对位置
        states[0] = new State(0,0,0,1,1,-1,1,0);
        states[1] = new State(0,0,1,0,-1,-1,0,-1);
    }
}
public class T extends Tetromino{
    public T() {
        cells[0] = new Cell(0,4,Tetris.T);
        cells[1] = new Cell(0,3,Tetris.T);
        cells[2] = new Cell(0,5,Tetris.T);
        cells[3] = new Cell(1,4,Tetris.T);

        //4种状态
        states = new State[4];
        //初始化相对坐标
        states[0] = new State(0,0,0,-1,0,1,1,0);
        states[1] = new State(0,0,-1,0,1,0,0,-1);
        states[2] = new State(0,0,0,1,0,-1,-1,0);
        states[3] = new State(0,0,1,0,-1,0,0,1);
    }
}
public class Z extends Tetromino{
    public Z() {
        cells[0] = new Cell(1,4,Tetris.Z);
        cells[1] = new Cell(0,3,Tetris.Z);
        cells[2] = new Cell(0,4,Tetris.Z);
        cells[3] = new Cell(1,5,Tetris.Z);
        //两种状态
        states = new State[2];
        //初始化相对位置
        states[0] = new State(0,0,-1,-1,-1,0,0,1);
        states[1] = new State(0,0,-1,1,0,1,1,0);
    }
}

三.结果呈现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

不会代码的时候,如何使用Jmeter完成接口测试?

1.接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.接口测试流程 接口测试…

推荐一个非常好用的uniapp的组件库【TMUI3.0】

文章目录 前言官网地址如何使用&#xff1f;注意事项后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果…

Java虚拟机运行时数据区结构详解

Java虚拟机运行时数据区结构如图所示 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 多线程切换时&#xff0c;为了能恢复到正确的执行位置&#xff0c;每条线程…

[Python学习笔记]Python 性能分析

在上一章节 [Python学习笔记]Requests性能优化之Session 中&#xff0c;通过在 Resquests 中使用 session&#xff0c;将 Python 脚本的运行效率提升了 3 倍。但当时对问题的排查主要是基于程序实现逻辑的推断&#xff0c;并没有实质性的证据。 本次使用 Python 的性能分析工具…

【每日一题】最长奇偶子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;枚举方法二&#xff1a;一次遍历 其他语言python3 写在最后 Tag 【一次遍历】【枚举】【数组】【2023-11-16】 题目来源 2760. 最长奇偶子数组 解题思路 方法一&#xff1a;枚举 本题有多种方法可以解决&#xff0c;最朴素的…

如何有效防止公司内部的信息泄露?

信息泄露对公司可能带来严重影响&#xff0c;因此采取一系列措施以确保信息安全至关重要。以下是一些建议&#xff1a; 部署综合的防泄密软件&#xff1a; 在公司内部&#xff0c;使用专业的防泄密软件如华企盾DSC系统&#xff0c;涵盖文件加密、U盘管控、桌面行为管理、日志审…

极智AI | Realtime Multi-Person人体姿态估计之OpenPose

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 Realtime Multi-Person人体姿态估计之OpenPose。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq OpenPose 主要是…

qt使用AES加密、解密字符串

一、AES算法 AES (Advanced Encryption Standard) 是一种对称加密算法&#xff0c;是目前被广泛使用的数据加密标准之一。该算法旨在取代DES (Data Encryption Standard) 算法。AES最初由比利时密码学家 Joan Daemen 和 Vincent Rijmen 提出&#xff0c;经过多年的演化、改进和…

TSINGSEE青犀智慧机房AI+视频智能监管方案,保障机房设备稳定运转

一、背景与需求分析 随着互联网的高速发展&#xff0c;机房数量及配套环境设备日益增多&#xff0c;其运行状况直接决定着企业组织的运营效率和服务质量。作为企业信息化的核心&#xff0c;机房的安全监测与管理&#xff0c;不仅关系到企业的稳定运转&#xff0c;同时也关系到…

jffs2文件系统(二)

本篇文章讲解一下如何制作jffs2文件系统&#xff0c;以及如何在linux下把jffs2作为根文件系统使用。 文件系统制作 制作工具&#xff1a;mtd_utils&#xff0c;可以自己安装 mkfs.jffs2 -o root-uclibc-jffs2 -r root-uclibc -e 0x10000 -s 0x1000 -n -l -X zlib --pad0x10000…

(珍藏版)Redis经典面试题32道,吊打面试官!

文章目录 Redis最新2023年面试题高级面试题及附答案解析(3)01、请用 Redis 和任意语言实现一段恶意登录保护的代码&#xff1f;02、Pipeline 有什么好处&#xff0c;为什么要用 pipeline&#xff1f;03、Redis 常用管理命令有哪些&#xff1f;04、Redis 持久化数据和缓存怎么做…

避坑指南!!在树莓派4b上安装Pycharm以及无法使用终端的问题解决!!

一、下载Pycharm–linux安装包 这里是踩的第一个坑&#xff0c;一开始我下载的是pycharm2023-linux版本的。后面发现缺少很多东西&#xff0c;安装不成功。后面下载了低版本的Pycharm才可以。我下载的是2020版本的。注意&#xff1a;在下载安装包时&#xff0c;一定要在window…

ECRS工时分析软件:全面提升生产效率和产能管理的利器

在当今高度竞争的商业环境中&#xff0c;企业需要不断提升生产效率和产能管理以保持竞争优势。ECRS工时分析软件作为一款专业的工具&#xff0c;通过自动导出各种表格和图表&#xff0c;全面涵盖了生产过程中的各种分析和改善活动&#xff0c;为企业提供了提升生产效率和产能管…

思维导图软件 Xmind mac中文版特点介绍

XMind 2022 mac是一款思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 XMind mac软件特点 - 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同用户的需求。 - 强大的功能和工具&…

基于单片机的自动变速箱电控系统

**单片机设计介绍&#xff0c; 基于单片机的自动变速箱电控系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的自动变速箱电控系统是一种通过单片机来控制车辆自动变速箱的系统。它借助传感器和单片机的协同工作&am…

MATLAB 模糊设计器 构建 模糊系统

系列文章目录 文章目录 系列文章目录前言一、创建 FIS 结构二、定义输入变量三、定义输出变量四、定义成员函数五、定义规则库六、设计分析七、存储和修改设计八、导出 FIS总结 前言 本例演示如何使用 Fuzzy Logic Designer 应用程序交互式创建 1 型 Mamdani 模糊推理系统&…

知乎怎么快速涨粉?15个实用方法让你迅速积累粉丝

**一、自我介绍** 大家好&#xff0c;我是知乎上的一个普通用户&#xff0c;我在这篇文章中将会分享一些关于如何涨粉的最实用的方法。我相信&#xff0c;只要你们按照这些方法去做&#xff0c;你们也会像我一样&#xff0c;迅速积累起大量的粉丝。 **二、方法分享** **1. 优…

VB.net WebBrowser网页元素抓取分析方法

在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…

文件包含_常见文件包含情况

文件包含系列 相关函数 分类 实践 包含实现的场景