简单游戏制作——飞行棋

控制台初始化

int w = 50;
int h = 50;
ConsoleInit(w, h);
static void ConsoleInit(int w, int h)
{
    //基础设置
    //光标的隐藏
    Console.CursorVisible = false;
    //舞台的大小
    Console.SetWindowSize(w, h);
    Console.SetBufferSize(w, h);
}

场景选择相关

#region 场景选择相关
//声明一个表示场景标识的变量
E_SceneType nowSceneType = E_SceneType.Begin;
while (true)
{
    switch (nowSceneType)
    {
        case E_SceneType.Begin:
            //开始场景逻辑
            Console.Clear();
            break;
        case E_SceneType.Game:
            //游戏场景逻辑
            Console.Clear();
            break;
        case E_SceneType.End:
            //结束场景逻辑
            Console.Clear();
            break;
        default:
            break;
    }
}
#endregion
/// <summary>
/// 游戏场景枚举类型
/// </summary>
enum E_SceneType
{
    /// <summary>
    /// 开始场景
    /// </summary>
    Begin,
    /// <summary>
    /// 游戏场景
    /// </summary>
    Game,
    /// <summary>
    /// 结束场景
    /// </summary>
    End
}

开始场景逻辑实现

static void GameScene(int w, int h, ref E_SceneType nowSceneType)
{
    Console.SetCursorPosition(w / 2 - 3, 8);
    Console.Write("飞行棋");
    //当前选项的编号
    int nowSelIndex = 0;

    bool isQuitBengin = false;

    //开始场景逻辑处理函数
    while (true)
    {
        Console.SetCursorPosition(w / 2 - 4, 13);
        Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
        Console.Write("开始游戏");

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

        //通过ReadKey可以得到一个输入的枚举类型
        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 = E_SceneType.Game;
                    //退出当前循环
                    isQuitBengin = true;
                }
                else
                {
                    //退出游戏
                    Environment.Exit(0);
                }
                break;
        }
        //通过标识决定是否跳出开始场景的循环
        if (isQuitBengin)
        {
            break;
        }
    }
}

游戏场景逻辑实现

不变的红墙

static void DrawWall(int w, int h)
{
    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('■');
        Console.SetCursorPosition(i, h - 11);
        Console.Write('■');
    }
    //竖着的墙
    for (int i = 0; i < h; i++)
    {
        //最左边
        Console.SetCursorPosition(0, i);
        Console.Write('■');

        Console.SetCursorPosition(w - 2, i);
        Console.Write('■');
    }
    //文字信息
    Console.ForegroundColor = ConsoleColor.White;
    Console.SetCursorPosition(2, h - 10);
    Console.Write("□:普通格子");

    Console.ForegroundColor = ConsoleColor.Blue;
    Console.SetCursorPosition(2, h - 9);
    Console.Write("‖:暂停,一回合不动");

    Console.ForegroundColor = ConsoleColor.Red;
    Console.SetCursorPosition(26, h - 9);
    Console.Write("●:炸弹,倒退5格");

    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.SetCursorPosition(2, h - 8);
    Console.Write("¤:时空隧道,随机倒退,暂停,换位置");

    Console.ForegroundColor = ConsoleColor.Cyan;
    Console.SetCursorPosition(2, h - 7);
    Console.Write("★:玩家");

    Console.ForegroundColor = ConsoleColor.Magenta;
    Console.SetCursorPosition(12, h - 7);
    Console.Write("▲:电脑");

    Console.ForegroundColor = ConsoleColor.DarkGreen;
    Console.SetCursorPosition(22, h - 7);
    Console.Write("◎:玩家和电脑重合");

    Console.ForegroundColor = ConsoleColor.White;
    Console.SetCursorPosition(2, h - 5);
    Console.Write("按任意键开始扔色子");
}

格子结构体和格子枚举

/// <summary>
/// 格子类型枚举
/// </summary>
enum E_Grid_type
{
    /// <summary>
    /// 普通格子
    /// </summary>
    Normal,
    /// <summary>
    /// 炸弹
    /// </summary>
    Boom,
    /// <summary>
    /// 暂停
    /// </summary>
    Pause,
    /// <summary>
    /// 时空隧道,随机倒退,暂停,换位置
    /// </summary>
    Tunnel,
}

struct Vector2
{
    public int x;
    public int y;

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

struct Grid
{
    //格子的类型
    E_Grid_type type;
    //格子的位置
    public Vector2 pos;

    //初始化构造函数
    public Grid(int x, int y, E_Grid_type type)
    {
        pos.x = x;
        pos.y = y;
        this.type = type;
    }

    public void Draw()
    {
        //提出来的目的,就是少写几行代码,因为它们不管哪种类型,都要设置了位置再画
        Console.SetCursorPosition(pos.x, pos.y);
        switch (type)
        {
            //普通格子怎么画
            case E_Grid_type.Normal:
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("□");
                break;
            //炸弹怎么画
            case E_Grid_type.Boom:
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("●");
                break;
            //暂停怎么画
            case E_Grid_type.Pause:
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.Write("‖");
                break;
            //时空隧道怎么画
            case E_Grid_type.Tunnel:
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write("¤");
                break;
        }
    }
}

地图结构体

struct Map
{
    public Grid[] grids;

