黑马程序员---飞行棋的编程

今天从上午10点开始, 老师就一直给我讲解这个游戏的制作过程. 写到晚上代码写了一坨, 吃完饭再回来看, 其实我根本不知道哪句代码是干什么的.

经过我一堂课的改造, 终于把它改写成了简单易懂, 更易维护的游戏了.

因为要给同桌讲解, 他英语不是很好, 幸好VS2013可以用中文作方法名, 看起来简单明了.

这也是C#基础的一个综合应用了, 明天开始学面向对象, 感觉又变的高级了.


下面是这个游戏的主要思路:

1、绘制游戏Logo

2、对地图进行初始化,其实就是给Maps这个整数数组进行赋值。
3、一行一行的绘制游戏地图。
--->我们首先应该确定玩家A跟玩家B的坐标,因为他们的坐标是时时刻刻都在改变的。
--->声明一个数组,用来存储玩家A跟玩家B的坐标。
--->static int[] PlayerPos = new int[2];
--->绘制第一横行
--->首先确定A、B坐标
--->A跟B的坐标一样,此时我们绘制一对<>
--->如果A跟B不一样,那么该绘制A就绘制A,否则绘制B。
--->将第一横行中用到的那一坨if判断提炼成了一个方法,因为绘制每一行所采用的判断条件都是一样的。
DrawStringMap(当前这一个关卡的坐标作为参数,返回当前这个关卡的字符串)
--->绘制第一竖行
-->由于第一竖行是从控制台的右边换行,所以我们在绘制每一个关卡前应该 先用空格填充(for循环的嵌套)
--->绘制第二横行
-->倒序循环

4、分别输入两个玩家的用户名

5、清屏 重新调用GameLogo,然后输出相应的文本

6、玩家A跟玩家B不停进行游戏要满足的条件就是两个人的坐标同时都要小于99
7、游戏规则
--->首先判断移动的玩家是否踩到了另一个玩家,如果踩到了,被踩到的玩家应该退6格
--->如果移动的玩家没有踩到另一个玩家,那么我们则判断移动的玩家踩到了哪一个关卡上。
--->如果踩到了方块,则什么都不发生
--->如果踩到了关卡
--->如果踩到了幸运轮盘,则提示玩家选择 1--交换位置  2--轰炸对方,是对方退6格
--->如果踩到了地雷,踩到地雷的玩家应该退6格
--->如果踩到了暂停,则暂停一回合
--->如果踩到了时空隧道,则前进10格

