【C#项目实战】控制台游戏 勇士斗恶龙(2)——游戏场景的设置以及玩家战斗逻辑

news2024/11/25 3:03:34

在这里插入图片描述

君兮_的个人主页

即使走的再远,也勿忘启程时的初心

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,最近开始正式的步入学习游戏开发的正轨,想要通过写博客的方式来分享自己学到的知识和经验,这就是开设本专栏的目的。希望这些独立的C#小项目能对做游戏的你有所帮助,毕竟学会游戏开发的最好的上手方式就是自己做一款游戏!!

勇士斗恶龙

  • 前言
  • 一.游戏场景的初始化
    • 1.不变场景的初始化
    • 2.玩家以及BOSS属性相关设置
  • 二.玩家移动以及战斗逻辑
    • 1.玩家的移动
      • 玩家移动的边界问题
    • 2.战斗相关代码逻辑
      • 怎么进入战斗
      • 战斗逻辑
  • 三. 游戏源码
  • 总结

前言

  • 今天我们接着来讲勇士斗恶龙的第二部分,上回咱们讲过了有关开始界面的实现以及控制台的初始化,这次我们来讲讲这个小游戏的核心内容游戏场景的初始化以及玩家的移动以及和BOSS的战斗相关代码的实现
  • 还是先把咱们游戏的整体流程图放在这里
    在这里插入图片描述

一.游戏场景的初始化

  • 上回我们说实现界面之间的转换,只需要一个while+switch就能实现 此时我们把nowSceneID(游戏场景编号)改为2, 开始对我们的游戏场景进行编辑。
  • 首先呢,我们得先把最基础的那些不需要每次都发生变化的东西先设置好

1.不变场景的初始化

  • 在这个游戏场景中,不需要我们每次都发生变化的无疑是四周的红墙了,我们优先先把这些红墙给设置好
    在这里插入图片描述
 Console.Clear();
 #region 4 不变的红墙
 //设置颜色为红色
 Console.ForegroundColor = ConsoleColor.Red;
 //画墙
 //上方墙
 for (int i = 0; i < w; i += 2)
 {
     //上方墙
     Console.SetCursorPosition(i, 0);
     Console.Write("■");
     //下方墙
     Console.SetCursorPosition(i, h - 1);
     Console.Write("■");
     //中间墙
     Console.SetCursorPosition(i, h - 6);
     Console.Write("■");
 }
 //左边的墙
 for (int i = 0; i < h; i++)
 {
     //左边的墙
     Console.SetCursorPosition(0, i);
     Console.Write("■");
     //右边的墙
     Console.SetCursorPosition(w - 2, i);
     Console.Write("■");
 }
#endregion
  • 非常简单啊,就是通过循环把设置好位置颜色的墙打印在控制台界面上,这里就不细讲了。
  • 唯一需要注意的是 对于控制台来说,一单位纵轴等于二单位的横轴,所以每次横轴要想与纵轴对应,是一次跳过两个格子的,同时我们要考虑的边界问题,注意这里红墙如果不专门设置位置左上角为(0,0) 因此我们的横轴设置的最右边的边界为w-2,最下面的边界为h-1。(如果你不理解这段话的话,自己敲代码的时候边界改成别的参数试一下,你就能清晰透彻这里这样做的原因了)

2.玩家以及BOSS属性相关设置

  • 在开始相关游戏逻辑讲解前,我们先来对游戏中的玩家和BOSS进行一下初始化,设置一下位置,以及角色对应的表示的图标
  • 同时呢,我们的玩家和BOSS是需要进行战斗的,我们在初始化的时候也需要设置一下血量和两者的攻击力方便之后战斗逻辑的编写()
#region 5 boss属性相关
//boss坐标
int bossX = 24;
int bossY = 15;
//boss攻击力的最大最小值
int bossAtkMin = 7;
int bossAtkMax = 13;
//boss血量
int bossHp = 100;
string bossIcon = "■";
//申明一个 颜色变量
ConsoleColor bossColor = ConsoleColor.Green;
#endregion

