看视频学编程之骑士飞行棋—自己做(单机版)

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

这里就不多做说明了,很简单的一个小游戏—飞行棋,控制台输出的有点丑,不过逻辑才是最重要的

有兴趣的自己往下看,写程序喜欢写注释,下面代码中注释很多而且也很简单,很容易看懂!

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

namespace 骑士飞行棋
{
    class Program
    {
        //在下面的数组存储游戏地图各个关卡
        //数组的下表为0的元素对应的地图上的第一格  下表为2的对应第二格 下标n的对应n+1格
        //在数组中:  1:表示幸运轮盘◎
        //            2:地雷☆
        //            3:暂停▲
        //            4:时空隧道#
        //            0:普通□
        static int[] Map = new int[100]; //数组声明好默认初始化0,0表示普通最省事
        // 静态方法,字段前加static才能访问
        static int[] palyerpos = { 0, 0, }; //playerpos[0]存玩家A的下标,playerpos[1]存玩家B的位置;
        static string[] names = new string[2];//names[0]存玩家A的名字, names[1]存玩家B的名字
        static bool[] isShop = { false, false };//isShop[0]表示玩家A是否走到暂停,isShop[1]表示玩家B是否走到暂停;
                                        //走到暂停就设置为true

        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来表示,{1}用B来表示!",names[0],names[1]);
            Console.WriteLine("如果AB在同以位置就用<>表示");

            InitialMap();  //初始化地图
             
            DramMap();    // 绘制地图

            Console.WriteLine("开始游戏.....");
            
            //这个循环让玩家AB轮流掷骰子 当玩家A或者B的坐标大于等于99,循环结束