问题:
--->玩家A跟玩家B有可能被干出这个地图
--->写函数来限定玩家A跟玩家B的坐标
--->凡是坐标改变的地方都应该调用ChangePos
--->目前只有玩家A在玩
--->暂停功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static int[] map = new int[100];
        static int[] playPos = new int[2];
        static string[] playName = new string[2];
        static Random rd = new Random();
        static bool[] playFlag = new bool[2] { true, true };
        //static int num = 0;


        public static void DrawTheLogo()
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine("-------飞行棋游戏开始啦---------");
            Console.WriteLine("-------请按任意键继续吧---------");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************************");
            Console.ForegroundColor = ConsoleColor.White;
            Console.ReadKey();
            Console.Clear();

        }
        public static void GetTwoNamesOfTwoPlayers()
        {
            do
            {
                playName[0] = "";
                while (playName[0] == "")
                {
                    Console.WriteLine("请输入A玩家姓名:");
                    playName[0] = Console.ReadLine();
                }
                playName[1] = "";
                while (playName[1] == "")
                {
                    Console.WriteLine("请输入B玩家姓名:");
                    playName[1] = Console.ReadLine();
                }
                if (playName[0] == playName[1]) Console.WriteLine("两个名字不要相同比较好!");
            } while (playName[0] == playName[1]);
            Console.Clear();

        }
        public static void PutElementsIntoMap()
        {
            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷☆
            int[] pause = { 9, 27, 60, 93 };//暂停▲
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道卐
            for (int i = 0; i < luckyturn.Length; i++)
                map[luckyturn[i]] = 1;
            for (int i = 0; i < landMine.Length; i++)
                map[landMine[i]] = 2;
            for (int i = 0; i < pause.Length; i++)
                map[pause[i]] = 3;
            for (int i = 0; i < timeTunnel.Length; i++)
                map[timeTunnel[i]] = 4;
        }
        /*public static void DrawMapWithinNumbers()
        {
            //第一行30个;
            for (int i = 0; i < 30; i++)
                Console.Write(map[i]);
            Console.WriteLine();
            //右侧竖排
            for (int i = 30; i < 35; i++)
            {
                for (int j = 0; j < 29; j++)
                    Console.Write("  ");
                Console.WriteLine(map[i]);
            }
            //中间一行倒序30个
            for (int i = 64; i >= 35; i--)
                Console.Write(map[i]);
            Console.WriteLine();
            //左侧竖行
            for (int i = 65; i < 70; i++)
                Console.WriteLine(map[i]);
            //最后一行
            for (int i = 70; i < 100; i++)
                Console.Write(map[i]);
        }*/
        public static string TurnNumbersWhichInTheMapToString(int i)
        {
            string str = "";
            //判断当前坐标跟玩家的坐标是否相等
            if (i == playPos[0] && i == playPos[1])
            {
                Console.ForegroundColor = ConsoleColor.White;
                str = "AB";
            } //玩家a坐标想等
            else if (i == playPos[0])
            {
                Console.ForegroundColor = ConsoleColor.White;
                str = "A";
            }
            //玩家B的坐标相等
            else if (i == playPos[1])
            {
                Console.ForegroundColor = ConsoleColor.White;
                str = "B";
            }
            else //画本来应该话关卡
            {
                //A和B坐标相同是用<>表示 
                //我用0表示普通,显示给用户就是 □
                //....1...幸运轮盘,显示组用户就◎ 
                //....2...地雷,显示给用户就是 ☆
                //....3...暂停,显示给用户就是 ▲
                //....4...时空隧道,显示组用户就 卐
                switch (map[i])
                {
                    case 0:
                        Console.ForegroundColor = ConsoleColor.Green;
                        str = "□";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        str = "@";
                        break;
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Red;
                        str = "☆";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.Blue;
                        str = "▲";
                        break;
                    case 4:
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        str = "卍";
                        break;
                }
            }
            return str;
        }
        public static void DrawMapWithinCharacters()
        {
            Console.WriteLine("幸运轮盘:@\t地雷:☆\t\t暂停:▲\t\t时空隧道:卐");
            //第一行30个;
            for (int i = 0; i < 30; i++)
                Console.Write(TurnNumbersWhichInTheMapToString(i));
            Console.WriteLine();
            //右侧竖排
            for (int i = 30; i < 35; i++)
            {
                for (int j = 0; j < 29; j++)
                    Console.Write("  ");
                Console.WriteLine(TurnNumbersWhichInTheMapToString(i));
            }
            //中间一行倒序30个
            for (int i = 64; i >= 35; i--)
                Console.Write(TurnNumbersWhichInTheMapToString(i));
            Console.WriteLine();
            //左侧竖行
            for (int i = 65; i < 70; i++)
                Console.WriteLine(TurnNumbersWhichInTheMapToString(i));
            //最后一行
            for (int i = 70; i < 100; i++)
                Console.Write(TurnNumbersWhichInTheMapToString(i));
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("");
        }
        public static void 投色子(int num)
        {
            //玩家A玩游戏
            if (playFlag[num])
            {
                Console.WriteLine("玩家{0}开始游戏,按任意键掷骰子!", playName[num]);
                Console.ReadKey(true);
                int rdNum = rd.Next(1, 7);
                //int rdNum = 5;
                Console.WriteLine("玩家{0}掷出了{1}", playName[num], rdNum);
                //Console.ReadKey(true);
                playPos[num] += rdNum;
                安全检测(num);
                判断是不是到了最后(num);
            }
        }
        public static void 走完后看看玩家踩到了什么(int num)
        {
            int num2 = 0;
            if (num == 1) num2 = 0;
            else num2 = 1;

            if (playPos[num] == playPos[num2])
            {
                Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}退5格", playName[num], playName[num2], playName[num2]);
                playPos[num2] -= 5;
                安全检测(num2);
                if (playPos[num2] == playPos[num])
                    Console.WriteLine("先别打了,赶紧走吧~~");
                else
                    走完后看看玩家踩到了什么(num2);
            }
            else
            {
                switch (map[playPos[num]])
                {
                    case 0:
                        Console.WriteLine("恭喜,玩家{0}安全着陆!", playName[num]);
                        break;
                    case 1:
                        幸运轮盘(num);
                        break;
                    case 2://地雷
                        Console.WriteLine("恭喜,玩家{0}踩到了地雷,退5格!", playName[num]);
                        playPos[num] -= 2;
                        安全检测(num);
                        走完后看看玩家踩到了什么(num);
                        break;
                    case 3://暂停
                        Console.WriteLine("玩家{0},太胖被卡住了,暂停一回合!", playName[num]);
                        playFlag[num] = false;
                        break;
                    case 4: //时空隧道
                        Console.WriteLine("坑爹呀,玩家{0}进入时空隧道了!进10格!", playName[num]);
                        playPos[num] += 10;
                        安全检测(num);
                        走完后看看玩家踩到了什么(num);
                        break;
                }
                //清屏
                Console.WriteLine("按任意键开始执行!");
                Console.ReadKey(true);
                Console.Clear();
                //画地图
                DrawMapWithinCharacters();

            }
        }
        public static void 幸运轮盘(int num)
        {
            int num2 = 0;
            if (num == 1) num2 = 0;
            else num2 = 1;

            Console.WriteLine("哎呦,玩家{0}踩了幸运轮盘,请选择:1-交换位置\t2-轰炸对方", playName[num]);
            while (true)
            {
                try
                {
                    int input = Convert.ToInt32(Console.ReadLine());
                    if (input == 1 || input == 2)
                    {
                        if (input == 1)
                        {
                            Console.WriteLine("玩家{0}选择了交换位置!", playName[0]);
                            int temp = playPos[0];
                            playPos[0] = playPos[1];
                            playPos[1] = temp;
                        }
                        else
                        {
                            Console.WriteLine("玩家{0}选择了轰炸对方,对方退6格", playName[num2]);
                            playPos[num2] -= 6;
                            安全检测(num2);
                        }

                        break;
                    }
                    else
                    {
                        Console.WriteLine("只能输入1或2!,请重新输入!");
                    }
                }
                catch
                {
                    Console.WriteLine("请输入数字!,请重新输入!");
                }
            }

        }
        public static void 安全检测(int num)
        {
            if (playPos[num] < 0) playPos[num] = 0;
            if (playPos[num] > 99) playPos[num] = 99;
        }

        public static void 显示胜利符号()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("                                          ◆                      ");
            Console.WriteLine("                    ■                  ◆               ■        ■");
            Console.WriteLine("      ■■■■  ■  ■                ◆■         ■    ■        ■");
            Console.WriteLine("      ■    ■  ■  ■              ◆  ■         ■    ■        ■");
            Console.WriteLine("      ■    ■ ■■■■■■       ■■■■■■■   ■    ■        ■");
            Console.WriteLine("      ■■■■ ■   ■                ●■●       ■    ■        ■");
            Console.WriteLine("      ■    ■      ■               ● ■ ●      ■    ■        ■");
            Console.WriteLine("      ■    ■ ■■■■■■         ●  ■  ●     ■    ■        ■");
            Console.WriteLine("      ■■■■      ■             ●   ■   ■    ■    ■        ■");
            Console.WriteLine("      ■    ■      ■            ■    ■         ■    ■        ■");
            Console.WriteLine("      ■    ■      ■                  ■               ■        ■ ");
            Console.WriteLine("     ■     ■      ■                  ■           ●  ■          ");
            Console.WriteLine("    ■    ■■ ■■■■■■             ■              ●         ●");
            Console.ResetColor();
        }

        public static void 判断是不是到了最后(int num)
        {
            if (playPos[num] >= 99)
            {
                Console.WriteLine("悲剧,玩家{0}无耻的赢了!", playName[num]);
                显示胜利符号();
            }
        }
        public static void 一个人玩游戏(int num)
        {
            Console.WriteLine("按任意键开始执行!");
            Console.ReadKey(true);
            Console.Clear();
            DrawMapWithinCharacters();
            投色子(num);
            Console.ReadKey(true);

            Console.Clear();
            DrawMapWithinCharacters();
            走完后看看玩家踩到了什么(num);
        }
        public static void 两个人轮流玩游戏()
        {
            while ((playPos[0] < 99 && playPos[1] < 99))
            {
                if (playFlag[0]) 一个人玩游戏(0);
                else playFlag[0] = true;
                if (playPos[0] >= 99) break;
                if (playFlag[1]) 一个人玩游戏(1);
                else playFlag[1] = true;
                if (playPos[1] >= 99 || playPos[0] >= 99) break;
            }

        }
        static void Main(string[] args)
        {
            DrawTheLogo();
            GetTwoNamesOfTwoPlayers();
            PutElementsIntoMap();
            DrawMapWithinCharacters();
            //一个人玩游戏(0);
            两个人轮流玩游戏();


            Console.ReadKey();
        }
    }
}



你可能感兴趣的:(.NET程序)