#region 6 玩家属性相关
int playerX = 4;
int playerY = 5;
//玩家攻击力的最大最小值
int playerAtkMin = 8;
int playerAtkMax = 12;
//玩家血量
int playerHp = 100;
string playerIcon = "●";
ConsoleColor playerColor = ConsoleColor.Yellow;
//玩家输入的内容 外面申明 节约性能
//检测玩家的输入 方便之后的移动和攻击逻辑
char playerInput;
#endregion

#region 7 玩家战斗相关
//战斗状态
bool isFight = false;//在玩家与boss战斗或者未进行战斗时应该有不同的逻辑,通过一个bool变量来判断应该走哪种逻辑
#endregion

二.玩家移动以及战斗逻辑

1.玩家的移动

  • 和正常的游戏一样,我们希望我们的玩家能够按住“WASD”来进行上下左右的移动,而移动的基本原理是什么呢?就是改变在游戏画面上显示的玩家的坐标,也就是我们的控制台上,同时呢,我们得把控制台上上一个玩家的图标给擦除掉
  • 这里又有一个问题了,我们的玩家是不能随意的进行移动的,我们必须给他的移动加上一定的范围限制,否则难不成把你的玩家移动到我们的画面外吗?因此这里又有一个毕竟复杂的问题,也就是边界讨论

玩家移动的边界问题

  • 刚才我们提到了玩家移动的边界问题,那什么是边界问题呢?我们结合我们这个游戏的的具体画面来分析一下
    在这里插入图片描述
  • 首先,在我们的游戏画面中目前是有三种物体的,第一个就是不变的墙,第二个是玩家,第三个就是我们的BOSS,我们所能控制的就是游戏界面中玩家的移动。
  • 我们玩家的移动必须在规定的范围内,也就是红墙里,这是我们设定的游戏区域,同时,我们的玩家不能与红墙的坐标重合,我们在前面说了,红墙是不变的物体,并不会随着玩家的控制而发生变化,因此我们没有必要在执行游戏的每次循环中都重复打印它,只需要在切换到游戏场景时打印它就足够了,因此如果玩家与红墙重合的话,该坐标的红墙就会消失并且在游戏没结束时就不会再打印了,同时BOSS也是,我们同样也不能让玩家与BOSS的坐标重合,尽管BOSS会在每一次循环中都打印,但是我们让玩家和BOSS能够重合,就不好处理玩家和BOSS战斗的逻辑了。
  • 通过以上的分析,我们可以得到以下玩家移动的代码
    #region 6 玩家移动相关
    //擦除之前位置的玩家图标
    Console.SetCursorPosition(playerX, playerY);
    Console.Write("  ");
    //改位置
    switch (playerInput)
    {
        case 'W':
        case 'w':
            --playerY;//往上移动
            if (playerY < 1)//边界检查 如果玩家到红墙上边缘就把玩家坐标拉回去
            {
                playerY = 1;
            }
            //位置如果和boss重合了 并且boss没有死
            else if (playerX == bossX && playerY == bossY && bossHp > 0)
            {
                //拉回去
                ++playerY;
            }
            break;
        case 'A':
        case 'a':
            playerX -= 2;//向左移动
            if (playerX < 2)边界检查 如果玩家到红墙左边缘就把玩家坐标拉回去
            {
                playerX = 2;
            }
            else if (playerX == bossX && playerY == bossY && bossHp > 0)
            {
                //拉回去
                playerX += 2;
            }
            break;
        case 'S':
        case 's':
            ++playerY;//向下移动
            if (playerY > h - 7) 边界检查 如果玩家到红墙下边缘就把玩家坐标拉回去
            {
                playerY = h - 7;
            }
            else if (playerX == bossX && playerY == bossY && bossHp > 0)
            {
                //拉回去
                --playerY;
            }
            break;
        case 'D':
        case 'd':
            playerX += 2;  //向右移动
            if (playerX > w - 4)//边界检查 如果玩家到红墙右边缘就把玩家坐标拉回去
            {
                playerX = w - 4;
            }
            else if (playerX == bossX && playerY == bossY && bossHp > 0)
            {
                //拉回去
                playerX -= 2;
            }
            break;
       
    }
    #endregion

