C#【进阶】俄罗斯方块

news2024/11/15 19:59:02

俄罗斯方块

文章目录

      • Test1_场景切换相关
        • BeginScene.cs
        • BegionOrEndScene.cs
        • EndScene.cs
        • Game.cs
        • GameScene.cs
        • ISceneUpdate.cs
      • Test2_绘制对象基类和枚举信息
        • DrawObject.cs
        • IDraw.cs
        • Position.cs
      • Test3_地图相关
        • Map.cs
      • Test4_坐标信息类
        • BlockInfo.cs
      • Test5_板砖工人类
        • BlockWorker.cs
      • Test6_输入模块
        • InputThread.cs
      • Program.cs

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Test1_场景切换相关

BeginScene.cs
namespace CSharp俄罗斯方块
{
    internal class BeginScene : BegionOrEndScene
    {
        public BeginScene()
        {
            strTitle = "俄罗斯方块";
            strOne = "开始游戏";
        }
        public override void EnterJDoSomthing()
        {
            if (nowSelIndex == 0)
            {
                Game.ChangeScene(E_SceneType.Game);
            }
            else
            {
                Environment.Exit(0);
            }
        }
    }
}

BegionOrEndScene.cs
namespace CSharp俄罗斯方块
{
    abstract internal class BegionOrEndScene : ISceneUpdate
    {
        protected int nowSelIndex = 0;
        protected string strTitle;
        protected string strOne;

        public abstract void EnterJDoSomthing();
        public void Update()
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.SetCursorPosition(Game.w / 2 - strTitle.Length, 5);
            Console.Write(strTitle);

            Console.SetCursorPosition(Game.w / 2 - strOne.Length, 8);
            Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
            Console.Write(strOne);

            Console.SetCursorPosition(Game.w / 2 - 4, 10);
            Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
            Console.Write("结束游戏");

            switch(Console.ReadKey(true).Key)
            {
                case ConsoleKey.W:
                    nowSelIndex--;
                    if (nowSelIndex < 0)
                    {
                        nowSelIndex = 1;
                    }
                    break;
                case ConsoleKey.S:
                    nowSelIndex++;
                    if (nowSelIndex > 1)
                    {
                        nowSelIndex = 0;
                    }
                    break;
                case ConsoleKey.J:
                    EnterJDoSomthing();
                    break;
            }
        }
    }
}

EndScene.cs
namespace CSharp俄罗斯方块
{
    internal class EndScene : BegionOrEndScene
    {
        public EndScene()
        {
            strTitle = "结束游戏";
            strOne = "回到开始界面";
        }
        public override void EnterJDoSomthing()
        {
            if(nowSelIndex == 0)
            {
                Game.ChangeScene(E_SceneType.Begin);
            }
            else
            {
                Environment.Exit(0);
            }
        }
    }
}

Game.cs
namespace CSharp俄罗斯方块
{
    enum E_SceneType
    {
        Begin,
        Game,
        End,
    }
    internal class Game
    {
        public const int w = 50;
        public const int h = 35;

        public static ISceneUpdate nowScene;

        public Game()
        {
            Console.CursorVisible = false;
            Console.SetWindowSize(w, h);
            Console.SetBufferSize(w, h);

            ChangeScene(E_SceneType.Begin);
        }

        public void start()
        {
            while (true)
            {
                if (nowScene != null)
                {
                    nowScene.Update();
                }
            }
        }

        public static  void ChangeScene(E_SceneType type)
        {
            Console.Clear();
            switch (type)
            {
                case E_SceneType.Begin:
                    nowScene = new BeginScene();
                    break;
                case E_SceneType.Game:
                    nowScene = new GameScene();
                    break;
                case E_SceneType.End:
                    nowScene = new EndScene();
                    break;
            }
        }
    }

}

GameScene.cs
namespace CSharp俄罗斯方块
{
    internal class GameScene : ISceneUpdate
    {
        Map map;

        BlockWorker blockWorker;

        //bool isRunning;

