黑马程序员-----------骑士飞行棋

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

这是我第一次完成骑士飞行棋的代码,贴上来咯!

namespace 飞行棋
{
    class Program
    {
        //在下面的数组存储我们游戏地图的各个关卡
        //在数组中的值中用  0表示普通□
        //                  1表示幸运轮盘○
        //                  2表示地雷☆
        //                  3表示暂停▲
        //                  4表示时空隧道卐   
        static int[] Map = new int[100];
        //代表用户AB当前位置的下标  ,namesPost[0]代表A的当前位置的下标,namesPost[1]代表B当前位置的下标
        static int[] namesPost = {0,0};
        static string[] names = new string[2];//存放两个玩家的姓名,names[0]表示玩家A,names[1]表示玩家B
        static bool[] isStop = { false, false };//判断两个玩家是否上一次踩到地雷,暂停掷骰子一次,isStop[0]表示玩家A,isStop[1]表示玩家B ,true表示踩到地雷,暂停一次
        static void Main(string[] args)
        {
            ShowUI();
            Console.WriteLine("请输入玩家A的姓名?");
            names[0] = Console.ReadLine();
            while(names[0]=="")
            {
                Console.WriteLine("姓名不能为空,请重新输入!");
                names[0]=Console.ReadLine();
            }
            Console.WriteLine("请输入玩家B的姓名?");
            names[1] = Console.ReadLine();
            while(names[1]=="" || names[1]==names[0])
            {
                if (names[1] == "")
                {
                    Console.WriteLine("姓名不能为空,请重新输入!");
                    names[1] = Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("该用户名已存在,请重新输入!");
                    names[1] = Console.ReadLine();
                }
            }
            Console.Clear();
            ShowUI();
            Console.WriteLine("对战开始:");
            Console.WriteLine("{0}的士兵用A表示",names[0]);
            Console.WriteLine("{0}的士兵用B表示",names[1]);
            Console.WriteLine("如果AB在同一位置,则用<>来表示");
            IntialMap();
            DrawMap();
            Console.WriteLine("游戏开始.....");
            
            //游戏开始,请玩家开始掷骰子
            while (namesPost[0] < 99 && namesPost[1] < 99)
            {
                //玩家A投掷骰子
                Action(0);
                if (namesPost[0] > 99)//判断玩家A是否走到终点,如果走到终点,则跳出循环
                {
                    break;
                }
                // 玩家B投掷骰子
                Action(1);
            }

            //游戏结束,宣布游戏结果
            ShowUI();
            if (namesPost[0] >= 99)
            {
                Console.WriteLine("{0}赢了!!!", names[0]);
            }
            else
            {
                Console.WriteLine("{0}赢了!!!",names[1]);
            }
            Console.WriteLine("游戏结束!");
            Console.ReadKey();

        }
        /// <summary>
        /// 掷骰子
        /// </summary>
        /// <param name="playerNumber">如果playerNumber传入的是0则表示当前玩家是A玩家,如果playerNumber传入的是1则表示当前玩家是B玩家</param>
        static void Action(int playerNumber)
        {

            //如果playerNumber表示当前玩家,那么对方玩家用1-playerNumber
            //如果当前玩家是0,则对方玩家1-0=1;  如果当前玩家是1,则对方玩家是1-1=0;
            Random r = new Random();//随机数
            string msg = "";//用来存放玩家遇到的关卡的提示
            int step = 0;//用户存放随机产生的随机数
            if (isStop[playerNumber] == false)//判断玩家是否在上一次掷骰子中走到了地雷
            {
                Console.WriteLine("请玩家{0}按任意键开始掷骰子......", names[playerNumber]);
                ConsoleKeyInfo rec = Console.ReadKey(true);
                step = r.Next(1, 7);//产生一个>=1并且<7的随机数
                if (rec.Key == ConsoleKey.Tab && rec.Modifiers == ConsoleModifiers.Control | rec.Modifiers == ConsoleModifiers.Alt)//如果用户按下的是Tab键,则就相当于这个骰子的点数是20
                {
                    if (rec.Key == ConsoleKey.F1)
                    {
                        step = ReadInt(1, 100);
                    }
                }
                Console.WriteLine("{0}掷了{1}", names[playerNumber], step);
                Console.WriteLine("按任意键行动......");
                Console.ReadKey(true);
                namesPost[playerNumber] = namesPost[playerNumber] + step;//重新对下标进行赋值
                //每一次下标的改变都要判断这个下标是否已经超出界限
                CheckPos();
                //判断玩家A是否踩到了玩家B
                if (namesPost[0] == namesPost[1])
                {
                    msg = string.Format("{0}踩到了{1},{1}被遣返至起点......", names[playerNumber], names[1 - playerNumber]);
                    namesPost[1 - playerNumber] = 0;
                }
                else
                {
                    //判断玩家A是否遇到其他关卡
                    switch (Map[namesPost[playerNumber]])
                    {
                        case 0://普通
                            msg = "";
                            break;
                        case 1://幸运轮盘  1、轰炸对方  2、与对方交换位置
                            Console.WriteLine("恭喜您到达幸运轮盘,请输入1或者2选择幸运服务:");
                            Console.WriteLine("1、轰炸对方   2、与对方交换位置");
                            int choice = ReadInt(1, 2);
                            if (choice == 1)
                            {
                                msg = string.Format("{0}走到了幸运轮盘,选择了轰炸对方!", names[playerNumber]);
                                namesPost[1] = 0;
                            }
                            else
                            {
                                msg = string.Format("{0}走到了幸运轮盘,选择了与对方交换位置!", names[playerNumber]);
                                int stemp = namesPost[0];
                                namesPost[0] = namesPost[1];
                                namesPost[1] = stemp;
                            }
                            break;
                        case 2://地雷   向后退8格
                            msg = string.Format("很不幸{0}踩到了地雷,向后退8格", names[playerNumber]);
                            namesPost[playerNumber] = namesPost[playerNumber] - 8;
                            CheckPos();
                            break;
                        case 3://暂停一次   
                            msg = string.Format("{0}走到红灯,暂停掷骰子一次!", names[playerNumber]);
                            isStop[0] = true;
                            break;
                        case 4://时空隧道   向前进10格
                            msg = string.Format("{0}到达时空隧道,前进10格!", names[playerNumber]);
                            namesPost[playerNumber] = namesPost[playerNumber] + 10;
                            CheckPos();
                            break;
                    }
                }
                //清屏
                Console.Clear();
                //绘制地图
                DrawMap();
                Console.WriteLine(msg);
                Console.WriteLine("{0}刚刚投掷了{1}", names[playerNumber], step);
                Console.WriteLine("***********************玩家A和玩家B的当前位置如下***********************");
                Console.WriteLine("{0}的位置是{1}", names[0], namesPost[0] + 1);
                Console.WriteLine("{0}的位置是{1}", names[1], namesPost[1] + 1);
            }
            else
            {
                isStop[playerNumber] = false;
            }
        }
        /// <summary>
        /// 用于获取当前输入的数据是否是整数的方法
        /// 并且当前的整数必须大于最小值,小于最大值
        /// </summary>
        /// <param name="min">最小值</param>
        /// <param name="max">最大值</param>
        /// <returns></returns>
        static int   ReadInt(int min ,int max)
        {
            int result;
            while (true)
            {
                try
                {
                    result = Convert.ToInt32(Console.ReadLine());
                    if (result > max)
                    {
                        Console.WriteLine("您输入的数据不正确,请重新输入!");
                    }
                    else if (result < min)
                    {
                        Console.WriteLine("您输入的数据格式不正确,请重新输入!");
                    }
                    else
                    {
                        break;
                    }
                }
                catch
                {
                    Console.WriteLine("输入的数据格式不正确,请重新输入!");

                }  
            }
            return result;
        }
        /// <summary>
        /// 用于检测下标是否越界的方法
        /// </summary>
        static void CheckPos()
        {
            for (int i = 0; i <= 1; i++)
            {
                if (namesPost[i] > 99)
                {
                    namesPost[i] = 99;
                }
                if (namesPost[i] < 0)
                {
                    namesPost[i] = 0;
                }
            }
        }