在这里插入图片描述

  • 如图,现在我们已经能在地图上自由的移动啦,接下来我们就来进行战斗相关的设置

2.战斗相关代码逻辑

怎么进入战斗

  • 那么怎样和BOSS进行战斗呢?首先,我们得先把我们的玩家移动到BOSS的身边,然后按下某个键进入战斗,同时把玩家的状态切换到战斗状态,此时,我们也得在下面的方框下打印一些信息来提醒玩家进入战斗可以攻击BOSS了
  case 'J':
  case 'j':
      //开始战斗
      if ((playerX == bossX && playerY == bossY - 1 ||
          playerX == bossX && playerY == bossY + 1 ||
          playerX == bossX - 2 && playerY == bossY ||
          playerX == bossX + 2 && playerY == bossY) && bossHp > 0)//玩家处于BOSS周围
      {
          isFight = true;//玩家状态切换至战斗状态
          //可以开始战斗,提醒一下玩家应该做什么,以及玩家和BOSS此时的血量
          Console.SetCursorPosition(2, h - 5);
          Console.ForegroundColor = ConsoleColor.White;
          Console.Write("开始和Boss战斗了,按J键继续");
          Console.SetCursorPosition(2, h - 4);
          Console.Write("玩家当前血量为{0}", playerHp);
          Console.SetCursorPosition(2, h - 3);
          Console.Write("boss当前血量为{0}", bossHp);
      }
      //进入战斗状态就要让玩家不能再移动
      //同时下方能够显示信息,提示双方造成的伤害和此时剩下的血量

      break;