        //新开线程
        //Thread inputThread;

        public GameScene()
        {
            map = new Map(this);
            blockWorker = new BlockWorker();

            InputThread.Instance.inputEvent += CheckInputThread;

            //isRunning = true;
            //inputThread = new Thread(CheckInputThread);
            设置成后台线程(生命周期随主线程)
            //inputThread.IsBackground = true;
            开启线程
            //inputThread.Start();
        }

        public void StopThread()
        {
            //isRunning = false;
            //inputThread = null;
            //移除输入事件监听
            InputThread.Instance.inputEvent -= CheckInputThread;
        }
        private void CheckInputThread()
        {
            //while (isRunning)
            //{
                //检测输入,防止输入卡程序
                if (Console.KeyAvailable)
                {
                    //避免影响主线程,在输入后加锁
                    lock (blockWorker)
                    {
                        switch (Console.ReadKey(true).Key)
                        {
                            case ConsoleKey.LeftArrow:
                                //判断变形
                                if (blockWorker.CanChange(E_Change_Type.Left, map))
                                    blockWorker.Change(E_Change_Type.Left);
                                break;
                            case ConsoleKey.RightArrow:
                                if (blockWorker.CanChange(E_Change_Type.Right, map))
                                    blockWorker.Change(E_Change_Type.Right);
                                break;
                            case ConsoleKey.A:
                                if (blockWorker.CanMoveR_L(E_Change_Type.Left, map))
                                    blockWorker.MoveR_L(E_Change_Type.Left);
                                break;
                            case ConsoleKey.D:
                                if (blockWorker.CanMoveR_L(E_Change_Type.Right, map))
                                    blockWorker.MoveR_L(E_Change_Type.Right);
                                break;
                            case ConsoleKey.S:
                                if (blockWorker.CanDown(map))
                                    blockWorker.AutoMove();
                                break;
                        }
                    }
                }
            //}
        }
        public void Update()
        {
            lock (blockWorker)
            {
                map.Draw();
                blockWorker.Draw();

                if (blockWorker.CanDown(map))
                    blockWorker.AutoMove();
            }

            //线程休眠减速
            Thread.Sleep(100);


        }
    }
}

ISceneUpdate.cs
namespace CSharp俄罗斯方块
{
    /// <summary>
    /// 场景更新接口
    /// </summary>
    internal interface ISceneUpdate
    {
        void Update();
    }
}

Test2_绘制对象基类和枚举信息

DrawObject.cs
namespace CSharp俄罗斯方块
{
    /// <summary>
    /// 绘制类型
    /// </summary>
    enum E_DrawType
    {
        /// <summary>
        /// 墙壁
        /// </summary>
        Wall,
        /// <summary>
        /// 正方形方块
        /// </summary>
        Cube,
        /// <summary>
        /// 直线
        /// </summary>
        Line,
        /// <summary>
        /// 坦克
        /// </summary>
        Tank,
        /// <summary>
        /// 左梯子
        /// </summary>
        Left_Ladder,
        /// <summary>
        /// 右梯子
        /// </summary>
        Right_Ladder,
        /// <summary>
        /// 左长梯子
        /// </summary>
        Left_Long_ladder,
        /// <summary>
        /// 右长梯子
        /// </summary>
        Right_Long_ladder,

    }
    internal class DrawObject : IDraw
    {
        public Position pos;

        public E_DrawType type;

        public DrawObject(E_DrawType type)
        {
            this.type = type;
        }
        public DrawObject(E_DrawType type, int x, int y) : this(type)
        {
            pos = new Position(x, y);
        }

        public void Draw()
        {
            if (pos.y < 0)
                return;
            Console.SetCursorPosition(pos.x, pos.y);
            switch (type)
            {
                case E_DrawType.Wall:
                    Console.ForegroundColor = ConsoleColor.Red;
                    break;
                case E_DrawType.Cube:
                    Console.ForegroundColor = ConsoleColor.Blue;
                    break;
                case E_DrawType.Line:
                    Console.ForegroundColor = ConsoleColor.Green;
                    break;
                case E_DrawType.Tank:
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    break;
                case E_DrawType.Left_Ladder:
                case E_DrawType.Right_Ladder:
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    break;
                case E_DrawType.Left_Long_ladder:
                case E_DrawType.Right_Long_ladder:
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    break;
            }
            Console.Write("■");
        }

