zoukankan      html  css  js  c++  java
  • 一个C#控制台小游戏(源码解析)

       前几天我发布游戏exe文件,这几天整理了一下代码——源码下载,就马上来写博了。好了,开始正题了

       程序类图如下: 

     

    Program:程序类——main方法

    Game:游戏类——游戏运行、角色基本信息调用

    From:地图类——描绘游戏边框、提示信息

    Tank:坦克类——坦克绘制、行为、碰撞处理

    EnemyTank:敌方坦克类——坦克绘制、行为、碰撞处理

    Bullet:子弹类——子弹绘制、行为、碰撞处理

    Point:位置结构——记录坦克、子弹位置

    Direction:方向类——记录坦克、子弹方向

                当然这个游戏主要组成也是:地图,坦克绘制、行动、碰撞,子弹绘制、行动、碰撞,下面一一讲解:

         1.Map

     /// <summary>
            /// 绘制边框
            /// </summary>
            public void DrawBorder()
            {
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.CursorVisible = false;
                Console.SetCursorPosition(Left, Top);
    
                Console.Write("┎" + new string('━', width) + "┒");
                for (int i = 0; i <= height; i++)
                {
                    if (i != height)
                    {
                        Console.SetCursorPosition(left, top + i + 1);
                        Console.Write("┃" + new string(' ', 2 * width) + "┃");
                    }
                    else
                    {
                        Console.SetCursorPosition(left, top + i + 1);
                        Console.Write("┗" + new string('━', width) + "┛");
                    }
                }
    
                Config.Config.func();
            }
    

      其中 Console.ForegroundColor——获取或设置当前控制台颜色
                  Console.CursorVisible——用来指示光标是否可见
                 Console.SetCursorPosition(, )——设置光标的位置
                  (以上三个在后面绘制都要用到,用法我就不再讲解了)

    看代码我可以知道者将获得一个框框的图案,这就是游戏的地图

    2.获取键盘事件

             /// <summary>
             /// 获得键盘按键状态
          /// </summary>
            /// <returns></returns>
            public bool StartInput()
            {
                ConsoleKeyInfo key;
                while (true)
                {
                    key = Console.ReadKey(true);
                    if (!HandleInput(key))
                    {
                        return false;
                    }
                }
             
                return true;
            }

      这个方法在Game类中是打开即加载,他是我们控制坦克上下左右和发射子弹方法,其中 Console.ReadKey(true);可以获得按下的键盘,内容是不断循环的,其中HandleInput(key)方法是控制坦克行为的方法,没执行一次,坦克走一步或者发射子弹,当返回false就跳出改方法

    3.物体之间碰撞的判断

     /// <summary>
           /// 判断是否碰到边框或者敌方坦克
           /// </summary>
           /// <param name="type"></param>
           /// <returns></returns>
            public int Collide(MoveType type)
            {
                int tan = 0;
    
                //左
                if (type == MoveType.Left)
                {
                        if ( x <= 1)
                        {
                            tan = x;
                        }
                        else
                        {
                            if (From.Map[x - 2, y-1] == 3 || From.Map[x - 2, y] == 3 || From.Map[x - 2, y+1] == 3)
                            {
                                tan = x;
                            }
                            else
                            {
                                x -= 1;
                                tan = x;
                            }
                           
                        }
                }
    
                //右
                if (type == MoveType.Right)
                {
                        if (x >= From.Width - width + 1)
                        {
                            tan = x;
                        }
                        else
                        {
                            if (From.Map[x + 2, y-1] == 3 || From.Map[x + 2, y] == 3 || From.Map[x + 2, y+1] == 3)
                            {
                                tan = x;
                            }
                            else
                            {
                                x += 1;
                                tan = x;
                            }
                           
                        }
                }
                //上
                if (type == MoveType.Up)
                {
    
                    if (y <= 1)
                    {
                        tan = y;
                    }
                    else
                    {
                        if (From.Map[x - 1, y - 2] == 3 || From.Map[x, y - 2] == 3 || From.Map[x + 1, y - 2] == 3)
                        {
                            tan = y;
                        }
                        else
                        {
                            y -= 1;
                            tan = y;
                        }
                       
                    }
                }
                //下
                if (type == MoveType.Down)
                {
                    if ( y > From.Height - 3)
                        {
                            tan = y;
                        }
                        else
                        {
                            if (From.Map[x - 1, y + 2] == 3 || From.Map[x, y + 2] == 3 || From.Map[x + 1, y + 2] == 3)
                            {
                                tan = y;
                            }
                            else
                            {
                                y += 1;
                                tan = y;
                            }
                          
                        }
                }
    
                return tan;
            }
    

      物体之间的碰撞。比如坦克与敌方坦克相碰怎样判断不让他们相互挡住对方,还有子弹击中敌方坦克判断使其爆炸。这的确是个头疼的问题,但是如果你仔细注意了每一次坦克或者子弹的绘制,其中From。map[,]我赋值都是不同的,己方坦克赋值2、敌方坦克赋值3、子弹赋值1,然后清除轨迹后所有都赋值0,看到上面的判断条件,想必大家也是知道怎么控制他们碰撞的判断了吧

    以上三个问题都是程序典型的问题。绘制,运行,碰撞,大家看懂一个其他自然都知道了,所以这里也不都全部拿出来了。当然还有一些大家看到时候要注意的地方:比如width,在绘制地图、坦克,还有他们移动,我用的都是用两个光标的位置,而长度都是用一个光标的位置。还有给From.Map[,]中的数组内位置添加值时候,要注意数组是以0开始的,而地图内容是从1开始的,所以他们每次添加值的时候我都要减1。

    好了,文章就写到这了,代码全部开源了,如果哪位朋友感兴趣,可以自己修改代码(非常欢迎扩展这个小游戏)。还有之前zzd网友提出个意见敌方坦克随即出现的问题,我这边也忘改了(太懒了,不想再动了),如果又不懂细节的网友(有些问题不好说清),可以加qq群253674268,欢迎大家一起交流。

  • 相关阅读:
    Nmon 性能:分析 AIX 和 Linux 性能的免费工具
    libvirt(virsh命令总结)
    Linux之shell编程基础
    Shell之sed命令
    linux shell基础
    ubuntu apt-get 遇到的问题
    JavaScript之面向对象学九(原型式继承和寄生式继承)
    JavaScript之apply()和call()的区别
    JavaScript之面向对象学习八(继承)
    JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
  • 原文地址:https://www.cnblogs.com/Dotaer/p/2719720.html
Copyright © 2011-2022 走看看