⼀个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⽹友提出个意见敌⽅坦克随即出现的问题,我这边也忘改了(太懒了,不想再动了),如果⼜不懂细节的⽹友(有些问题不好说清),可以加qq253674268,欢迎⼤家⼀起交流。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论