黑马程序员----小游戏代码之“骑士飞行棋”


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



骑士飞行棋代码如下:

 class Program
    {
        //在下面的数组中存储我们游戏地图里的各个关卡
        //数组的下标为0的元素对应地图上的第一格,下标为1的元素对应第二格。。。下标为n的元素对应第n+1格
        //在数组中用:1:表示幸运轮盘○
        //            2:表示地雷☆
        //            3:表示暂停△
        //            4:表示时空隧道卐
        //            5:表示普通■
        static bool[] isStop = { false, false }; //isStop[0]表示A上一次是否走到了暂停,isStop[1]表示B,如果走到暂停,则设置其值为true;
        static string[] names = new string[2];  //用names[0]存储玩家A的姓名,用names[1]存储玩家B的姓名。
        static int[] Map = new int[100];      //这是一个字段,由于下面的方法都是静态的,所以想访问此字段,必须在字段前加static修饰。  
        static int[] playerPos = { 0, 0 };           //playerPos[0]存储玩家A的下标,palyerPos[1]存储玩家B的下标
        static void Main(string[] args)
        { 
           
            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表示",names[0]);
            Console.WriteLine("{0}的士兵用B表示",names[1]);
            Console.WriteLine("如果AB在同一位置用<>来表示!");
           
            InitialMap();   //初始化地图
            DrawMap();      //绘制地图
            //这个循环让玩家A和玩家B轮流掷骰子,当玩家A或玩家B的坐标>=99的时候,结束循环
            //所以循环条件是
            while (playerPos[0] < 99 && playerPos[1] < 99)
            {
                if (isStop[0] == false)
                {
                    Action(0);
                }
                else
                {
                    //说明isStop=true;
                    isStop[0] = false;
                }
                if (playerPos[0] >= 99)
                {
                    break;
                }
                if (isStop[1] == false)
                {
                    Action(1);
                }
                else
                {
                    isStop[1] = false;
                }
            }
            //判断谁取得了胜利,谁失败
            if (playerPos[0] == 99)
            {
                Console.Clear();
                ShowUI();
                Console.WriteLine("{0},恭喜,您获得了胜利!", names[0]);
                Console.WriteLine("{0},很遗憾,您失败了,下次继续努力!",names[1]);
            }
            else
            {
                Console.Clear();
                ShowUI();
                Console.WriteLine("{0},恭喜,您获得了胜利!", names[1]);
                Console.WriteLine("{0},很遗憾,您失败了,下次继续努力!", names[0]);
            }
            Console.ReadKey();
    }



        /// <summary>
        /// A或B掷骰子的方法
        /// </summary>
        /// <param name="playNumber">A掷骰子传过来0   B掷骰子传过来1</param>
        static void Action(int playNumber)
        {
            string msg = "";//用于存储用户踩到关卡时所输出的话
            Random r = new Random();//r用于产生随机数的变量
            int step = 0;      //step用于接收随机数
            Console.WriteLine("{0}按任意键开始掷骰子---", names[playNumber]);
            ConsoleKeyInfo rec = Console.ReadKey(true);
            if (rec.Key == ConsoleKey.Tab)
            {
                step = 20;
            }
            else
            {
                //得到一个随机数,并把这个随机数赋给step
                step = r.Next(1, 7);   //产生一个1到6的随机整数
            }
            Console.WriteLine("{0}得到一个:{1}", names[playNumber], step);
            Console.WriteLine("按任意键开始行动----");
            Console.ReadKey(true);
            playerPos[playNumber] += step;   //注意:一旦坐标发生改变,就要判断坐标值是否>99或者<0
            checkpos();     //检测坐标是否越界
            if (playerPos[0] == playerPos[1])   //检测玩家A 是否踩到了玩家B
            {
                playerPos[1 - playNumber] = 0;     //踩到了
                msg = string.Format("{0}踩到了{1},{1}退回原点!", names[playNumber], names[1 - playNumber]);
            }
            else
            {
                //没踩到   就要判断玩家A所在的位置是否有关卡
                switch (Map[playerPos[playNumber]])
                {
                    case 0:
                        //普通  没有效果
                        msg = "";
                        break;
                    case 1:
                        //幸运轮盘 选择运气
                        Console.Clear();
                        DrawMap();
                        Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[playNumber]);
                        Console.WriteLine("1--交换位置   2--轰炸对方");
                        int userSelect = ReadInt(1, 2);
                        if (userSelect == 1)
                        {
                            //要与对方交换位置
                            int stemp = playerPos[0];
                            playerPos[0] = playerPos[1];
                            playerPos[1] = stemp;
                            msg = string.Format("{0}选择了与{1}交换位置!", names[playNumber], names[1 - playNumber]);
                        }
                        else
                        {
                            //要轰炸对方
                            playerPos[1 - playNumber] -= 6;  //注意,坐标一旦发生改变,就要判断时都越界
                            checkpos();
                            msg = string.Format("{0}选择了轰炸{1},{1}退后6格!", names[playNumber], names[1 - playNumber]);
                        }
                        break;
                    case 2:
                        //踩到地雷 倒退6步
                        playerPos[playNumber] -= 6;
                        checkpos();
                        msg = string.Format("{0}踩到了地雷,后退6格!", names[playNumber]);
                        break;
                    case 3:
                        //暂停一次
                        isStop[playNumber] = true;
                        msg = string.Format("{0}走到了暂停,{1}连续掷两次骰子", names[playNumber], names[1 - playNumber]);

                        break;
                    case 4:
                        //时空隧道
                        playerPos[playNumber] += 10;
                        checkpos();
                        msg = string.Format("{0}进入了时空隧道,太幸运啦,前进10格!", names[playNumber]);
                        break;
                }
            }

            Console.Clear();
            DrawMap();
            Console.WriteLine("{0}掷出了{1}", names[playNumber], step);
            if (msg != "")
            {
                Console.WriteLine(msg);
            }
            Console.WriteLine("*************玩家A和玩家B的位置是**************");
            Console.WriteLine("{0}的新位置是{1}", names[0], playerPos[0] + 1);
            Console.WriteLine("{0}的新位置是{1}", names[1], playerPos[1] + 1);
            Console.ReadKey(true);
        }
        /// <summary>
        /// 用于绘制骑士飞行棋的名称,并显示界面
        /// </summary>
        static void ShowUI()
        {
            Console.WriteLine("************************************************");
            Console.WriteLine("*                                              *");
            Console.WriteLine("*               骑  士  飞  行  棋             *");
            Console.WriteLine("*                                              *");
            Console.WriteLine("************************************************");
        }
        /// <summary>
        /// 进行玩家A和玩家B坐标越界的判断
        /// </summary>
        static void checkpos()
        {
            for (int i = 0; i < 2; i++)
            {
                if (playerPos[i] > 99)
                {
                    playerPos[i] = 99;
                }
                if (playerPos[i] < 0)
                {
                    playerPos[i] = 0;
                }
            }

        }
        /// <summary>
        /// 对地图中的关卡进行初始化。
        /// </summary>
        static void InitialMap()
        { 
            //下面的数组用于存储Map数组中需要改变值得下标。
            int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };    //幸运轮盘    1
            int[] landMine = {5,13,17,33,38,50,64,80,94 };   //地雷       2
            int[] pause = {9,27,60,93 };                    //暂停坐标    3
            int[] timeTunnel = {20,25,45,63,72,88,90 };     //时空隧道    4
            //把Map数组中元素进行赋值
            for (int i = 0; i < luckyTurn.Length; i++)
            {
                int pos = luckyTurn[i];
                Map[pos] = 1;

            }
            for (int i = 0; i < landMine.Length; i++)
            {
                int pos = landMine[i];
                Map[pos] = 2;
            }
            for (int i = 0; i < pause.Length; i++)
            {
                int pos = pause[i];
                Map[pos] = 3;
            }
            for (int i = 0; i < timeTunnel.Length; i++)
            {
                int pos = timeTunnel[i];
                Map[pos] = 4;
            }
        }
           /// <summary>
           /// 获得第pos坐标上应该绘制的图案
           /// </summary>
           /// <param name="pos">要绘制的坐标</param>
           /// <returns></returns>
        static string getMapString(int pos) //pos是指要绘制的那一格的坐标
        {
            string result="";
            if (playerPos[0] == pos && playerPos[1] == pos)
            {
                Console.ForegroundColor = ConsoleColor.Yellow; //对所输出的图案附上颜色。
                result =  "<>";
            }
            else if (playerPos[0] == pos)     //A在当前画的格上
            {
                Console.ForegroundColor = ConsoleColor.Yellow; 
                result =  "A";
            }
            else if (playerPos[1] == pos)
            {
               Console.ForegroundColor = ConsoleColor.Yellow; 
               result =  "B";             //B在当前画的格上
            }
            else
            {
                switch (Map[pos])
                {
                    case 0:
                        Console.ForegroundColor = ConsoleColor.Gray;
                        result = "口";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Red;
                        result =  "◎";
                         break;
                    case 2:
                         Console.ForegroundColor = ConsoleColor.Blue;
                       result  =  "★";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.Yellow; 
                        result =  "▲";
                         break;
                    case 4:
                         
                        result =  "卍";
                        Console.ForegroundColor = ConsoleColor.Green;
                        break;
                }
            }
           
            return result;
            
          
        }
        /// <summary>
        /// 绘制地图
        /// </summary>
        static void DrawMap()
        {
            Console.WriteLine("图例:幸运轮盘:◎   地雷:★   暂停:▲   时空隧道:卍");
            //画第一行
            for (int i = 0; i < 30; i++)
            {
                string result = getMapString(i);
                Console.Write(result);  
            }
            Console.WriteLine();    //在绘制完30个格的时候换一下行。
            //画第一列
            for (int i = 30; i <= 34; i++)
            {

                //绘制29个双空格,因为全角的字符是两个空格
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                string result = getMapString(i);
                Console.WriteLine(result);
              
            }
            //画第二行
            for (int i = 64; i >= 35; i--)  //注意 i--
            {
                Console.Write(getMapString(i));
            }
            Console.WriteLine();   //注意:绘制完第二行注意换行
            //画第二列
            for (int i = 65; i < 70; i++)
            {
                Console.WriteLine(getMapString(i));
                
            }
            //绘制第三行
            for (int i = 70; i < 100; i++)
            {
                Console.Write(getMapString(i));
            }
            Console.WriteLine();
            Console.ResetColor();    //绘制完地图,记得把颜色恢复到默认颜色
        }
   
        /// <summary>
        /// 判断用户输入的整数是否越界
        /// </summary>
        /// <param name="min">最小值</param>
        /// <param name="max">最大值</param>
        /// <returns></returns>

        static int ReadInt(int min, int max)
        {
            while (true)
            {
                try
                {
                    int number = Convert.ToInt32(Console.ReadLine());
                    if (number < min || number > max)
                    {
                        Console.WriteLine("只能输入{0}--{1}之间的数,请重新输入",min,max);
                        continue;  //走到这一步要跳出本次循环,进行下次判断
                    }
                    return number;
                }
                catch
                {
                    Console.WriteLine("输入有误,请重新输入");
                }
            }

        }
    }




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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值