        //擦除
        public void ClearDraw()
        {
            if (pos.y < 0)
                return;
            Console.SetCursorPosition(pos.x, pos.y);
            Console.Write("  ");
        }

        /// <summary>
        /// 附着墙壁方法
        /// </summary>
        /// <param name="type"></param>
        public void ChangeType(E_DrawType type)
        {
            this.type = type;
        }
    }
}

IDraw.cs
namespace CSharp俄罗斯方块
{
    internal interface IDraw
    {
        void Draw();
    }
}

Position.cs
namespace CSharp俄罗斯方块
{
    internal struct Position
    {
        public int x;
        public int y;

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

        public static bool operator ==(Position left, Position right)
        {
            if (left.x == right.x && left.y == right.y) { return true; }
            return false;
        }
        public static bool operator !=(Position left, Position right)
        {
            if (left.x == right.x && left.y == right.y) { return false; }
            return true;
        }

        public static Position operator +(Position left, Position right)
        {
            return new Position(left.x + right.x, left.y + right.y);
        }
    }

}

Test3_地图相关

Map.cs
namespace CSharp俄罗斯方块
{
    internal class Map : IDraw
    {
        //固定墙壁
        private List<DrawObject> walls = new List<DrawObject>();

        //动态墙壁
        public List<DrawObject> dynamicWalls = new List<DrawObject>();

        private GameScene nowGameScene;

        //为了外部能快速得到地图边界
        //动态墙壁的宽容量,小方块横向个数
        public int w;
        public int h;

        //记录每一行有多少个小方块的容器,索引就是行号
        private int[] recordInfo;
        public Map(GameScene scene)
        {
            nowGameScene = scene;
            h = Game.h - 6;
            recordInfo = new int[h];
            w = 0;
            //绘制横向墙壁
            for (int i = 0; i < Game.w; i += 2)
            {
                walls.Add(new DrawObject(E_DrawType.Wall, i, h));
                w++;
            }
            w -= 2;

            for (int i = 0; i < h; i++)
            {
                walls.Add(new DrawObject(E_DrawType.Wall, 0, i));
                walls.Add(new DrawObject(E_DrawType.Wall, Game.w - 2, i));
            }
        }

        public void Draw()
        {
            for (int i = 0; i < walls.Count; i++)
            {
                walls[i].Draw();
            }

            for (int i = 0; i < dynamicWalls.Count; i++)
            {
                dynamicWalls[i].Draw();
            }
        }
        public void ClearDraw()
        {
            for (int i = 0; i < dynamicWalls.Count; i++)
            {
                dynamicWalls[i].ClearDraw();
            }
        }

        public void AddWalls(List<DrawObject> walls)
        {
            for (int i = 0; i < walls.Count; i++)
            {
                //掉下来的方块变成墙壁类型
                walls[i].ChangeType(E_DrawType.Wall);
                dynamicWalls.Add(walls[i]);

                if (walls[i].pos.y<=0)
                {
                    nowGameScene.StopThread();
                    Game.ChangeScene(E_SceneType.End);
                    return;
                }

                //进行添加动态墙壁行的计数
                recordInfo[h - walls[i].pos.y - 1]++;
            }
            ClearDraw();
            CheckClear();
            Draw();

        }