    //初始化中初始了各个格子类型和位置
    public Map(int x, int y, int num)
    {
        grids = new Grid[num];

        //用于位置变化计数的变量
        //表示X变化的次数
        int indexX = 0;
        //表示Y变化的次数
        int indexY = 0;
        //x的步长
        int stepNum = 2;

        Random r = new Random();
        int randomNum;
        for (int i = 0; i < num; i++)
        {
            //应该初始化格子类型
            randomNum = r.Next(0, 101);

            //设置类型,普通格子
            //有85%几率是普通格子(首尾两个格子,必为普通格子)
            if (randomNum < 85 || i == 0 || i == num - 1)
            {
                grids[i].type = E_Grid_type.Normal;
            }
            //有5%的几率是炸弹
            else if (randomNum >= 85 && randomNum < 90)
            {
                grids[i].type = E_Grid_type.Boom;
            }
            //有5%的几率是暂停
            else if (randomNum >= 90 && randomNum < 95)
            {
                grids[i].type = E_Grid_type.Pause;
            }
            //有5%的几率是时空隧道
            else
            {
                grids[i].type = E_Grid_type.Tunnel;
            }
            //位置应该如何设置
            grids[i].pos = new Vector2(x, y);
            //每次循环都应该按一定规则去变化位置

            //加十次
            if (indexX == 10)
            {
                y += 1;
                //加一次Y记一次数
                ++indexY;
                if (indexY == 2)
                {
                    //y加了2次过后,把x加的次数记0
                    indexX = 0;
                    indexY = 0;
                    //反向步长
                    stepNum = -stepNum;
                }
            }
            else
            {
                x += stepNum;
                //加一次x记一次数
                ++indexX;
            }
        }
    }

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

玩家枚举和玩家结构体

/// <summary>
/// 玩家枚举类型
/// </summary>
enum E_PlayType
{
    /// <summary>
    /// 玩家
    /// </summary>
    Player,
    /// <summary>
    /// 电脑
    /// </summary>
    Computer,
}

struct Player
{
    //玩家类型
    public E_PlayType type;
    //当前所在地图哪一个索引的格子
    public int nowIndex;

    public Player(int index, E_PlayType type)
    {
        nowIndex = index;
        this.type = type;
    }

    public void Draw(Map mapInfo)
    {
        //必需要先得到地图才能够得到玩家在地图上的哪一个格子
        //从传入的地图中得到格子信息
        Grid grid = mapInfo.grids[nowIndex];
        //设置位置
        Console.SetCursorPosition(grid.pos.x, grid.pos.y);
        //画,设置颜色,设置图标
        switch (type)
        {
            case E_PlayType.Player:
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("★");
                break;
            case E_PlayType.Computer:
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.Write("▲");
                break;
            default:
                break;
        }
    }
}
static void DrawPlayer(Player player, Player computer, Map map)
{
    //重合时
    if (player.nowIndex == computer.nowIndex)
    {
        //得到重合的位置
        Grid grid = map.grids[player.nowIndex];
        Console.SetCursorPosition(grid.pos.x, grid.pos.y);
        Console.ForegroundColor = ConsoleColor.DarkGreen;
        Console.Write("◎");
    }
    //不重合的时候
    else
    {
        player.Draw(map);
        computer.Draw(map);
    }
}

扔色子逻辑

//擦除提示的函数
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="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_PlayType.Player ? ConsoleColor.Cyan : ConsoleColor.Magenta;

    //扔色子之前判断玩家是否处于暂停状态
    if (p.isPause)
    {
        Console.SetCursorPosition(2, h - 5);
        Console.Write("处于暂停点,{0}需要暂停一回合", p.type == E_PlayType.Player ? "你" : "电脑");
        Console.SetCursorPosition(2, h - 4);
        Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayType.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_PlayType.Player ? "你" : "电脑"
        , randomNum);

    //首先判断是否到终点了
    if (p.nowIndex >= map.grids.Length - 1)
    {
        p.nowIndex = map.grids.Length - 1;
        Console.SetCursorPosition(2, h - 4);
        if (p.type == E_PlayType.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_PlayType.Player ?
                    "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayType.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_PlayType.Player ?
                    "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayType.Player ? "你" : "电脑");
                break;
            case E_Grid_type.Pause:
                //暂停一回合
                //暂停目的,只有加一个对象的暂停标识,才能知道下一回合它是不是不能扔色子
                p.isPause = true;
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了炸弹,退后5格", p.type == E_PlayType.Player ?
                    "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayType.Player ? "你" : "电脑");
                break;
            case E_Grid_type.Tunnel:
                Console.SetCursorPosition(2, h - 4);
                Console.Write("{0}踩到了时空隧道", p.type == E_PlayType.Player ?
                    "你" : "电脑");
                Console.SetCursorPosition(2, h - 3);
                Console.Write("请按任意键,让{0}开始扔色子", p.type == E_PlayType.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("惊喜,惊喜,双方交换位置");
                }
                break;
            default:
                break;
        }
    }

    //默认没有结束
    return false;

}

结束场景逻辑实现

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 isQuitBengin = 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("退出游戏");

        //通过ReadKey可以得到一个输入的枚举类型
        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;
                    //退出当前循环
                    isQuitBengin = true;
                }
                else
                {
                    //退出游戏
                    Environment.Exit(0);
                }
                break;
        }
        //通过标识决定是否跳出开始场景的循环
        if (isQuitBengin)
        {
            break;
        }
    }
}

  • 32
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不背完3500个考研英语词汇不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值