        /// <summary>
        /// 显示飞行棋的名称
        /// </summary>
        static void ShowUI()
        {
            Console.WriteLine("********************************************************");
            Console.WriteLine("*                                                      *");
            Console.WriteLine("*                骑  士  飞   行   棋                  *");
            Console.WriteLine("*                                                      *");
            Console.WriteLine("********************************************************");
        }
        /// <summary>
        /// 对飞行棋地图进行初始化
        /// </summary>
        static void IntialMap()
        {
            for (int i = 0; i < Map.Length; i++)
            {
                Map[i] =0;
            }
            //用于存储在地图中关卡的下标
            int[] luckyTurn = { 6, 23, 40, 55, 69, 83 ,98};//幸运轮盘1
            int[] landMine = { 5,13,17,33,38,50,64,80,94};//地雷2
            int[] pause = { 9,27,60,93};//暂停3
            int[] timeTunnet = { 20,25,45,63,72,88,90,99};//时空隧道4
           
            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 < timeTunnet.Length; i++)
            {
                Map[timeTunnet[i]] = 4;
            }
        }
        /// <summary>
        /// 绘制地图
        /// </summary>
        static void DrawMap()
        {
            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));
            }
            //绘制第2个横行的地图,下标为36-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();
            //绘制完地图后要将控制台的前景色修改成白色
            Console.ForegroundColor = ConsoleColor.White;
            //将控制太的前景色和背景色都修改成默认
            //Console.ResetColor();
        }
        /// <summary>
        /// 获取当前下标要绘制的图案
        /// </summary>
        /// <param name="pos">当前下标</param>
        /// <returns></returns>
        static string GetMapString(int pos)
        {
            string result="";
            if (namesPost[0] == pos && namesPost[1] == pos)//首先判断AB是否在当前位置
            {
               result="<>";
            }
            else if (namesPost[0] == pos)//然后判断A是否在当前位置
            {
                result="A";
            }
            else if (namesPost[1] == pos) //再判断B是否在当前位置
            {
                result="B";
            }
            else//最后再根据当前位置的下标来显示地图信息
            {
                switch (Map[pos])
                {
                    case 0:
                        Console.ForegroundColor = ConsoleColor.White;
                        result="□";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Green;
                        result="○";
                        break;
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Yellow;
                       result="☆";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        result="▲";
                        break;
                    case 4:
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        result="卐";
                        break;
                }
            }
            return result;
        }
    }
}


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

详细请查看:www.itheima.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值