9.扔骰子

9.游戏场景-扔骰子


9.1 知识点

class 语句块内 主函数外

创建擦除提示的函数

static void ClearInfo(int h)
{
    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 - 2);
    Console.Write("                                   ");
}

创建扔色子函数

/// <summary>
/// 扔色子函数
/// </summary>
/// <param name="w">窗口的宽</param>
/// <param name="h">窗口的高</param>
/// <param name="p">扔色子的对象</param>
/// <param name="otherP">扔色子的对手对象</param>
/// <param name="map">地图信息</param>
/// <returns>默认返回false 代表没有结束</returns>
static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map)
{
    //擦除之前显示的提示信息
    ClearInfo(h);

    //根据扔色子的玩家类型 决定信息的颜色
    Console.ForegroundColor = p.type == E_PlayerType.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;

    //扔色子之前 判断 玩家是否处于暂停状态
    if ( p.isPause )
    {
        //绘制信息
        Console.SetCursorPosition(2, h - 5);
        Console.Write("处于暂停状态,{0}需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
        Console.SetCursorPosition(2, h - 4);
        Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");

        //停止暂停
        p.isPause = false;
        return false;
    }

    //扔色子目的 是改变 玩家或者电脑的位置  计算位置的变化

    //扔色子 随机一个1到6的数 加上去
    Random r = new Random();
    int randomNum = r.Next(1, 7);
    p.nowIndex += randomNum;

    //打印扔的点数
    Console.SetCursorPosition(2, h - 5);
    Console.Write("{0}扔出的点数为:{1}", p.type == E_PlayerType.Player ? "你" : "电脑", randomNum);

    //判断是否到终点了
    if ( p.nowIndex >= map.grids.Length - 1 )
    {
        //到终点了 打印到中掉了 防止打印溢出
        p.nowIndex = map.grids.Length - 1;

        //绘制信息
        Console.SetCursorPosition(2, h - 4);
        if ( p.type == E_PlayerType.Player )
        {
            Console.Write("恭喜你,你率先到达了终点");
        }
        else
        {
            Console.Write("很遗憾,电脑率到达了终点");
        }
        Console.SetCursorPosition(2, h - 3);
        Console.Write("请按任意键结束游戏");

        return true;
    }
    else
    {
        //没有到终点 就判断 当前对象  到了一个怎么样的格子
        Grid grid = map.grids[p.nowIndex];

        switch (grid.type)
        {
            case E_Grid_Type.Normal:

                //普通格子不用处理

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}到了一个安全位置", p.type == E_PlayerType.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Boom:

                //炸弹退格
                p.nowIndex -= 5;

                //不能比起点还小
                if( p.nowIndex < 0 )
                {
                    p.nowIndex = 0;
                }

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了炸弹,退后5格", p.type == E_PlayerType.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Pause:

                //暂停一回合
                //暂停目前 只有加一个对象的暂停标识  才能知道 下一回合它是不是不能扔色子
                //下回合要暂停
                p.isPause = true;

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}到达了暂停点,你需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Tunnel:

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了时空隧道", p.type == E_PlayerType.Player ? "你" : "电脑");
                
                //随机
                randomNum = r.Next(1, 91);

                //触发 倒退
                if( randomNum <= 30 )
                {
                    p.nowIndex -= 5;
                    if( p.nowIndex < 0 )
                    {
                        p.nowIndex = 0;
                    }
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("触发倒退5格");
                }

                //触发 暂停
                else if( randomNum <= 60 )
                {
                    p.isPause = true;
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("触发暂停一回合");
                }

                //触发换位置
                else
                {
                    int temp = p.nowIndex;
                    p.nowIndex = otherP.nowIndex;
                    otherP.nowIndex = temp;
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("惊喜,惊喜,双方交换位置");
                }

                //绘制信息
                Console.SetCursorPosition(2, h - 2);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;
        }
    }

    //默认没有结束
    return false;
}

创建 玩家或电脑 每一次扔色子 移动绘制判断游戏结束 函数

//返回游戏是否结束的判断值
static bool PlayerRandomMoveDrawJudge(int w, int h, ref Player p, ref Player otherP, Map map, ref E_SceneType nowSceneType)
{
    //之后的游戏逻辑
    //玩家扔色子逻辑
    //检测输入
    Console.ReadKey(true);
    //扔色子的逻辑
    bool isGameOver = RandomMove(w, h, ref p, ref otherP, map);
    //绘制地图
    map.Draw();
    //绘制玩家
    DrawPlayer(p, otherP, map);
    //判断是否要结束游戏
    if (isGameOver)
    {
        //卡住程序 让顽疾按任意键 
        Console.ReadKey(true);
        //改变场景ID
        nowSceneType = E_SceneType.End;
        //直接跳出循环
    }
    return isGameOver;
}