            while (palyerpos[0] < 99 && palyerpos[1] < 99)
            {
                if (isShop[0] == false)
                {
                    Action(0);                        // 把掷骰子写成方法
                    #region   玩家A掷骰子
                    //Console.WriteLine("{0}按任意键掷骰子", names[0]);
                    //ConsoleKeyInfo rec = Console.ReadKey(true);  // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean);
                    //if (rec.Key == ConsoleKey.Tab)  // 玩赖!
                    //{
                    //    step = 20;      //设置后门,用console.Readkey()返回结构类型的返回值rec
                    //}                  //rec的Key属性是一个枚举 存着用户输入的键
                    //else              //rec.Modifiers 属性存储按键组合
                    //{                 //rec.Key == ConsoleKey.Tab&&
                    //    step = r.Next(1, 7); //产生一个1—6之间的随机数
                    //}
                    //Console.WriteLine("{0}掷出了:{1}", names[0], step);
                    //Console.WriteLine("按任意键开始行动......");
                    //Console.ReadKey(true);
                    //palyerpos[0] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0
                    //Checkpos();  //检测坐标是否越界
                    //if (palyerpos[0] == palyerpos[1])//玩家A踩到B
                    //{
                    //    palyerpos[1] = 0;
                    //    msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[0],step, names[1]);
                    //}
                    //else  //没踩到,判断玩家A是否踩到关卡
                    //{
                    //    switch (Map[palyerpos[0]])
                    //    {
                    //        case 0:
                    //            //没有效果;
                    //            msg = "";
                    //            break;
                    //        case 1:
                    //            //走到 幸运轮盘
                    //            Console.Clear();
                    //            DramMap();
                    //            Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[0],step);
                    //            Console.WriteLine("1---交换位置    2---轰炸对方");
                    //            int userSelect = ReadInt(1, 2);
                    //            if (userSelect == 1)
                    //            {
                    //                int temp = palyerpos[0];
                    //                palyerpos[0] = palyerpos[1];  //交换位置
                    //                palyerpos[1] = temp;
                    //                msg = string.Format("{0}掷出了{1},走到幸运罗盘,{0}选择了与对方交换位置", names[0],step);
                    //            }
                    //            else
                    //            {
                    //                palyerpos[1] -= 6;
                    //                Checkpos();
                    //                msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸{2},{2}退6格!", names[0],step, names[1]);
                    //            }
                    //            break;
                    //        case 2:
                    //            //踩到地雷
                    //            palyerpos[0] -= 6;
                    //            Checkpos();
                    //            msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[0],step);
                    //            break;
                    //        case 3:
                    //            //暂停一次
                    //            isShop[0] = true;
                    //            msg = string.Format("{0}掷出了{1},踩到静止陷阱,暂停一次", names[0],step);
                    //            break;
                    //        case 4:
                    //            //时空隧道
                    //            palyerpos[0] += 10;
                    //            Checkpos();
                    //            msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[0],step);
                    //            break;
                    //    }

                    //}
                    //Console.Clear();
                    //DramMap();
                    //if (msg != "")
                    //{
                    //    Console.WriteLine("{0}.....行动完成", msg);
                    //}
                    //else
                    //{
                    //    Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[0], step);
                    //}

                    //Console.WriteLine("*******************玩家A和玩家B位置如下*****************");
                    //Console.WriteLine("{0}的位置为{1}", names[0], palyerpos[0] + 1);
                    //Console.WriteLine("{0}的位置为{1}", names[1], palyerpos[1] + 1);

                    #endregion
                }
                else
                {
                    isShop[0] = false;
                }

                if (palyerpos[0] >= 99)
                {
                    break;
                }

                if (isShop[1] == false)
                {
                    Action(1);                     
                    #region     玩家B掷骰子
                    //Console.WriteLine("{0}按任意键掷骰子", names[1]);
                    //ConsoleKeyInfo rec=Console.ReadKey(true);  // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean);
                    //if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift))
                    //{
                    //    ConsoleKeyInfo rrc = Console.ReadKey(true);
                    //    if (rrc.Key == ConsoleKey.F1)
                    //    {
                    //        step = r.Next(10, 100);
                    //    }
                    //    else
                    //    {
                    //        step = r.Next(1, 7);
                    //    }
                    //}                 //不要两个else 把step=r.Next(1,7);写到if前面
                    //else
                    //{
                    //    step = r.Next(1, 7);
                    //}
                    //Console.WriteLine("{0}掷出了:{1}", names[1], step);
                    //Console.WriteLine("按任意键开始行动......");
                    //Console.ReadKey(true);
                    //palyerpos[1] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0
                    //Checkpos();  //检测坐标是否越界
                    //if (palyerpos[1] == palyerpos[0])//玩家A踩到B
                    //{
                    //    palyerpos[0] = 0;
                    //    msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[1],step, names[0]);
                    //}
                    //else  //没踩到,判断玩家A是否踩到关卡
                    //{
                    //    switch (Map[palyerpos[1]])
                    //    {
                    //        case 0:
                    //            //没有效果;
                    //            msg = "";
                    //            break;
                    //        case 1:
                    //            //走到 幸运轮盘
                    //            Console.Clear();
                    //            DramMap();
                    //            Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[1],step);
                    //            Console.WriteLine("1---交换位置    2---轰炸对方");
                    //            int userSelect = ReadInt(1, 2);
                    //            if (userSelect == 1)
                    //            {
                    //                int temp = palyerpos[0];
                    //                palyerpos[0] = palyerpos[1];  //交换位置
                    //                palyerpos[1] = temp;
                    //                msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择了与对方交换位置", names[1],step);
                    //            }
                    //            else
                    //            {
                    //                palyerpos[0] -= 6;
                    //                Checkpos();
                    //                msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸了{2},{2}退6格!", names[1],step, names[0]);
                    //            }
                    //            break;
                    //        case 2:
                    //            //踩到地雷
                    //            palyerpos[1] -= 6;
                    //            Checkpos();
                    //            msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[1],step);
                    //            break;
                    //        case 3:
                    //            //暂停一次
                    //            isShop[1] = true;
                    //            msg = string.Format("{0}掷出了{1},踩到了静止陷阱,暂停一次", names[1],step);
                    //            break;
                    //        case 4:
                    //            //时空隧道
                    //            palyerpos[1] += 10;
                    //            Checkpos();
                    //            msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[1],step);
                    //            break;
                    //    }

                    //}
                    //Console.Clear();
                    //DramMap();
                    //if (msg != "")
                    //{
                    //    Console.WriteLine("{0}.....行动完成!", msg);
                    //}
                    //else
                    //{
                    //    Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[1], step);
                    //}
                    //Console.WriteLine("*******************玩家A和玩家B位置如下*****************");
                    //Console.WriteLine("{0}的位置为{1}", names[0], palyerpos[0] + 1);
                    //Console.WriteLine("{0}的位置为{1}", names[1], palyerpos[1] + 1);

                    #endregion      // 写成    //把掷骰子写成方法
                }
                else
                {
                    isShop[1] = false;
                }

                if (palyerpos[1] >= 99)
                {
                    break;
                }
                
            }
            //判断谁胜利,谁失败
            Console.Clear();
            ShowUI();
            if (palyerpos[0] >= 99)
            {
                Console.WriteLine("{0}胜利了!!!!!!!!!!!!", names[0]);
            }
            else
            {
                Console.WriteLine("{0}胜利了!!!!!!!!!!!!", names[1]);
            }