战斗逻辑

  • 我们上面定义了一个bool类型的IsFight来判断此时的玩家是否进入战斗,当进入战斗后,我们就得进入战斗逻辑而不再是移动逻辑了,那战斗时应该是怎样的逻辑呢?
  • 首先,我们在每次进入战斗状态时都得判断一下此时双方的血量,无论双方谁的血量降为0都要进入下一环节或者游戏失败或者进入营救公主的环节
  • 然后,我们来通过双方的攻击力来轮流对对方进行攻击,我们在设置玩家和BOSS时都给予了攻击力的最大值和最小值,这样我们每次攻击时,双方都应该造成最大攻击和最小攻击之间的随机伤害,对方扣除相应的血量,这样基本的思路就捋清楚了,接一下则进入一个游戏分支
  • 当BOSS的血先减少为0时,就应该在地图上销毁BOSS并且标记出公主的位置,同时恢复玩家的行动让玩家能够去到公主身边营救公主
  • 当玩家的血量先减少为0时,说明此时玩家未能战胜BOSS,此时就应该更改场景ID进入到游戏结束界面
 //游戏场景的死循环 专门用来 检测 玩家输入相关循环
 while (true)
 {
   
     //boss活着时才绘制
     if (bossHp > 0)
     {
         //绘制boss图标
         Console.SetCursorPosition(bossX, bossY);
         Console.ForegroundColor = bossColor;
         Console.Write(bossIcon);
     }
    
     //画出玩家
     Console.SetCursorPosition(playerX, playerY);
     Console.ForegroundColor = playerColor;
     Console.Write(playerIcon);
     //得到玩家输入
     playerInput = Console.ReadKey(true).KeyChar;
   

     //战斗状态处理什么逻辑
     if (isFight)
     {
         #region 7 玩家战斗相关
         //如果是战斗状态 你做什么
         //只会处理J键 
         if (playerInput == 'J' || playerInput == 'j')
         {
             //在这判断 玩家或者怪物 是否死亡 如果死亡了 继续之后的流程
             if (playerHp <= 0)
             {
                 //游戏结束
                 //输掉了 应该直接显示 我们的 游戏结束界面
                 nowSceneID = 3;
                 break;
             }
             else if (bossHp <= 0)
             {
                 //去营救公主
                 //boss擦除
                 Console.SetCursorPosition(bossX, bossY);
                 Console.Write("  ");
                 isFight = false;//重新让玩家能够按wasd键移动
             }
             else
             {
                 //去处理按J键打架
                 // 玩家打怪物
                 Random r = new Random();
                 //得到随机攻击了
                 int atk = r.Next(playerAtkMin, playerAtkMax);
                 //血量减对应的攻击力
                 bossHp -= atk;
                 //打印信息
                 Console.ForegroundColor = ConsoleColor.Green;
                 //先擦除这一行 上次显示的内容
                 Console.SetCursorPosition(2, h - 4);
                 Console.Write("                                           ");
                 //再来写新的信息
                 Console.SetCursorPosition(2, h - 4);
                 Console.Write("你对恶龙造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);
                 // 怪物打玩家
                 if (bossHp > 0)
                 {
                     //得到随机攻击了
                     atk = r.Next(bossAtkMin, bossAtkMax);
                     playerHp -= atk;

                     //打印信息
                     Console.ForegroundColor = ConsoleColor.Yellow;
                     //先擦除这一行 上次显示的内容
                     Console.SetCursorPosition(2, h - 3);
                     Console.Write("                                           ");
                     //再来写新的信息
                     //boss如果把玩家打死了 做什么
                     if (playerHp <= 0)
                     {
                         Console.SetCursorPosition(2, h - 3);
                         Console.Write("很遗憾,你未能通过boss的试炼,战败了");
                     }
                     else
                     {
                         Console.SetCursorPosition(2, h - 3);
                         Console.Write("恶龙对你造成了{0}点伤害,你的剩余血量为{1}", atk, playerHp);
                     }
                 }
                 else
                 {
                     //擦除之前的战斗信息
                     Console.SetCursorPosition(2, h - 5);
                     Console.Write("                                           ");
                     Console.SetCursorPosition(2, h - 4);
                     Console.Write("                                           ");
                     Console.SetCursorPosition(2, h - 3);
                     Console.Write("                                           ");
                     //显示恭喜胜利的信息
                     Console.SetCursorPosition(2, h - 5);
                     Console.Write("你战胜了boss,快去营救公主");
                     Console.SetCursorPosition(2, h - 4);
                     Console.Write("前往公主身边按J键继续");
                 }
             }
         }
  • 上面的逻辑我想我已经讲清楚了,现在唯一需要提一点的就是我们每次在打印新的信息时都需要先擦除上一次打印的信息,而由于我们的如果使用Clear清屏的话会把画面上所有内容都给消除,因此我们这里选择在打印新信息前先把对应这一行置为空白,这样一来就能达到我们想要的效果
    在这里插入图片描述
  • 好了,讲到这里,今天有关游戏场景相关的知识也就讲的差不多了,接下来把源码放在这里以供大家参考和自己修改

三. 游戏源码

 //游戏场景
 case 2:
     Console.Clear();
     #region 4 不变的红墙
     //设置颜色为红色
     Console.ForegroundColor = ConsoleColor.Red;
     //画墙
     //上方墙
     for (int i = 0; i < w; i += 2)
     {
         //上方墙
         Console.SetCursorPosition(i, 0);
         Console.Write("■");
         //下方墙
         Console.SetCursorPosition(i, h - 1);
         Console.Write("■");
         //中间墙
         Console.SetCursorPosition(i, h - 6);
         Console.Write("■");
     }
     //左边的墙
     for (int i = 0; i < h; i++)
     {
         //左边的墙
         Console.SetCursorPosition(0, i);
         Console.Write("■");
         //右边的墙
         Console.SetCursorPosition(w - 2, i);
         Console.Write("■");
     }
     #endregion

     #region 5 boss属性相关
     int bossX = 24;
     int bossY = 15;
     int bossAtkMin = 7;
     int bossAtkMax = 13;
     int bossHp = 100;
     string bossIcon = "■";
     //申明一个 颜色变量
     ConsoleColor bossColor = ConsoleColor.Green;
     #endregion

     #region 6 玩家属性相关
     int playerX = 4;
     int playerY = 5;
     int playerAtkMin = 8;
     int playerAtkMax = 12;
     int playerHp = 100;
     string playerIcon = "●";
     ConsoleColor playerColor = ConsoleColor.Yellow;
     //玩家输入的内容 外面申明 节约性能
     char playerInput;
     #endregion

     #region 7 玩家战斗相关
     //战斗状态
     bool isFight = false;
     #endregion

     //游戏场景的死循环 专门用来 检测 玩家输入相关循环
     while (true)
     {
         #region 5 boss属性相关
         //boss活着时才绘制
         if (bossHp > 0)
         {
             //绘制boss图标
             Console.SetCursorPosition(bossX, bossY);
             Console.ForegroundColor = bossColor;
             Console.Write(bossIcon);
         }
         #endregion

         #region 6 玩家移动相关
         //画出玩家
         Console.SetCursorPosition(playerX, playerY);
         Console.ForegroundColor = playerColor;
         Console.Write(playerIcon);
         //得到玩家输入
         playerInput = Console.ReadKey(true).KeyChar;
         #endregion

         //战斗状态处理什么逻辑
         if (isFight)
         {
             #region 7 玩家战斗相关
             //如果是战斗状态 你做什么
             //只会处理J键 
             if (playerInput == 'J' || playerInput == 'j')
             {
                 //在这判断 玩家或者怪物 是否死亡 如果死亡了 继续之后的流程
                 if (playerHp <= 0)
                 {
                     //游戏结束
                     //输掉了 应该直接显示 我们的 游戏结束界面
                     nowSceneID = 3;
                     break;
                 }
                 else if (bossHp <= 0)
                 {
                     //去营救公主
                     //boss擦除
                     Console.SetCursorPosition(bossX, bossY);
                     Console.Write("  ");
                     isFight = false;
                 }
                 else
                 {
                     //去处理按J键打架
                     // 玩家打怪物
                     Random r = new Random();
                     //得到随机攻击了
                     int atk = r.Next(playerAtkMin, playerAtkMax);
                     //血量减对应的攻击力
                     bossHp -= atk;
                     //打印信息
                     Console.ForegroundColor = ConsoleColor.Green;
                     //先擦除这一行 上次显示的内容
                     Console.SetCursorPosition(2, h - 4);
                     Console.Write("                                           ");
                     //再来写新的信息
                     Console.SetCursorPosition(2, h - 4);
                     Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);
                     // 怪物打玩家
                     if (bossHp > 0)
                     {
                         //得到随机攻击了
                         atk = r.Next(bossAtkMin, bossAtkMax);
                         playerHp -= atk;

                         //打印信息
                         Console.ForegroundColor = ConsoleColor.Yellow;
                         //先擦除这一行 上次显示的内容
                         Console.SetCursorPosition(2, h - 3);
                         Console.Write("                                           ");
                         //再来写新的信息
                         //boss如果把玩家打死了 做什么
                         if (playerHp <= 0)
                         {
                             Console.SetCursorPosition(2, h - 3);
                             Console.Write("很遗憾,你未能通过boss的试炼,战败了");
                         }
                         else
                         {
                             Console.SetCursorPosition(2, h - 3);
                             Console.Write("boss对你造成了{0}点伤害,你的剩余血量为{1}", atk, playerHp);
                         }
                     }
                     else
                     {
                         //擦除之前的战斗信息
                         Console.SetCursorPosition(2, h - 5);
                         Console.Write("                                           ");
                         Console.SetCursorPosition(2, h - 4);
                         Console.Write("                                           ");
                         Console.SetCursorPosition(2, h - 3);
                         Console.Write("                                           ");
                         //显示恭喜胜利的信息
                         Console.SetCursorPosition(2, h - 5);
                         Console.Write("你战胜了boss,快去营救公主");
                         Console.SetCursorPosition(2, h - 4);
                         Console.Write("前往公主身边按J键继续");
                     }
                 }
             }
             #endregion
         }
         //非战斗状态处理什么逻辑
         else
         {
             #region 6 玩家移动相关
             //擦除
             Console.SetCursorPosition(playerX, playerY);
             Console.Write("  ");
             //改位置
             switch (playerInput)
             {
                 case 'W':
                 case 'w':
                     --playerY;
                     if (playerY < 1)
                     {
                         playerY = 1;
                     }
                     //位置如果和boss重合了 并且boss没有死
                     else if (playerX == bossX && playerY == bossY && bossHp > 0)
                     {
                         //拉回去
                         ++playerY;
                     }
                     break;
                 case 'A':
                 case 'a':
                     playerX -= 2;
                     if (playerX < 2)
                     {
                         playerX = 2;
                     }
                     else if (playerX == bossX && playerY == bossY && bossHp > 0)
                     {
                         //拉回去
                         playerX += 2;
                     }
                     break;
                 case 'S':
                 case 's':
                     ++playerY;
                     if (playerY > h - 7)
                     {
                         playerY = h - 7;
                     }
                     else if (playerX == bossX && playerY == bossY && bossHp > 0)
                     {
                         //拉回去
                         --playerY;
                     }
                     break;
                 case 'D':
                 case 'd':
                     playerX += 2;
                     if (playerX > w - 4)
                     {
                         playerX = w - 4;
                     }
                     else if (playerX == bossX && playerY == bossY && bossHp > 0)
                     {
                         //拉回去
                         playerX -= 2;
                     }
                     break;
                 case 'J':
                 case 'j':
                     //开始战斗
                     if ((playerX == bossX && playerY == bossY - 1 ||
                         playerX == bossX && playerY == bossY + 1 ||
                         playerX == bossX - 2 && playerY == bossY ||
                         playerX == bossX + 2 && playerY == bossY) && bossHp > 0)
                     {
                         isFight = true;
                         //可以开始战斗
                         Console.SetCursorPosition(2, h - 5);
                         Console.ForegroundColor = ConsoleColor.White;
                         Console.Write("开始和Boss战斗了,按J键继续");
                         Console.SetCursorPosition(2, h - 4);
                         Console.Write("玩家当前血量为{0}", playerHp);
                         Console.SetCursorPosition(2, h - 3);
                         Console.Write("boss当前血量为{0}", bossHp);
                     }
                     //要让玩家不能再移动
                     //下方能够显示信息

                     break;
             }
             #endregion
         }
         }
         break;

总结

  • 今天的内容到这里就结束了,游戏场景的相关设置才是这款游戏的核心以及难点,如果你真的想学好这方面的内容不妨跟着博主自己动手尝试一下,毕竟很多问题只有自己动手试过了才能发现,如果你在实现过程中遇到任何问题,欢迎在评论区指出或者私信我!!
  • 后面的内容很快更新,感兴趣不妨关注一下错过后面的内容哦!!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

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

相关文章

【web开发】2、css基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、CSS是什么&#xff1f;二、使用步骤2.1.css的存放位置2.2.选择器2.3.常用CSS样式介绍与示例 一、CSS是什么&#xff1f; 层叠样式表(英文全称&#xff1a;Casc…

vue2+element-ui批量导入方法并判断上传的文件是否为xls或xlsx

业务需求: 代码结构: <el-dialogtitle"批量导入":close-on-click-modal"true"close"close()":visible"true"width"35%":center"true"><div class"el-dialog-div"><!-- 头部区域布局 -…

万物互联:软件与硬件的协同之道

在当今数字化时代&#xff0c;我们身边的一切似乎都与计算机和互联网有关。从智能手机到智能家居设备&#xff0c;从自动驾驶汽车到工业生产线&#xff0c;无论我们走到哪里&#xff0c;都能看到软件和硬件的协同作用。本文将探讨这种协同作用&#xff0c;解释软件和硬件如何相…

R语言机器学习之caret包详解(二:模型的训练以及调参)

R语言机器学习之caret包详解&#xff08;二&#xff1a;模型的训练以及调参&#xff09; 前言caret包模型调优的策略、示例、以及一些小tips 前言 在之前的博客中我们详细介绍过了数据的拆分策略、各种数据处理的方法、各种交叉验证的方法&#xff0c;并且以示例介绍了R函数cre…

传统文化,运用好了,能生财!

千年以来&#xff0c;五行是中华民族文化的瑰宝&#xff0c;历代先贤智慧的结晶。五行学说是中国传统文化重要组成部分&#xff0c;是中国古代哲学思想的重要内容。古人认为&#xff0c;万物由五种相关的基本物质木、火、土、 金、水构成&#xff0c;这就是五行。 五行思想强调…

NFTScan 浏览器再升级:优质数据服务新体验来袭

当前&#xff0c;高质量的 NFT 数据服务已成为区块链用户和开发者的必需。为满足用户数据需求&#xff0c;NFTScan 主站近日进行全面升级&#xff0c;优化了数据服务板块的页面结构&#xff0c;实现更清晰简洁的布局和交互。 NFTScan 的改版充分考虑用户和开发者的数据体验&am…

【python】TCP socket服务器 Demo

目录 一、单线程服务器 二、多线程服务器 三、多线程服务器&#xff08;发送和接收分离&#xff09; 一、单线程服务器 说明&#xff1a;只能连接一个客户端 import socket,binascii# 创建一个 TCP 套接字 server_socket socket.socket(socket.AF_INET, socket.SOCK_STRE…

【C++基础】4、变量

文章目录 【 1、变量的定义 】【 2、变量的声明 】示例 【 3、左值和右值 】 变量&#xff1a;相当于是程序可操作的数据存储区的名称。在 C 中&#xff0c;有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&am…

文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;蓝桥云课认证讲师。 本文讲解了 Java 设计模式中的原型模式&#xff0c;并给…

python3

#安装python3 brew install python3 看到下图表示安装python3成功: #将python3 加入环境变量 export PATH$PATH:/opt/homebrew/bin/#查看python 版本 python3 --version#查看pip 版本 pip3 --version#更新python源 pip3 config set global.index-url https://pypi.tuna.tsing…

免费电商api接口,分享给你「建议收藏」

API&#xff08;应用程序编程接口&#xff09; ​ API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…

高忆管理;三天翻倍!地产“三仙”狂飙

9月6日&#xff0c;一度全部成为“仙股”的三家闻名香港上市房企&#xff0c;融创我国、我国恒大、碧桂园大涨。其间两家已顺利摘掉“仙股”帽子。 截至发稿&#xff0c;融创我国涨20.25%&#xff0c;报1.9港元/股&#xff0c;总市值报104亿港元&#xff0c;不到三个交易日股价…

[LeetCode周赛复盘] 第 361 场周赛20230906

[LeetCode周赛复盘] 第 361 场周赛20230906 一、本周周赛总结2843. 统计对称整数的数目1. 题目描述2. 思路分析3. 代码实现 2844. 生成特殊数字的最少操作1. 题目描述2. 思路分析3. 代码实现 2845. 统计趣味子数组的数目1. 题目描述2. 思路分析3. 代码实现 2846. 边权重均等查…

提升客户体验,你只需要做到这一点

自动回复是指由特定事件或操作触发的自动响应&#xff0c;例如在即时通讯工具上接收消息&#xff0c;它用于通知发件人他们的消息已被收到。不仅可以在WhatsApp&#xff0c;Messenger等渠道上设置自动回复&#xff0c;如果您使用了像SaleSmartly&#xff08;SS客服&#xff09;…

任意文件读取及漏洞复现

文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

PG 的状态机和peering过程

首先来解释下什么是pg peering过程&#xff1f; 当最初建立PG之后&#xff0c;那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候&#xff0c;这个osd上所有的pg都要进行peering过程&#xff0c;同步pg的状态。peering过程结…

【K 均值聚类】02/5:简介

一、说明 k-mean算法是一种聚类算法&#xff0c;它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。 无监督机器学习是在没…

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群&#xff0c;其中有三个master 节点&#xff0c;这三个节点的标签名称为etcd 三个master节点的ip 分别为&#xff1a;192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库&#xff0c; 数据库的ip 为&#xff1a;192.165.187.180 用户…

Java虚拟机整型数加载指令学习

JVM中 int 类型数值&#xff0c;根据 取值范围将 入栈的 字节码指令 就分为4类&#xff1a; 取值 -1~5 采用 iconst 指令&#xff1b; 取值 -128~127 采用 bipush 指令&#xff1b; 取值 -32768~32767 采用 sipush指令&#xff1b; 取值 -2147483648~2147483647 采用 ldc 指令。…