黑马程序员--.NET笔记-骑士飞行棋


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


骑士飞行棋:   (注:仅供以后自己练习比较用)

 

地图坐标: 

 

 

坐标图: 


 Console.ReadKey(true)    

  

 

 

产生一个随机数: 



String.Format   在定义时 

例:msg = string.Format("{0}踩到了{1}{1}退6",names[0],names[1]); 

 

玩家AB循环暂停图: 




参考代码 

 

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

 

namespace 骑士飞行棋 

{ 

    class Program 

    { 

        //在下面的数组存储我们游戏地图各个关卡 

            //数组的下标为0的元素对应地图上的第1   下标为1的元素对应第2...下标为n的元素对应n+1 

            //在数组中用     1:表示幸运轮盘◎ 

            //               2:地雷☆ 

            //               3:暂停■ 

            //               4:时空隧道※ 

            //               0:表示普通□ 

 

 

 

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

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

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

          static bool[] isStop = { falsefalse };  //isStop[0]表示A是否上一次走到的暂停 isStop[1]表示如果走到暂停,则设置其值为true 

 

        static void Main(string[] args) 

        { 

             

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

             

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

            names[0] = Console.ReadLine(); 

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

            while (names[0] == "")   

            { 

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

                names[0] = Console.ReadLine(); 

            } 

 

            Console.WriteLine("请输入玩家B的姓名?(不能和玩家A相同!)"); 

            names[1] = Console.ReadLine(); 

            while (names[1] == "" || names[1] == names[0])  //考虑逻辑或还是逻辑与 

            { 

                if (names[1] == "") 

                { 

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

                } 

                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在同一个位置,用<>来表示"); 

 

 

            InitiaMap(); //初始化地图 

            DrawMap();  //绘制地图 

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

 

 

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

            //循环条件就是:playerPos[0]<99 && playerPos[1]<99 

             

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

            { 

                if (isStop[0] == false) 

                { 

                    Action(0); ; 

                } 

                else 

                { //说明isStop==true 

                    isStop[0] = false; 

                } 

 

                if (playerPos[0] >= 99)   //判断A是否完成 

                { 

                    break; 

                } 

 

                if (isStop[1] == false) 

                { 

                    Action(1); 

                } 

                else 

                { 

                    isStop[1] = false; 

                } 

            } 

 

            //判断谁胜利,谁失败。 

            Console.Clear(); 

            ShowUI(); 

            if (playerPos[0] >= playerPos[1]) 

            { 

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

            } 

            else 

            { 

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

            } 

 

 

 

            Console.ReadKey(); 

        } 

 

 

        /// <summary> 

        /// 用于绘制飞行器的名称 

        /// </summary> 

        static void ShowUI()    //输出不用返回值 

        { 

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

            Console.WriteLine("*                                       *"); 

            Console.WriteLine("*               器(laohu.net *"); 

            Console.WriteLine("*                                       *"); 

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

        } 

 

 

        /// <summary> 

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

        /// </summary> 

        static void CheckPos() 

        { 

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

            { 

                if (playerPos[i] > 99) 

                { 

                    playerPos[i] = 99; 

                } 

                if (playerPos[i] < 0) 

                { 

                    playerPos[i] = 0; 

                } 

            } 

        } 

 

 

        /// <summary> 

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

        /// </summary> 

        static void InitiaMap() 

        {  

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

            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[] timeTunnel={20,25,45,63,72,88,90};//时空隧道  4 

 

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

            { 

                int pos = luckyTurn[i];  // 

                Map[pos] = 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; 

            } 

        } 

 

 

        /// <summary> 

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

        /// </summary> 

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

        /// <returns></returns> 

        static string GetMapString(int pos) 

        { 

            string result = " "; 

             

            //判断AB是否在当前要画的第i格上 

            if (playerPos[0] == pos && playerPos[1] == pos) 

            { 

                Console.ForegroundColor = ConsoleColor.Yellow; 

                result = "<>"; 

            } 

            else if (playerPos[0] == pos//判断A在当前画的格上 

            { 

                Console.ForegroundColor = ConsoleColor.Yellow; 

                result = ""; 

            } 

            else if (playerPos[1] == pos)  //判断B在当前画的格上 

            { 

                Console.ForegroundColor = ConsoleColor.Yellow; 

                result = ""; 

            } 

            else 

            { 

                switch (Map[pos]) 

                { 

                    case 0: 

                        Console.ForegroundColor = ConsoleColor.White; 

                        result = ""; 

                        break; 

                    case 1: 

                        Console.ForegroundColor = ConsoleColor.Red; 

                        result = ""; 

                        break; 

                    case 2: 

                        Console.ForegroundColor = ConsoleColor.Green; 

                        result = ""; 

                        break; 

                    case 3: 

                        Console.ForegroundColor = ConsoleColor.Blue; 

                        result = ""; 

                        break; 

                    case 4: 

                        Console.ForegroundColor = ConsoleColor.Magenta; 

                        result = ""; 

                        break; 

                } 

            } 

            return result; 

        } 

 

 

 

        static void DrawMap() 

        { 

 

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

            Console.WriteLine(); 

             

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

 

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

            { 

                Console.Write(GetMapString(i)); 

            } 

       

            //第一行结束 

            Console.WriteLine(); 

 

 

 

            //绘制第一列 

 

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

            { 

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

                { 

                    Console.Write(" "); 

                } 

 

                Console.WriteLine(GetMapString(i)); 

                //Console.WriteLine(str); 

            } 

 

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

            { 

                Console.Write(GetMapString(i)); 

            } 

            Console.WriteLine(); 

 

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

            { 

                Console.WriteLine(GetMapString(i)); 

            } 

 

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

            { 

                Console.Write(GetMapString(i)); 

            } 

            Console.WriteLine(); 

            Console.ResetColor();  //恢复颜色设置,防止99坐标的颜色影响“开始游戏。。。。” 

 

 

 

        } 

 

        static int ReadInt() 

        { 

            int i = ReadInt(int.MinValueint.MaxValue); 

            return i; 

        } 

 

        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("只能输入数字,请重新输入!"); 

                } 

            } 

        } 

 

 