        /// <summary>
        /// 检测是否跨层
        /// </summary>
        public void CheckClear()
        {
            //遍历时安全移除,添加待移除数组
            List<DrawObject> delList = new List<DrawObject>();
            //要选择记录行中有多少个方块的容器
            //数组判断这一行是否满
            //遍历数组,检测数组里面存的数是不是w-2
            for (int i = 0; i < recordInfo.Length; i++)
            {
                //如果这行满了需要移除
                if (recordInfo[i] == w)
                {
                    //1、这一行的所有方块移除
                    for (int j = 0; j < dynamicWalls.Count; j++)
                    {
                        //通过动态方块的y计算它在哪一行
                        if (i == h - dynamicWalls[j].pos.y - 1)
                        {
                            //待移除添加到记录列表
                            delList.Add(dynamicWalls[j]);
                        }
                        //2、要这一行之上的所有方块下移
                        else if (h - dynamicWalls[j].pos.y - 1 > i)
                        {
                            dynamicWalls[j].pos.y++;
                        }
                    }
                    //移除待删小方块
                    for (int j = 0;j < delList.Count; j++)
                    {
                        dynamicWalls.Remove(delList[j]);
                    }
                    //3、记录小方块数量的数组从上到下迁移
                    for (int j = i; j < recordInfo.Length-1; j++)
                    {
                        recordInfo[j] = recordInfo[j + 1];
                    }
                    //置空最顶层
                    recordInfo[recordInfo.Length - 1] = 0;
                    //利用递归,一层一层检测
                    CheckClear();
                    break;
                }
            }
        }
    }
}

Test4_坐标信息类

在这里插入图片描述
在这里插入图片描述

BlockInfo.cs
namespace CSharp俄罗斯方块
{
    internal class BlockInfo
    {
        private List<Position[]> list;

        public BlockInfo(E_DrawType type)
        {
            list = new List<Position[]>();

            switch (type)
            {
                case E_DrawType.Cube:
                    list.Add(new Position[3] { new Position(2, 0), new Position(0, 1), new Position(2, 1) });
                    break;
                case E_DrawType.Line:
                    list.Add([new Position(0, -1), new Position(0, 1), new Position(0, 2)]);
                    list.Add([new Position(-4, 0), new Position(-2, 0), new Position(2, 0)]);
                    list.Add([new Position(0, -2), new Position(0, -1), new Position(0, 1)]);
                    list.Add([new Position(-2, 0), new Position(2, 0), new Position(4, 0)]);
                    break;
                case E_DrawType.Tank:
                    list.Add([new Position(-2, 0), new Position(2, 0), new Position(0, 1)]);
                    list.Add([new Position(0, -1), new Position(-2, 0), new Position(0, 1)]);
                    list.Add([new Position(0, -1), new Position(-2, 0), new Position(2, 0)]);
                    list.Add([new Position(0,-1), new Position(2, 0), new Position(0, 1)]);
                    break;
                case E_DrawType.Left_Ladder:
                    list.Add([new Position(0, -1), new Position(2, 0), new Position(2, 1)]);
                    list.Add([new Position(2, 0), new Position(-2, 1), new Position(0, 1)]);
                    list.Add([new Position(-2, -1), new Position(-2, 0), new Position(0, 1)]);
                    list.Add([new Position(0, -1), new Position(2, -1), new Position(-2, 0)]);
                    break;
                case E_DrawType.Right_Ladder:
                    list.Add([new Position(0, -1), new Position(-2, 0), new Position(-2, 1)]);
                    list.Add([new Position(-2, -1), new Position(0, -1), new Position(2, 0)]);
                    list.Add([new Position(2, -1), new Position(2, 0), new Position(0, 1)]);
                    list.Add([new Position(-2, 0), new Position(0, 1), new Position(2, 1)]);
                    break;
                case E_DrawType.Left_Long_ladder:
                    list.Add([new Position(-2, -1), new Position(0, -1), new Position(0, 1)]);
                    list.Add([new Position(2, 1), new Position(-2, 0), new Position(2, 0)]);
                    list.Add([new Position(0, -1), new Position(0, 1), new Position(2, 1)]);
                    list.Add([new Position(-2, 0), new Position(2, 0), new Position(-2, 1)]);
                    break;
                case E_DrawType.Right_Long_ladder:
                    list.Add([new Position(0, -1), new Position(2, -1), new Position(0, 1)]);
                    list.Add([new Position(-2, 0), new Position(2, 1), new Position(2, 0)]);
                    list.Add([new Position(0, -1), new Position(0, 1), new Position(-2, 1)]);
                    list.Add([new Position(-2, 0), new Position(2, 0), new Position(-2, -1)]);
                    break;
                default:
                    break;
            }
        }