class 语句块内 主函数外 游戏场景逻辑函数内

创建游戏结束标识

bool isGameOver = false;

创建游戏场景死循环

while (true)
{
    // 游戏逻辑
}

游戏场景死循环内 扔色子 实现方式1

// 玩家扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑
isGameOver = RandomMove(w, h, ref player, ref computer, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
    // 卡住程序,让玩家按任意键 
    Console.ReadKey(true);
    // 改变场景ID
    nowSceneType = E_SceneType.End;
    // 直接跳出循环
    break;
}

// 电脑扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑
isGameOver = RandomMove(w, h, ref computer, ref player, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
    // 卡住程序,让玩家按任意键 
    Console.ReadKey(true);
    // 改变场景ID
    nowSceneType = E_SceneType.End;
    // 直接跳出循环
    break;
}

游戏场景死循环内 扔色子 实现方式2

// 玩家扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑(实现方式2)
isGameOver = RandomMove2(w, h, ref player, ref computer, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
    // 卡住程序,让玩家按任意键 
    Console.ReadKey(true);
    // 改变场景ID
    nowSceneType = E_SceneType.End;
    // 直接跳出循环
    break;
}

// 电脑扔色子逻辑
// 检测输入
Console.ReadKey(true);
// 扔色子的逻辑(实现方式2)
isGameOver = RandomMove2(w, h, ref computer, ref player, map);
// 绘制地图
map.Draw();
// 绘制玩家
DrawPlayer(player, computer, map);
// 判断是否要结束游戏
if (isGameOver)
{
    // 卡住程序,让玩家按任意键 
    Console.ReadKey(true);
    // 改变场景ID
    nowSceneType = E_SceneType.End;
    // 直接跳出循环
    break;
}

9.2 知识点代码

class语句块外 namespace语句块内

//创建擦除提示的函数
static void ClearInfo(int h)
{
    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 - 2);
    Console.Write("                                   ");
}

//创建扔色子函数
/// <summary>
/// 扔色子函数
/// </summary>
/// <param name="w">窗口的宽</param>
/// <param name="h">窗口的高</param>
/// <param name="p">扔色子的对象</param>
/// <param name="otherP">扔色子的对手对象</param>
/// <param name="map">地图信息</param>
/// <returns>默认返回false 代表没有结束</returns>
static bool RandomMove(int w, int h, ref Player p, ref Player otherP, Map map)
{
    //擦除之前显示的提示信息
    ClearInfo(h);

    //根据扔色子的玩家类型 决定信息的颜色
    Console.ForegroundColor = p.type == E_PlayerType.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;

    //扔色子之前 判断 玩家是否处于暂停状态
    if (p.isPause)
    {
        //绘制信息
        Console.SetCursorPosition(2, h - 5);
        Console.Write("处于暂停状态,{0}需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
        Console.SetCursorPosition(2, h - 4);
        Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");

        //停止暂停
        p.isPause = false;
        return false;
    }

    //扔色子目的 是改变 玩家或者电脑的位置  计算位置的变化

    //扔色子 随机一个1到6的数 加上去
    Random r = new Random();
    int randomNum = r.Next(1, 7);
    p.nowIndex += randomNum;

    //打印扔的点数
    Console.SetCursorPosition(2, h - 5);
    Console.Write("{0}扔出的点数为:{1}", p.type == E_PlayerType.Player ? "你" : "电脑", randomNum);

    //判断是否到终点了
    if (p.nowIndex >= map.grids.Length - 1)
    {
        //到终点了 打印到中掉了 防止打印溢出
        p.nowIndex = map.grids.Length - 1;

        //绘制信息
        Console.SetCursorPosition(2, h - 4);
        if (p.type == E_PlayerType.Player)
        {
            Console.Write("恭喜你,你率先到达了终点");
        }
        else
        {
            Console.Write("很遗憾,电脑率到达了终点");
        }
        Console.SetCursorPosition(2, h - 3);
        Console.Write("请按任意键结束游戏");

        return true;
    }
    else
    {
        //没有到终点 就判断 当前对象  到了一个怎么样的格子
        Grid grid = map.grids[p.nowIndex];

        switch (grid.type)
        {
            case E_Grid_Type.Normal:

                //普通格子不用处理

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}到了一个安全位置", p.type == E_PlayerType.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Boom:

                //炸弹退格
                p.nowIndex -= 5;

                //不能比起点还小
                if (p.nowIndex < 0)
                {
                    p.nowIndex = 0;
                }

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了炸弹,退后5格", p.type == E_Player

Type.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Pause:

                //暂停一回合
                //暂停目前 只有加一个对象的暂停标识  才能知道 下一回合它是不是不能扔色子
                //下回合要暂停
                p.isPause = true;

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}到达了暂停点,你需要暂停一回合", p.type == E_PlayerType.Player ? "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;

            case E_Grid_Type.Tunnel:

                //绘制信息
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了时空隧道", p.type == E_PlayerType.Player ? "你" : "电脑");

                //随机
                randomNum = r.Next(1, 91);

                //触发 倒退
                if (randomNum <= 30)
                {
                    p.nowIndex -= 5;
                    if (p.nowIndex < 0)
                    {
                        p.nowIndex = 0;
                    }
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("触发倒退5格");
                }

                //触发 暂停
                else if (randomNum <= 60)
                {
                    p.isPause = true;
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("触发暂停一回合");
                }

                //触发换位置
                else
                {
                    int temp = p.nowIndex;
                    p.nowIndex = otherP.nowIndex;
                    otherP.nowIndex = temp;
                    Console.SetCursorPosition(2, h - 3);
                    Console.Write("惊喜,惊喜,双方交换位置");
                }

                //绘制信息
                Console.SetCursorPosition(2, h - 2);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayerType.Player ? "电脑" : "你");
                break;
        }
    }

    //默认没有结束
    return false;
}