        /// <summary> 

        /// AB掷骰子的方法 

        /// </summary> 

        /// <param name="playerNumber"></param> 

        static void Action(int playerNumber) 

        { 

            //playerNumber 中存的就是当前 玩家 姓名 坐标 是否暂停这三个数组的下标 

             

            //1-playerNumber 就是对方的 姓名 坐标 是否暂停 的下标 

            //假如:    当前 0,对方 1  1 - 0 = 1 

            //          当前 1,对方 0  1 - 1 = 0 

 

 

            int step = 0;  //用于存放产生的随机数。 

            string input = ""//用户存储用户的输入 

            string msg = "";  //用于存储用户踩到某关卡,输出的话 

            Random r = new Random();  //r是产生随机数用的。 

 

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

 

            ConsoleKeyInfo rec = Console.ReadKey(true);  //后门测试 

            //if (rec.Key == ConsoleKey.Tab)   //测试 Tab 

            //{ 

            //    step = 20; 

            //} 

            //else 

            //{ 

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

            //} 

 

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

            if (rec.Key == ConsoleKey.Tab)   //测试键  Tab  F1 

            { 

                ConsoleKeyInfo cc = Console.ReadKey(); 

                if (cc.Key == ConsoleKey.F1) 

                { 

                    step = ReadInt(1, 100); 

                } 

            } 

 

 

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

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

            Console.ReadKey(true); 

 

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

            CheckPos();     //检测坐标是否越界 

 

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

            { 

                playerPos[1 - playerNumber] = 0; 

                msg = string.Format("{0}踩到了{1}{1}退回原点", names[playerNumber], names[1 - playerNumber]);   //这里不能用Console.writeLine输出,下边的清屏后就不会显示 

            } 

            else 

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

                switch (Map[playerPos[playerNumber]]) 

                { 

                    case 0:  //普通,没有效果 

                        break; 

                    case 1:  //幸运轮盘关卡 

                        Console.Clear(); 

                        DrawMap(); 

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

                        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}选择了与对方交换位置!", names[playerNumber]); 

                        } 

                        else 

                        { //轰炸对方 

                            playerPos[1 - playerNumber] = playerPos[1 - playerNumber] - 6; 

                            CheckPos();  //检测越界 

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

                        } 

 

                        break; 

                    case 2:  //踩到了地雷 

                        playerPos[playerNumber] = playerPos[playerNumber] - 6; 

                        CheckPos(); 

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

                        break; 

                    case 3:  //暂停一次 

                        isStop[playerNumber] = true; 

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

                        break; 

                    case 4:  //时空隧道 

                        playerPos[playerNumber] = playerPos[playerNumber] + 10; 

                        msg = string.Format("{0}进入了时空隧道,爽死了!", names[playerNumber]); 

                        break; 

                } 

 

            } 

 

            Console.Clear(); 

            DrawMap(); 

            if (msg != "") 

            { 

                Console.WriteLine(msg); 

            } 

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

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

            Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1); 

            Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1); 

 

        } 

 

 

    } 

} 

 

  ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值