前幾天我發布游戲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,歡迎大家一起交流。

