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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM