11.玩家战斗相关

11.游戏场景-玩家战斗相关


11.1 知识点

声明战斗状态标识

bool isFight = false;

游戏场景死循环内,根据是否是战斗状态处理不同逻辑,把绘制玩家图形和玩家输入枚举放在非战斗状态的分支中

// 战斗状态处理逻辑
if (isFight)
{
    // 玩家战斗相关的逻辑
}
else
{
    // 玩家移动相关逻辑
    // 包括擦除上一次玩家所在位置绘制的玩家图形和根据玩家输入的字符枚举获得新的位置信息的switch
}

游戏场景死循环内的玩家输入枚举分支中,添加按j键的分支逻辑

case 'J':
case 'j':

游戏场景死循环内的玩家输入枚举分支中的j键的分支中,添加玩家战斗相关逻辑

// 要让玩家不能再移动
// 更改战斗状态标识,可以跳出当前游戏场景死循环,进入战斗状态逻辑,不会进入非战斗状态的移动逻辑
// 下方能够显示信息
// 当玩家在boss身边一格且boss血量大于0的时候可以开始战斗
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);
}

游戏场景死循环内,处理进入战斗状态后按j键的逻辑

// 如果是战斗状态,应该做什么
// 只会处理J键的逻辑
if (playerInput == 'J' || playerInput == 'j')
{
    // 在这判断玩家或者boss是否死亡,如果死亡了,继续之后的流程

    // 如果玩家死亡
    if (playerHp <= 0)
    {
        // 游戏结束
        // 输掉了,应该直接显示我们的游戏结束界面
        // 切换场景id
        nowSceneID = 3;
        gameOverInfo = "游戏失败";
        break;
    }

    // 如果boss死亡
    else if (bossHp <= 0)
    {
        // 去营救公主
        // boss擦除
        Console.SetCursorPosition(bossX, bossY);
        Console.Write("  ");
        isFight = false;
    }

    // 玩家和boss都没死,处理按J键对战逻辑
    else
    {
        // 得到随机对象
        Random r = new Random();

        // 玩家打boss

        // 随机出玩家的攻击力
        int atk = r.Next(playerAtkMin, playerAtkMax);

        // boss血量减对应的攻击力
        bossHp -= atk;

        // 打印玩家的攻击信息

        // 设置输出的字体颜色
        Console.ForegroundColor = ConsoleColor.Green;

        // 先擦除这一行上次显示的内容
        Console.SetCursorPosition(2, h - 4);
        Console.Write("                                           ");

        // 再来写新的信息

        // 输出玩家对boss的伤害信息
        Console.SetCursorPosition(2, h - 4);
        Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);

        // boss打玩家

        // boss大于0才可以对玩家进行攻击
        if (bossHp > 

0)
        {
            // 随机出boss的攻击力
            atk = r.Next(bossAtkMin, bossAtkMax);

            // 玩家血量减对应的攻击力
            playerHp -= atk;

            // 打印boss的攻击信息

            // 设置输出的字体颜色
            Console.ForegroundColor = ConsoleColor.Yellow;

            // 先擦除这一行上次显示的内容
            Console.SetCursorPosition(2, h - 3);
            Console.Write("                                           ");

            // 再来写新的信息

            // 如果boss把玩家打死了
            if (playerHp <= 0)
            {
                // 输出失败信息
                Console.SetCursorPosition(2, h - 3);
                Console.Write("很遗憾,你未能通过boss的试炼,战败了");
            }

            // boss没有把玩家打死
            else
            {
                // 输出boss对玩家的伤害信息
                Console.SetCursorPosition(2, h - 3);
                Console.Write("boss对你造成了{0}点伤害,你的剩余血量为{1}", atk, playerHp);
            }
        }

        // boss血量小于等于boss死亡了
        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键继续");
        }
    }
}

11.2 知识点代码

游戏场景死循环外

//声明战斗状态标识
bool isFight = false;

游戏场景死循环内

//设置游戏场景死循环
//专门用来 检测 玩家输入相关循环
while (true)
{
    #region 5 Boss相关

    //游戏场景死循环内 把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键的逻辑

        //如果是战斗状态 应该做什么
        //只会处理J键的逻辑 
        if (playerInput == 'J' || playerInput == 'j')
        {

            //在这判断 玩家或者boss 是否死亡 如果死亡了 继续之后的流程

            //如果玩家死亡
            if (playerHp <= 0)
            {
                //游戏结束
                //输掉了 应该直接显示 我们的 游戏结束界面
                //切换场景id
                nowSceneID = 3;
                gameOverInfo = "游戏失败";
                break;
            }

            //如果boss死亡
            else if (bossHp <= 0)
            {
                //去营救公主
                //boss擦除
                Console.SetCursorPosition(bossX, bossY);
                Console.Write("  ");
                isFight = false;
            }

            //玩家和boss都没死 处理按J键对战逻辑
            else
            {
                //得到随机对象
                Random r = new Random();

                //玩家打boss

                //随机出玩家的攻击力
                int atk = r.Next(playerAtkMin, playerAtkMax);

                //boss血量减对应的攻击力
                bossHp -= atk;

                //打印玩家的攻击信息

                //设置输出的字体颜色
                Console.ForegroundColor = ConsoleColor.Green;

                //先擦除这一行 上次显示的内容
                Console.SetCursorPosition(2, h - 4);
                Console.Write("                                           ");

                //再来写新的信息

                //输出玩家对boss的伤害信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);

                //boss打玩家

                //boss大于0才可以对玩家进行攻击
                if (bossHp > 0)
                {
                    //随机出boss的攻击力
                    atk = r.Next(bossAtkMin, bossAtkMax);

                    //玩家血量减对应的攻击力
                    playerHp -= atk;

                    //打印boss的攻击信息

                    //设置输出的字体颜色
                    Console.ForegroundColor = ConsoleColor.Yellow;

                    //先擦除这一行 上次显示的内容
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("                                           ");

                    //再来写新的信息

                    //如果boss把玩家打死了
                    if (playerHp <= 0)
                    {
                        //输出失败信息
                        Console.SetCursorPosition(2, h - 3);
                        Console.Write("很遗憾,你未能通过boss的试炼,战败了");
                    }

                    //boss没有把玩家打死
                    else
                    {
                        //输出boss对玩家的伤害信息
                        Console.SetCursorPosition(2, h - 3);
                        Console.Write("boss对你造成了{0}点伤害,你的剩余血量为{1}", atk, playerHp);
                    }
                }

                //boss血量小于等于boss死亡了
                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
    {
        //玩家移动相关逻辑
        //包括擦除上一次玩家所在位置绘制的玩家图形和根据玩家输入的字符枚举获得新的位置信息的switch
        #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;

            //游戏场景死循环内的玩家输入枚举分支中 添加按j键的分支逻辑
            case 'J':
            case 'j':
                #region 7 玩家战斗相关

                //游戏场景死循环内的玩家输入枚举分支中的j键的分支中 添加玩家战斗相关逻辑

                //要让玩家不能再移动
                //更改战斗状态标识 可以跳出当前游戏场景死循环 就进入战斗状态逻辑 不会进入非战斗状态的移动逻辑
                //下方能够显示信息

                // 当玩家在boss身边一格且boss血量大于0的时候可以开始战斗
                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);
                }
                #endregion

                break;
        }
        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