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