        public Position[] this[int index]
        {
            get
            {
                if (index < 0)
                    return list[0];
                else if (index >= list.Count)
                    return list[list.Count - 1];
                else
                    return list[index];
                
            }
        }

        public int Count { get => list.Count; }
    }
}

Test5_板砖工人类

BlockWorker.cs
namespace CSharp俄罗斯方块
{
    enum E_Change_Type
    {
        Left,
        Right,
    }
    internal class BlockWorker : IDraw
    {
        //方块们
        private List<DrawObject> blocks;
        //用Dictionary方便查找
        private Dictionary<E_DrawType, BlockInfo> blockInfoDic;
        //随机创建的方块具体形态信息
        private BlockInfo nowBlockInfo;
        //当前形态的索引
        private int nowInfoIndex;

        public BlockWorker()
        {
            blockInfoDic = new Dictionary<E_DrawType, BlockInfo>()
            {
                { E_DrawType.Cube,new BlockInfo(E_DrawType.Cube)},
                { E_DrawType.Line,new BlockInfo(E_DrawType.Line)},
                { E_DrawType.Tank,new BlockInfo(E_DrawType.Tank)},
                { E_DrawType.Left_Ladder,new BlockInfo(E_DrawType.Left_Ladder)},
                { E_DrawType.Right_Ladder,new BlockInfo(E_DrawType.Right_Ladder)},
                { E_DrawType.Left_Long_ladder,new BlockInfo(E_DrawType.Left_Long_ladder)},
                { E_DrawType.Right_Long_ladder,new BlockInfo(E_DrawType.Right_Long_ladder)},
            };
            RandomCreatBlock();
        }

        public void Draw()
        {
            for (int i = 0; i < blocks.Count; i++)
            {
                blocks[i].Draw();
            }
        }

        /// <summary>
        /// 随机创建方块
        /// </summary>
        public void RandomCreatBlock()
        {
            Random r = new Random();
            E_DrawType type = (E_DrawType)r.Next(1, 8);
            blocks = new List<DrawObject>()
            {
                new DrawObject(type),
                new DrawObject(type),
                new DrawObject(type),
                new DrawObject(type),
            };
            //定义0,0相对坐标
            blocks[0].pos = new Position(24, -5);

            nowBlockInfo = blockInfoDic[type];
            //随机当前形态
            nowInfoIndex = r.Next(0, nowBlockInfo.Count);
            //取出原点坐标信息
            Position[] pos = nowBlockInfo[nowInfoIndex];
            for (int i = 0; i < pos.Length; i++)
            {
                //通过原点坐标信息绘制四个方块
                blocks[i + 1].pos = pos[i] + blocks[0].pos;
            }
        }

