10.结束场景

10.结束场景


10.1 知识点

主函数外 class 语句块内

修改开始场景和结束场景函数 开始场景和结束场景可以复用

// 主函数外 class 语句块内

// 修改开始场景和结束场景函数 开始场景和结束场景可以复用
// 控制台宽 高 场景标识变量为开始场景和结束场景函数的参数
// 场景标识变量添加 ref 修饰 使场景标识的值能在函数内部被修改时生效
static void BeginOrEndScene(int w, int h, ref E_SceneType nowSceneType)
{
    // 设置光标颜色和位置 打印标题
    Console.ForegroundColor = ConsoleColor.White;
    Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 3 : w / 2 - 4, 8);
    Console.Write(nowSceneType == E_SceneType.Begin ? "飞行棋" : "游戏结束");

    // 创建当前选项的编号变量和退出死循环标识
    int nowSelIndex = 0;
    bool isQuitBegin = false;

    // 设置开始场景和结束场景死循环
    while (true)
    {
        // 开始场景和结束场景死循环内  设置两个选项的位置 根据当前选项的编号变量的值设置两个选项的颜色
        Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 4 : w / 2 - 5, 13);
        Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
        Console.Write(nowSceneType == E_SceneType.Begin ? "开始游戏" : "回到主菜单");

        Console.SetCursorPosition(w / 2 - 4, 15);
        Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
        Console.Write("退出游戏");

        // 开始场景和结束场景死循环内 检测玩家输入
        // Console.ReadKey(true).Key 可以通过 ReadKey 得到一个输入的枚举类型,并且设置不会再控制台上显示输入的内容
        // 之前的做法是创建一个 char 变量去接收
        // char input = Console.ReadKey(true).KeyChar;

        switch (Console.ReadKey(true).Key)
        {
            // 开始场景和结束场景死循环内 根据玩家输入执行不同逻辑
            case ConsoleKey.W:
                --nowSelIndex;
                if (nowSelIndex < 0)
                {
                    nowSelIndex = 0;
                }
                break;
            case ConsoleKey.S:
                ++nowSelIndex;
                if (nowSelIndex > 1)
                {
                    nowSelIndex = 1;
                }
                break;
            case ConsoleKey.J:
                if (nowSelIndex == 0)
                {
                    // 进入游戏场景
                    // 1 改变当前场景ID
                    nowSceneType = nowSceneType == E_SceneType.Begin ? E_SceneType.Game : E_SceneType.Begin;
                    // 2 退出当前循环
                    isQuitBegin = true;
                }
                else
                {
                    // 退出游戏
                    Environment.Exit(0);
                }
                break;
        }

        // 开始场景和结束场景死循环内 通过标识决定 是否跳出 开始场景和结束场景死循环
        if (isQuitBegin)
        {
            break;
        }
    }
}

主函数内

场景切换的 switch 分支内 调用结束场景函数

// 主函数内

// 构建场景切换的死循环
while (true)
{
    // 构建场景切换的 switch 分支 判断当前场景标识变量的值 不同场景执行不同的逻辑
    switch (nowSceneType)
    {
        case E_SceneType.Begin:
            // 开始场景逻辑
            Console.Clear();
            // 来书写 开始场景相关的逻辑即可
            
            // 场景切换的 switch 分支内 调用开始场景和结束场景函数
            BeginOrEndScene(w, h, ref nowSceneType);
            break;

        case E_SceneType.Game:
            // 游戏场景逻辑
            Console.Clear();
            // 通过函数来处理游戏场景的逻辑内容
            
            // 场景切换的 switch 分支内 调用游戏场景函数
            GameScene(w, h, ref nowSceneType);
            break;
            
        case E_SceneType.End:
            // 结束场景逻辑
            Console.Clear();
            BeginOrEndScene(w, h, ref nowSceneType);
            break;

        default:
            break;
    }
}

10.2 知识点代码

主函数外 class语句块内

//主函数外 class语句块内

//开始场景和结束场景函数 开始场景和结束场景可以复用
//控制台宽 高 场景标识变量为开始场景和结束场景函数的参数
//场景标识变量添加ref修饰 使场景标识的值能在函数内部被修改时生效
static void BeginOrEndScene(int w, int h, ref E_SceneType nowSceneType)
{
    //设置光标颜色和位置 打印标题
    Console.ForegroundColor = ConsoleColor.White;
    Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 3 : w / 2 - 4, 8);
    Console.Write(nowSceneType == E_SceneType.Begin ? "飞行棋" : "游戏结束");

    //创建当前选项的编号变量和退出死循环标识
    int nowSelIndex = 0;
    bool isQuitBegin = false;

    //设置开始场景和结束场景死循环
    while (true)
    {
        //开始场景和结束场景死循环内  设置两个选项的位置 根据当前选项的编号变量的值设置两个选项的颜色
        Console.SetCursorPosition(nowSceneType == E_SceneType.Begin ? w / 2 - 4 : w / 2 - 5, 13);
        Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
        Console.Write(nowSceneType == E_SceneType.Begin ? "开始游戏" : "回到主菜单");

        Console.SetCursorPosition(w / 2 - 4, 15);
        Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
        Console.Write("退出游戏");

        //开始场景和结束场景死循环内 检测玩家输入
        switch (Console.ReadKey(true).Key)
        {
            //开始场景和结束场景死循环内 根据玩家输入执行不同逻辑
            case ConsoleKey.W:
                --nowSelIndex;
                if (nowSelIndex < 0)
                {
                    nowSelIndex = 0;
                }
                break;
            case ConsoleKey.S:
                ++nowSelIndex;
                if (nowSelIndex > 1)
                {
                    nowSelIndex = 1;
                }
                break;
            case ConsoleKey.J:
                if (nowSelIndex == 0)
                {
                    //进入游戏场景
                    //1 改变当前场景ID
                    nowSceneType = nowSceneType == E_SceneType.Begin ? E_SceneType.Game : E_SceneType.Begin;
                    //2 退出当前循环
                    isQuitBegin = true;
                }
                else
                {
                    //退出游戏
                    Environment.Exit(0);
                }
                break;
        }

        //开始场景和结束场景死循环内 通过标识决定 是否跳出 开始场景和结束场景死循环
        if (isQuitBegin)
        {
            break;
        }
    }
}

主函数内

//主函数内

//申明一个 表示场景标识的 变量 
E_SceneType nowSceneType = E_SceneType.Begin;

//构建场景切换的死循环
while (true)
{
    //构建场景切换的switch分支 判断当前场景标识变量的值 不同场景执行不同的逻辑
    switch (nowSceneType)
    {
        case E_SceneType.Begin:
            //开始场景逻辑
            Console.Clear();
            //来书写 开始场景相关的逻辑即可

            //场景切换的switch分支内 调用开始场景和结束场景函数
            BeginOrEndScene(w, h, ref nowSceneType);
            break;

        case E_SceneType.Game:
            //游戏场景逻辑
            Console.Clear();
            //通过函数来处理游戏场景的逻辑内容

            //场景切换的switch分支内 调用游戏场景函数
            GameScene(w, h, ref nowSceneType);
            break;

        case E_SceneType.End:
            //结束场景逻辑
            Console.Clear();
            BeginOrEndScene(w, h, ref nowSceneType);
            break;

        default:
            break;
    }
}


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

×

喜欢就点赞,疼爱就打赏