黑马程序员-自学笔记-面向过程编程(骑士飞行棋)

面向过程编程应用-骑士飞行棋

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1、界面

 

2、程序代码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

 

namespace_23.MyGames

{

   class Program

   {

       //在下面Map数组中存储我们游戏地图各关卡信息,数组的下标为0的元素对应地图上的第1格,下标为1的元素对应第2格...下标为n的元素对应n+1格;

       //在数组中用0:普通  1:幸运轮盘  2:表地雷  3:暂停  4:时空隧道卐

       static int[]Map = new int[100];

       static int[]playerpos = { 0, 0 }; //playerpos[0]存一玩家A的下标,playerpos[1]存一玩家B的下标

 

       static voidMain(string[] args)

       {

            Randomr = new Random();  //r为通过Random()方法产生的随机数

            intstep = 0;  //用于存放产生的随机数   

            stringmsg = ""// 用于存储用户踩到某关卡输出相关信息

            bool[]isStop = { false, false}; //isStop[0]表示A是否上一次走到了暂停;isStop[1]表示B是否上一次走到了暂停。如果走到暂停将其值更改为true.

 

            string[]names = new string[2];//names[0]存放玩家A的姓名,names[1]存放玩家B的姓名。

            ShowUI(); //显示游戏名称

            Console.WriteLine("请输入玩家A的姓名?");

            names[0] = Console.ReadLine();

            //判断用户输入的内容是否为空,如果为空,则让用户重新输入。

            while(names[0] == "")

            {

                Console.WriteLine("玩家A的姓名不能为空,请重新输入!");

                names[0] = Console.ReadLine();

            }

            Console.WriteLine("请输入玩家B的姓名?");

            names[1] = Console.ReadLine();

            while(names[1] == "" || names[1] ==names[0])

            {

                if(names[1] == "")

                {

                    Console.WriteLine("玩家B的姓名不能为空,请重新输入!");

                }

                if(names[1] == names[0])//A和B重名

                {

                    Console.WriteLine("该姓名已被玩家A占用!");

                }

                names[1] = Console.ReadLine();

            }

            Console.Clear();//清屏

            ShowUI();

            Console.WriteLine("对战开始......");

            Console.WriteLine("{0}用A来表示 {1}用B来表示",names[0],names[1]);

            Console.WriteLine("如果A和B在同一位置,用<>来表示");

            InitialMap(); //初始化地图

            DrawMap(); //绘制地图

            Console.ResetColor();//将控制台的前景色及背景色恢复默认值

            Console.WriteLine("开始游戏......");

          

            //循环让玩家A和玩家B轮流掷骰子,当玩家A或B的坐标>=99时循环结束。

            //产生一个m到n之间的随机数  Random r=new Random();   int i=r.Next(m,n+1);

            while(playerpos[0] < 99 && playerpos[1] < 99)

            {

                if(isStop[0] == false)

                {

                    #region 玩家A掷骰子

                    Console.WriteLine("{0}按任意键开始掷骰子......", names[0]);

                    ConsoleKeyInforec =Console.ReadKey(true);//ReadKey(true)不显示用户按下的键名

                    if(rec.Key ==ConsoleKey.Tab)

                    {

                        step = 20;  //玩家A可用Tab键作弊

                    }

                    else

                    {

                        step = r.Next(1, 7); //产生一个1-6之间的整数

                    }

                    Console.WriteLine("{0}掷出了:{1}", names[0], step);

                    Console.WriteLine("按任意键开始行动......");

                    Console.ReadKey(true);

                    playerpos[0] += step; //注意,一旦坐标发生改变就要判断坐标值是否>99或<0

                    CheckPos();  //坐标越界的判断

                    if(playerpos[0] == playerpos[1])//玩家A踩到玩家B

                    {

                        playerpos[1] = 0;

                        msg = string.Format("{0}踩到了{1},{1}退回原点",names[0], names[1]);

                    }

                    else

                    {

                        //没踩到,要判断玩家A现在所在的位置是否有其他关卡

                        switch (Map[playerpos[0]])

                        {

                            case 1://走到幸运轮盘关卡

                                Console.Clear();

                                DrawMap();

                                Console.WriteLine("{0}走到了幸运轮盘,请选择运气?",names[0]);

                                Console.WriteLine("1-交换位置 2-轰炸对方");

                                int userSelect = ReadInt(1, 2);

                                if (userSelect == 1)

                                {

                                    //与对方交换位置

                                    int temp = playerpos[0];

                                   playerpos[0] = playerpos[1];

                                   playerpos[1] = temp;

                                    msg = string.Format("{0}选择了与{1}交换位置!",names[0], names[1]);

                                }

                                else

                                {

                                    //轰炸对方,退6

                                   playerpos[1] -= 6;

                                    CheckPos();

                                    msg = string.Format("{0}轰炸了{1},{1}退6格!",names[0], names[1]);

                                }

 

                                break;

                            case 2://踩到了地雷关卡

                                playerpos[0] -=6;

                                CheckPos();

                                msg = string.Format("{0}踩到了地雷,退6格!", names[0]);

                                break;

                            case 3://走到暂停一次关卡

                                isStop[0] = true;

                                msg = string.Format("{0}走到暂停,下次暂停一次!",names[0]);

                                break;

                            case 4://走到时空隧道关卡

                                playerpos[0] += 10; //穿越时空隧道,前进10

                                CheckPos();

                                msg = string.Format("{0}进入时空隧道,前进10格!", names[0]);

                                break;

                            default://普通,没有效果

                                msg = "";

                                break;

                        }

                    }

                    Console.Clear();

                    DrawMap();

                    if(msg != "")

                    {

                        Console.WriteLine(msg);

                    }

                    Console.WriteLine("{0}掷出了{1},行动完成",names[0], step);

                    Console.WriteLine("**********玩家A与玩家B的位置如下**********");

                    Console.WriteLine("{0}的位置在第{1}格;",names[0], playerpos[0] + 1);

                    Console.WriteLine("{0}的位置在第{1}格;",names[1], playerpos[1] + 1);

 

                    #endregion

                }

                else

                {

                    //说明isStop == true

                    isStop[0] = false;

                }

 

                if(playerpos[0] >= 99)

                {

                    break;

                }

 

                if(isStop[1] == false)

                {

                    #region 玩家B掷骰子

                    Console.WriteLine("{0}按任意键开始掷骰子......", names[1]);

                    Console.ReadKey(true);//不显示用户按下的键名

                    step = r.Next(1, 7); //产生一个1-6之间的整数

                    Console.WriteLine("{0}掷出了:{1}", names[1], step);

                    Console.WriteLine("按任意键开始行动......");

                    Console.ReadKey(true);

                    playerpos[1] += step; //注意,一旦坐标发生改变就要判断坐标值是否>99或<0

                    CheckPos();  //坐标越界的判断

                    if(playerpos[1] == playerpos[0])//玩家B踩到玩家A

                    {

                        playerpos[0] = 0;

                        msg = string.Format("{0}踩到了{1},{1}退回原点",names[1], names[0]);

                    }

                    else

                    {

                        //没踩到,要判断玩家A现在所在的位置是否有其他关卡

                        switch (Map[playerpos[1]])

                        {

                            case 1://走到幸运轮盘关卡

                                Console.Clear();

                                DrawMap();

                                Console.WriteLine("{0}走到了幸运轮盘,请选择运气?",names[1]);

                                Console.WriteLine("1-交换位置 2-轰炸对方");

                                int userSelect = ReadInt(1, 2);

                                if (userSelect == 1)

                                {

                                    //与对方交换位置

                                    int temp = playerpos[0];

                                   playerpos[0] = playerpos[1];

                                   playerpos[1] = temp;

                                    msg = string.Format("{0}选择了与{1}交换位置!",names[1], names[0]);

                                }

                                else

                                {

                                    //轰炸对方,退6

                                   playerpos[0] -= 6;

                                    CheckPos();

                                    msg = string.Format("{0}轰炸了{1},{1}退6格!",names[1], names[0]);

                                }

 

                                break;

                            case 2://踩到了地雷关卡

                                playerpos[1] -=6;

                                CheckPos();

                                msg = string.Format("{0}踩到了地雷,退6格!", names[1]);

                                break;

                            case 3://走到暂停一次关卡

                                isStop[0] = true;

                                msg = string.Format("{0}走到暂停,下次暂停一次!",names[1]);

                                break;

                            case 4://走到时空隧道关卡

                                playerpos[1] +=10; //穿越时空隧道,前进10

                                CheckPos();

                                msg = string.Format("{0}进入时空隧道,前进10格!",names[1]);

                                break;

                            default://普通,没有效果

                                msg = "";

                                break;

                        }

                    }

                    Console.Clear();

                    DrawMap();

                    if(msg != "")

                    {

                        Console.WriteLine(msg);

                    }

                    Console.WriteLine("{0}掷出了{1},行动完成",names[1], step);

                    Console.WriteLine("**********玩家A与玩家B的位置如下**********");

                    Console.WriteLine("{0}的位置在第{1}格;",names[0], playerpos[0] + 1);

                    Console.WriteLine("{0}的位置在第{1}格;",names[1], playerpos[1] + 1);

 

                    #endregion

                }

                else

                {

                    isStop[1] = false;

                }

            }

 

            //判断胜利与失败

            Console.Clear();

            Console.ResetColor();//将控制台的前景色及背景色恢复默认值

            ShowUI();

            if(playerpos[0] >= 99)

            {

                Console.WriteLine("{0}胜利了!!!!!!!", names[0]);

            }

            else

            {

                Console.WriteLine("{0}胜利了!!!!!!!", names[1]);

            }

 

 

 

            Console.ReadKey();

       }

 

       ///<summary>

       ///用于绘制飞行棋名称UI界面

       ///</summary>

       static voidShowUI()

       {

            Console.WriteLine();

            Console.WriteLine("************************************************************");

            Console.WriteLine("*                                                         *");

            Console.WriteLine("*                   骑 士  飞  行  棋                    *");

            Console.WriteLine("*                                                         *");

            Console.WriteLine("************************************************************");

       }

 

       ///<summary>

       ///进行玩家A和玩家B坐标越界的判断

       ///</summary>

       static voidCheckPos()

       {

            for(int i = 0; i < 2; i++)

            {

                if(playerpos[i] > 99)

                {

                    playerpos[i] = 99;

                }

                if(playerpos[i] < 0)

                {

                    playerpos[i] = 0;

                }

            }

       }

 

       ///<summary>

       ///对地图中的关卡进行初始化

       ///</summary>

       static voidInitialMap()

       {

            //用于存储在地图中为幸运轮盘的下标

            int[]luckTurn = {6,23,40,55,69,83,98};      //幸运轮盘 1

            for(int i = 0; i < luckTurn.Length; i++)

            {

                Map[luckTurn[i]] = 1;

            }

            //用于存储在地图中为地雷的下标

            int[]landMine = {5,13,17,33,38,50,64,80,94};//地雷 2

            for(int i = 0; i < landMine.Length; i++)

            {

                Map[landMine[i]] = 2;

            }

            //用于存储在地图中为暂停的下标

            int[]pause = {9,27,60,93};                  //暂停 3

            for(int i = 0; i < pause.Length; i++)

            {

                Map[pause[i]] = 3;

            }

            //用于存储在地图中为时空隧道的下标

            int[]timeTunnel = {20,25,45,63,72,88,90};   //时空隧道 4

            for(int i = 0; i < timeTunnel.Length; i++)

            {

                Map[timeTunnel[i]] = 4;

            }

       }

 

       ///<summary>

       ///获得第pos坐标上应该绘制的图案

       ///</summary>

       ///<param name="pos">要绘制的坐标</param>

       ///<returns>result图案</returns>

       static stringGetMapString(int pos)

       {

            stringresult = "";

            //判断A和B是否在当前要画的第i格上

            if(playerpos[0] == pos && playerpos[1] == pos)//A和B都在当前画的格上

            {

                Console.ForegroundColor=ConsoleColor.Yellow;//设置控制台的前景色,给图标添加颜色

                result="<>";

            }

            elseif (playerpos[0] == pos)//A在当前画的格上

            {

                Console.ForegroundColor=ConsoleColor.DarkMagenta;

                result="A";

            }

            elseif (playerpos[1] == pos)//B在当前画的格上

            {

                Console.ForegroundColor=ConsoleColor.Yellow;

                result="B";

            }

            else

            {

                switch(Map[pos]) //根据下标画关卡

                {

                    case0:

                        Console.ForegroundColor =ConsoleColor.White;//设置控制台的前景色,给图标添加颜色

                        result="";

                        break;

                    case1:

                        Console.ForegroundColor =ConsoleColor.Red;

                        result="";

                        break;

                    case2:

                        Console.ForegroundColor =ConsoleColor.Green;

                        result="";

                        break;

                    case3:

                        Console.ForegroundColor =ConsoleColor.Blue;

                        result="";

                        break;

                    case4:

                        Console.ForegroundColor =ConsoleColor.Magenta;

                        result="卐";

                        break;

                }

            }

            returnresult;

       }

 

       ///<summary>

       ///绘制对战地图

       ///</summary>

       static voidDrawMap()

       {

            Console.WriteLine("图例:幸运轮盘: 地雷: 暂停: 时空隧道:卐");

            //画第一行,绘制下标0-29格的地图

            for(int i = 0; i <= 29; i++)

            {

                Console.Write(GetMapString(i));

            }

            Console.WriteLine();//绘制完第一行光标换行

 

            //绘制第一列,绘制下标30-34格的地图

            for(int i = 30; i <= 34; i++)

            {

                //绘制29个双空格

                for(int j = 0; j < 29; j++)

                {

                    Console.Write("  ");

                }

                Console.WriteLine(GetMapString(i));

            }

 

            //画第二行,绘制下标35-64格的地图

           for(int i = 64; i >= 35; i--)

            {

                Console.Write(GetMapString(i));

            }

            Console.WriteLine();//绘制完第二行光标换行

 

            //绘制第二列,绘制下标65-69格的地图

            for(int i = 65; i <= 69; i++)

            {

                Console.WriteLine(GetMapString(i));

            }

 

            //画第三行,绘制下标70-99格的地图

            for(int i = 70; i <= 99; i++)

            {

                Console.Write(GetMapString(i));

            }

            Console.WriteLine();//绘制完第三行光标换行

       }

 

 

       static intReadInt()

       {

            inti=ReadInt(int.MinValue,int.MaxValue);

            returni;

       }

       static intReadInt(int min, intmax)

       {

            while(true)

            {

                try

                {

                    intnumber = Convert.ToInt32(Console.ReadLine());

                    if(number < min || number > max)

                    {

                        Console.WriteLine("只能输入{0}-{1}之间的数",min, max);

                        continue;

                    }

                    returnnumber;

                }

                catch

                {

                    Console.WriteLine("只能输入数字,请重新输入!");

                }

            }

       }

   }

}

 --------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值