            Console.ReadKey();


        }

        /// <summary>
        /// 进行玩家AB的坐标越界判断
        /// </summary>
        static void Checkpos()
        {
            for (int i = 0; i < 2; i++)
            {
                if (palyerpos[i] > 99)
                {
                    palyerpos[i] = 99;
                }
                if (palyerpos[i] < 0)
                {
                    palyerpos[i] = 0;
                }
            }
        }

        /// <summary>
        /// 用于绘制飞行棋的名称;
        /// </summary>
        static void ShowUI()
        {
            Console.WriteLine("********************************************************");
            Console.WriteLine("*                                                      *");
            Console.WriteLine("*                      骑士飞行棋                      *");
            Console.WriteLine("*                                                      *");
            Console.WriteLine("********************************************************");
        }

        /// <summary>
        /// 对图中的关卡进行初始化!
        /// </summary>
        static void InitialMap() //初始化地图关卡
        {
            //用于存储地图中各个关卡的在数组中的下标
            int[] luckyTurn = { 6, 13, 25, 29, 55, 63, 72, 85, 91 };//幸运轮盘
            int[] landMilne = { 5, 16, 28, 48, 39, 58, 76, 60, 90, 81, 88 };//地雷
            int[] pause = { 8, 19, 22, 40, 66, 80 };        //暂停坐标
            int[] timeTunnel = { 20, 27, 30, 50, 70, 87 };//时空隧道

            for (int i = 0; i < luckyTurn.Length; i++)
            {
                int  pos= luckyTurn[i];
                Map[pos] = 1;
            }
            for (int i = 0; i < landMilne.Length; i++)
            {
                int pos = landMilne[i];
                Map[pos] = 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>
        static string GetMapString(int pos)
        {
            string result = "";
            //判断A和B是否在当前要画的第i格上
            if (palyerpos[0] == pos && palyerpos[1] == pos)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                result = "<>";
            }
            else if (palyerpos[0] == pos)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                result = ""; //画全角A,才能占满位置
            }
            else if (palyerpos[1] == pos)
            {
                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.Blue;
                        result = "";
                        break;
                    case 3:
                        Console.ForegroundColor=ConsoleColor.Green;
                        result = "";
                        break;
                    case 4:
                        Console.ForegroundColor=ConsoleColor.Magenta;
                        result = "";
                        break;
                }
            }
            return result;
        }

        /// <summary>
        /// 绘制地图,三行三十格,两列5格的地图
        /// </summary>
        static void DramMap()
        {
            Console.WriteLine("图例:幸运轮盘:◎    地雷:☆     暂停:▲       时空隧道:#");
            //画第一行; 第一行三十格
            for (int i = 0; i <= 29; i++)
            {
                Console.Write(GetMapString(i));
            }
            //第一行绘制完毕  换行!!
            Console.WriteLine();

            //绘制第一列
            for (int i = 30; i < 34; i++)
            {
                //绘制29个双空格,全角符号占两个空格
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                Console.WriteLine(GetMapString(i));
            }
            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.ForegroundColor = ConsoleColor.White;

            //或者使用Console类里的resetcolor方法
            //Console.ResetColor();
        }

        /// <summary>
        /// 判断走到幸运轮盘必须输入1-2之间的数字
        /// </summary>
        /// <returns></returns>
        static int ReadInt()
        {
            int i = ReadInt(int.MinValue, int.MaxValue);//调用ReadInt(int int)方法 返回任意int值
            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>
        /// A或B掷骰子的方法
       /// </summary>
       /// <param name="playernumber">A掷骰子传0,B掷骰子传1</param>
        static void Action(int playernumber)
        {
            //playernumber中存当前玩家 姓名 地图坐标 是否暂停 三个数组的下标
            //当前玩家0  对方1   当前 1  对方0
            //1-playernumber就是对方的姓名 地图坐标 是否暂停  的下标
            Random r = new Random();//用于产生随机数
            int step = 0;         //用于存储产生的随机数
            string msg = "";  //用于存储用户踩到某关卡输出的话

            Console.WriteLine("{0}按任意键掷骰子", names[playernumber]);
            ConsoleKeyInfo rec = Console.ReadKey(true);  // 用Console.ReadKey();将显示按下的键,所以用重载Console.ReadKey(boolean);
     // boolean选为true为不显示
step = r.Next(1, 7); //产生一个1—6之间的随机数,包含下限 不包含上限!! if (rec.Key == ConsoleKey.Tab) // 玩赖! { step = 20; //设置后门,用console.Readkey()返回结构类型的返回值rec } //rec的Key属性是一个枚举 存着用户输入的键 rec.Modifiers 属性存储按键组合 if (rec.Key == ConsoleKey.Tab && rec.Modifiers == (ConsoleModifiers.Control | ConsoleModifiers.Shift)) { ConsoleKeyInfo rrc=Console.ReadKey(true); if (rrc.Key == ConsoleKey.F1) { step = ReadInt(1, 100); } } Console.WriteLine("{0}掷出了:{1}", names[playernumber], step); Console.WriteLine("按任意键开始行动......"); Console.ReadKey(true); palyerpos[playernumber] += step; //一旦坐标发生改变就要判断坐标是否大于99,或者小于0 Checkpos(); //检测坐标是否越界 if (palyerpos[playernumber] == palyerpos[1 - playernumber])//玩家A踩到B { palyerpos[1 - playernumber] = 0; msg = string.Format("{0}掷出了{1},踩到了{2},{2}退回远点", names[playernumber], step, names[1 - playernumber]); } else //没踩到,判断玩家A是否踩到关卡 { switch (Map[palyerpos[playernumber]]) { case 0: //没有效果; msg = ""; break; case 1: //走到 幸运轮盘 Console.Clear(); DramMap(); Console.WriteLine("{0}掷出了{1},走到了幸运罗盘,请选择", names[playernumber], step); Console.WriteLine("1---交换位置 2---轰炸对方"); int userSelect = ReadInt(1, 2); if (userSelect == 1) { int temp = palyerpos[playernumber]; palyerpos[playernumber] = palyerpos[1 - playernumber]; //交换位置 palyerpos[1 - playernumber] = temp; msg = string.Format("{0}掷出了{1},走到幸运罗盘,{0}选择了与对方交换位置", names[playernumber], step); } else { palyerpos[1 - playernumber] -= 6; Checkpos(); msg = string.Format("{0}掷出了{1},走到了幸运罗盘,{0}选择轰炸{2},{2}退6格!", names[playernumber], step, names[1 - playernumber]); } break; case 2: //踩到地雷 palyerpos[playernumber] -= 6; Checkpos(); msg = string.Format("{0}掷出了{1},踩到了地雷,退6格!", names[playernumber], step); break; case 3: //暂停一次 isShop[playernumber] = true; msg = string.Format("{0}掷出了{1},踩到静止陷阱,暂停一次", names[playernumber], step); break; case 4: //时空隧道 palyerpos[playernumber] += 10; Checkpos(); msg = string.Format("{0}掷出了{1},进入时空隧道,爽死了,前进10格!", names[playernumber], step); break; } } Console.Clear(); DramMap(); if (msg != "") { Console.WriteLine("{0}.....行动完成", msg); } else { Console.WriteLine("{0}掷出了{1},前进{1}格,行动完成!", names[playernumber], step); } Console.WriteLine("*******************玩家A和玩家B位置如下*****************"); Console.WriteLine("{0}的位置为{1}", names[playernumber], palyerpos[playernumber] + 1); Console.WriteLine("{0}的位置为{1}", names[1 - playernumber], palyerpos[1 - playernumber] + 1); } } }
原文地址:https://www.cnblogs.com/cctt/p/3142174.html