        //擦除方法
        public void ClearDraw()
        {
            for (int i = 0; i < blocks.Count; i++)
            {
                blocks[i].ClearDraw();
            }
        }
        /// <summary>
        /// 方块变形
        /// </summary>
        /// <param name="type">左,右</param>
        public void Change(E_Change_Type type)
        {
            //擦除之前的方块
            ClearDraw();

            switch (type)
            {
                case E_Change_Type.Left:
                    nowInfoIndex--;
                    if (nowInfoIndex < 0)
                        nowInfoIndex = nowBlockInfo.Count - 1;
                    break;
                case E_Change_Type.Right:
                    nowInfoIndex++;
                    if (nowInfoIndex >= nowBlockInfo.Count)
                        nowInfoIndex = 0;
                    break;
            }
            //得到索引,取出来
            Position[] pos = nowBlockInfo[nowInfoIndex];
            for (int i = 0; i < pos.Length; i++)
            {
                blocks[i + 1].pos = pos[i] + blocks[0].pos;
            }

            //擦除之后绘制
            Draw();
        }
        /// <summary>
        /// 判断能否变形
        /// </summary>
        /// <param name="type">地图方向</param>
        /// <param name="map">地图墙壁</param>
        /// <returns></returns>
        public bool CanChange(E_Change_Type type, Map map)
        {
            //临时变量用来模拟
            int nowIndex = nowInfoIndex;
            switch (type)
            {
                case E_Change_Type.Left:
                    nowIndex--;
                    if (nowIndex < 0)
                        nowIndex = nowBlockInfo.Count - 1;
                    break;
                case E_Change_Type.Right:
                    nowIndex++;
                    if (nowIndex >= nowBlockInfo.Count)
                        nowIndex = 0;
                    break;
            }
            //临时索引信息判断是否和墙壁重合
            Position[] nowPos = nowBlockInfo[nowIndex];

            //判断是否超出地图边界
            Position tempPos;
            for (int i = 0; i < nowPos.Length; i++)
            {
                tempPos = blocks[0].pos + nowPos[i];
                if (tempPos.x < 2 || tempPos.x >= Game.w - 2 || tempPos.y >= map.h)
                {
                    return false;
                }
            }
            //判断是否和其他方块重合
            for (int i = 0; i < nowPos.Length; i++)
            {
                tempPos = blocks[0].pos + nowPos[i];
                for (int j = 0; j < map.dynamicWalls.Count; j++)
                {
                    if (tempPos == map.dynamicWalls[j].pos)
                    {
                        return false;
                    }
                }
            }
            return true;
        }
        /// <summary>
        /// 方块左右移动
        /// </summary>
        /// <param name="type">左,右</param>
        public void MoveR_L(E_Change_Type type)
        {
            //移动之前擦除
            ClearDraw();
            //根据传入的类型,决定左右移动,得到偏移位置
            Position movePos = new Position(type == E_Change_Type.Left ? -2 : 2, 0);
            for (int i = 0; i < blocks.Count; i++)
            {
                blocks[i].pos += movePos;
            }

            //移动之后绘制
            Draw();
        }

        /// <summary>
        /// 判断能否移动
        /// </summary>
        /// <param name="type">左,右移动</param>
        /// <returns></returns>
        public bool CanMoveR_L(E_Change_Type type, Map map)
        {
            Position movePos = new Position(type == E_Change_Type.Left ? -2 : 2, 0);
            //左右边界重合,预判断pos
            Position pos;
            for (int i = 0; i < blocks.Count; i++)
            {
                pos = blocks[i].pos + movePos;
                if (pos.x < 2 || pos.x >= Game.w - 2)
                    return false;
            }
            //动态方块重合
            for (int i = 0; i < blocks.Count; i++)
            {
                pos = blocks[i].pos + movePos;
                for (int j = 0; j < map.dynamicWalls.Count; j++)
                {
                    if (pos == map.dynamicWalls[j].pos)
                        return false;
                }
            }
            return true;
        }

        //方块自动下落
        public void AutoMove()
        {
            ClearDraw();
            Position downMove = new Position(0, 1);
            for (int i = 0; i < blocks.Count; i++)
            {
                blocks[i].pos += downMove;
            }
            Draw();
        }
        public bool CanDown(Map map)
        {
            Position downPos = new Position(0, 1);
            //预下落位置
            Position pos;
            //边界
            for (int i = 0; i < blocks.Count; i++)
            {
                pos = blocks[i].pos + downPos;
                if (pos.y >= map.h)
                {
                    //碰到地图,此时变成地图的一部分
                    map.AddWalls(blocks);
                    //创建新的随机方块
                    RandomCreatBlock();
                    return false;
                }
            }
            //动态方块
            for (int i = 0; i < blocks.Count; i++)
            {
                pos = blocks[i].pos + downPos;
                for (int j = 0; j < map.dynamicWalls.Count; j++)
                {
                    if (pos == map.dynamicWalls[j].pos)
                    {
                        //碰到方块,此时变成地图的一部分
                        map.AddWalls(blocks);
                        RandomCreatBlock();
                        return false;
                    }
                }
            }

            return true;
        }


    }
}