class语句块内 主函数外 游戏场景逻辑函数内

//主函数外 class语句块内

//创建游戏场景函数
//控制台宽 高 场景标识变量为开始场景和结束场景函数的参数
//场景标识变量添加ref修饰 使场景标识的值能在函数内部被修改时生效
static void GameScene(int w, int h, ref E_SceneType nowSceneType)
{
    //调用画墙函数 绘制不变内容(红墙 提示等等)
    DrawWall(w, h);

    //绘制地图

    //初始化一张地图 
    Map map = new Map(14, 3, 80);
    //调用地图的画方法
    map.Draw();

    //创建玩家和电脑
    Player player = new Player(0, E_PlayerType.Player);
    Player computer = new Player(0, E_PlayerType.Computer);
    //绘制玩家和电脑
    DrawPlayer(player, computer, map);

    //创建游戏结束标识
    bool isGameOver = false;
    //创建游戏场景死循环
    while (true)
    {
        //游戏逻辑

        #region 8 游戏场景死循环内 扔色子 实现方式1

        ////玩家扔色子逻辑
        ////检测输入
        //Console.ReadKey(true);
        ////扔色子的逻辑
        //isGameOver = RandomMove(w, h, ref player, ref computer, map);
        ////绘制地图
        //map.Draw();
        ////绘制玩家
        //DrawPlayer(player, computer, map);
        ////判断是否要结束游戏
        //if (isGameOver)
        //{
        //    //卡住程序 让玩家按任意键 
        //    Console.ReadKey(true);
        //    //改变场景ID
        //    nowSceneType = E_SceneType.End;
        //    //直接跳出循环
        //    break;
        //}


        ////电脑扔色子逻辑
        ////检测输入
        //Console.ReadKey(true);
        ////扔色子的逻辑
        //isGameOver = RandomMove(w, h, ref computer, ref player, map);
        ////绘制地图
        //map.Draw();
        ////绘制玩家
        //DrawPlayer(player, computer, map);
        ////判断是否要结束游戏
        //if (isGameOver)
        //{
        //    //卡住程序 让玩家按任意键 
        //    Console.ReadKey(true);
        //    //改变场景ID
        //    nowSceneType = E_SceneType.End;
        //    //直接跳出循环
        //    break;
        //}

        #endregion

        #region 8  游戏场景死循环内 扔色子 实现方式2

        //玩家扔色子
        if (PlayerRandomMoveDrawJudge(w, h, ref player, ref computer, map, ref nowSceneType))
        {
            break;
        }
        //电脑扔色子
        if (PlayerRandomMoveDrawJudge(w, h, ref computer, ref player, map, ref nowSceneType))
        {
            break;
        }

        #endregion
    }
}


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

×

喜欢就点赞,疼爱就打赏