欢迎光临
我们一直在努力

一个C#控制台小游戏(源码解析)

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

   程序类图如下: 

一个C#控制台小游戏(源码解析)

 

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,欢迎大家一起交流。

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《一个C#控制台小游戏(源码解析)》
文章链接:https://www.456zj.com/37168.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址