Test6_输入模块

InputThread.cs
namespace CSharp俄罗斯方块
{
    internal class InputThread
    {

        //线程成员变量
        Thread inputThread;
        //输入检测事件
        public event Action inputEvent;

        private static InputThread instance = new InputThread();
        public static InputThread Instance
        {
            get
            {
                return instance;
            }
        }
        private InputThread()
        { 
            inputThread = new Thread(InputCheck);
            inputThread.IsBackground = true;
            inputThread.Start();
        }
        private void InputCheck()
        {
            while (true)
            {
                inputEvent?.Invoke();
            }
        }
    }
}

Program.cs

using CSharp俄罗斯方块;

Game game = new Game();
game.start();

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

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

相关文章

红队技巧:仿冒Windows登录

Metasploit框架&#xff1a;phish_windows_credentials Metasploit带有内置的后期漏洞利用功能&#xff0c;可帮助我们完成任务。由于它是后渗透的模块&#xff0c;因此只需要输入会话即可&#xff1a; use post/windows/gather/phish_windows_credentials set session 1 …

数字信封:保护数据传输的现代安全机制

在数字化时代&#xff0c;数据安全和隐私保护变得尤为重要。随着网络攻击和数据泄露事件的日益增多&#xff0c;传统的加密方法已经难以满足日益增长的安全需求。数字信封&#xff08;Digital Envelope&#xff09;作为一种有效的数据保护技术&#xff0c;提供了一种安全的数据…

视频监控技术前沿探索:智能化趋势与EasyCVR视频汇聚技术应用

在数字化时代的浪潮中&#xff0c;视频监控技术以其独特的优势&#xff0c;正在安防领域书写着新的篇章。它不仅为公共安全部门提供了强大的技术支持&#xff0c;还深入到教育、政府、娱乐、医疗、酒店、运动等多个领域&#xff0c;成为维护社会秩序、保障人民安全的重要工具。…

一套最完整的无人值守配电站房智能辅助监控系统(实用收藏版)

要真正了解无人值守配电室的运行模式&#xff0c;我们必须正确理解“无人值守”。“无人值守”与员工管理真正分离&#xff0c;但借助技术设备&#xff0c;无人值守配电站房智能辅助监控系统通过人机合理协调&#xff0c;确保配电室的正常运行。 通过无人值守配电站房智能辅助…

2024年6月PMP考试考前冲刺攻略

调整心态 考场就像战场一样&#xff0c;不仅是实力的较量&#xff0c;更是心理素质的较量。如果感到过于焦虑&#xff0c;可以通过运动等方式来缓解&#xff0c;也可以多与家人、朋友和老师沟通。只有稳定心态才能发挥出最大的实力&#xff01; 高效学习方法 课本是基础&…

【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言随机查询语…

4.共享文件夹的设置

注&#xff1a;设置共享文件夹&#xff1a;首先要先关机 一、点击 编辑虚拟机设置 二、点击 选项 选项卡 三、点击 共享文件夹 四、在本地建立一个共享文件夹后选择路径 五、Linux系统文件夹中的共享文件夹路径 六、在Linux系统中查看共享文件夹 Ubuntushare是共享文件夹&…

protobuf —— 快速上手

protobuf —— 快速上手 创建 .proto 文件添加注释指定proto3语法package 声明符定义消息&#xff08;message&#xff09; 定义消息字段字段定义基本格式字段名称命名规范字段类型字段唯一编号示例 转换关系示例&#xff1a;增加姓名和年龄字段 字段唯一编号字段编号范围编码效…

ADC模数转换器的简介及参数详解

ADC全称是Analog-to-Digital Converter模数转换器&#xff0c;一般我们把模拟信号(Analog signal) 用A来进行简写&#xff0c;数字信号(digital signal) 用D来表示。是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 今天我们主要说ADC的参数&#xff0c;我们把…

安全阀检测要求标准:如何提高检测效率与准确性?

安全阀&#xff0c;作为承压设备的重要保护元件&#xff0c;其性能的稳定性和可靠性直接关系到设备的运行安全。 因此&#xff0c;对安全阀进行定期、规范的检测显得尤为重要。接下来&#xff0c;佰德将围绕安全阀的检测要求标准&#xff0c;从检测前准备工作到检测报告与记录…

【网络服务】正向代理和反向代理到底是什么意思

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 前言 在学习和…

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…

使用虚拟卡注册亚马逊店铺亲测墨西哥、北美都可以亲测~~

这几天测试了使用虚拟信用卡注册墨西哥与北美站的店铺&#xff0c;成功下店&#xff0c;总有人说会被扫&#xff0c;其实去年12月费就有使用卡注册店铺&#xff0c;至今还是好的 当然也不是完全都没有可能店铺不会挂&#xff0c;挂的时候提供账单就好了&#xff0c;直接找客服…

设计模式——工厂三兄弟之简单工厂

1.业务需求 ​ 大家好&#xff0c;我是菠菜。在介绍这期简单工厂设计模式前&#xff0c;我们先来看看这样的需求&#xff1a;制作一个简单的计算器&#xff0c;能够实现控制台输入俩个数以及运算符完成运算。 2.初步实现 实现第一版思路&#xff1a; ​ 创建计算器类&…

k8s污点及容忍度+实践

k8s污点及容忍度实践 前言 一、标签、注解和污点1、如何查询污点及一个容器或者工作负载的标签注解a、通过describe命令查看一个节点的详细信息 2、标签查询修改 二、污点和容忍度容忍度&#xff08;Tolerations&#xff09;2、taint / label命令及解释 三、为应用程序设置干扰…

NameSilo + Cloudflare 给网站加个域名(附 NameSilo 购买域名优惠码)

网站做好了之后,下一步就是买域名 在国内买域名的话,还需要备案,个人名下备案好像是还有限制,我就去 NameSilo 上面买的 在买之前,对比过几家 比如: godaddy/namecheap/cloudflare 本来是倾向于在 godaddy 上面买的,因为它支持支付宝支付,但是在详细看的时候,发现如果购买一年…

腾讯云COS上传文件出现的问题

1、没有配置 ObjectMetadata 的文件长度 腾讯云COS上传文件出现数据损坏问题_no content length specified for stream data. strea-CSDN博客 2、 使用 FileInputStream使用完没有及时关闭导致报错 ClientAbortException: java.nio.channels.ClosedChannelException 添加…

AI Agent:自主性、反应性与交互性的融合,将颠覆软件行业

Agent来袭&#xff1a;AI如何变身软件界的超级英雄&#xff1f; ©作者|Zhongmei 来源|神州问学 前言 “AI Agent不仅会彻底改变计算机的使用方式&#xff0c;它还将颠覆软件行业&#xff0c;是一个对科技行业的冲击波&#xff0c;是一场自‘输入命令到点击图标’变革之后…

266 基于matlab的FCM+KFCM模糊C均值聚类分析算法

基于matlab的FCMKFCM模糊C均值聚类分析算法&#xff0c;输入分割对象&#xff0c;对分割对象进行参数设置&#xff0c;包括分割类别数&#xff0c;核参数。输出分割结果。具有GUI操作界面。程序已调通&#xff0c;可直接运行。 266 FCM KFCM 模糊C均值聚类 GUI - 小红书 (xiaoh…

站内信设计

参考文章&#xff1a;https://cloud.tencent.com/developer/article/1684449 b站站内信业务设计&#xff1a; 消息的类型分为&#xff1a; 1、系统消息 2、、点赞、回复等用户行为之间的消息(事件提醒) 3、用户之间的消息 系统消息 用一个用户消息表可以吗&#xff1f; 可…