C#基础篇六飞行棋

飞行棋业务:
我们要能够让2个玩家 在地图上 按照游戏规则 进行游戏

玩家类
变量:玩家位置,玩家名称,玩家标识,玩家是否在陷阱中
方法:投骰子,移动

地图类
变量:地图数据数组
方法:初始化地图数据,绘制地图,显示Logo

游戏规则类
变量:
方法:第一次游戏说明,判断玩家位置是否有障碍物,根据不同障碍物执行不同操作,判断游戏是否结束

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

namespace P03FlyQi
{
    class Program
    {
        #region ----------------1.全局变量 mapData/playerMark/palyerNames/playerPosition/playerIsInTrap-------------------
        //1.全局变量-----------------------------
        //--------1.1 地图数据-----------------
        /// <summary>
        /// 地图数据 数组
        /// </summary>
        static string[] mapData = new string[100];

        //--------1.2 玩家数据-----------------
        /// <summary>
        /// 玩家标识 A / B
        /// </summary>
        static string[] playerMark = new string[2];

        /// <summary>
        /// 玩家名字
        /// </summary>
        static string[] playerNames = new string[2];

        /// <summary>
        /// 玩家位置
        /// </summary>
        static int[] playerPosition = new int[2];

        /// <summary>
        /// 玩家是否在陷阱中
        /// </summary>
        static bool[] playerIsInTrap = new bool[2]; 
        #endregion

        static void Main(string[] args)
        {
            StartGame();
            Console.ReadLine();
        }

        #region 0.0 游戏开始 void StartGame()
        /// <summary>
        /// 0.0 游戏开始
        /// </summary>
        static void StartGame()
        {
            //0.1 初始化数据
            InitData();
            //0.2 显示 Logo
            ShowLogo();
            //0.3 游戏进行
            Playing();
        } 
        #endregion

        #region 1.0 初始化数据方法 void InitData()
        /// <summary>
        /// 1.0 初始化数据方法
        /// </summary>
        static void InitData()
        {
            //1.初始化 地图数据
            InitMapData();
            //2.初始化 玩家数据
            InitPlayerData();
        } 
        #endregion

        #region 1.1 初始化 地图数据 void InitMapData()
        /// <summary>
        /// 1.1 初始化 地图数据
        /// </summary>
        static void InitMapData()
        {
            //a.为地图里所有单元 都默认 赋值为 "普通"
            for (int i = 0; i < mapData.Length; i++)
            {
                mapData[i] = "普通";
            }
            //b.设置 障碍物
            mapData[5] = "地雷";
            mapData[25] = "地雷";
            mapData[45] = "地雷";
            mapData[85] = "地雷";

            mapData[15] = "陷阱";
            mapData[33] = "陷阱";
            mapData[65] = "陷阱";
            mapData[95] = "陷阱";

            mapData[12] = "时空隧道";
            mapData[28] = "时空隧道";
            mapData[54] = "时空隧道";
            mapData[79] = "时空隧道";

            mapData[7] = "幸运轮盘";
            mapData[37] = "幸运轮盘";
            mapData[47] = "幸运轮盘";
            mapData[69] = "幸运轮盘";
        }
        #endregion

        #region 1.2 初始化 玩家数据 void InitPlayerData()
        /// <summary>
        /// 1.2 初始化 玩家数据
        /// </summary>
        static void InitPlayerData()
        {
            playerMark[0] = "A";
            playerMark[1] = "B";

            playerNames[0] = ReadString("请输入玩家A的姓名:");
            Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[0]);
            do
            {
                playerNames[1] = ReadString("请输入玩家B的姓名:");
                if (playerNames[1] == playerNames[0])
                {
                    Console.WriteLine("两个名字不能一样~~~");
                }
                else
                {
                    Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[1]);
                    break;
                }
            } while (true);
        }
        #endregion

        #region 2.0 显示游戏Logo void ShowLogo()
        /// <summary>
        /// 2.0 显示游戏Logo
        /// </summary>
        static void ShowLogo()
        {
            Console.WriteLine("********************************************");
            Console.WriteLine("*                                          *");
            Console.WriteLine("*  牛   B   的   骑   士   飞   行   棋    *");
            Console.WriteLine("*                                          *");
            Console.WriteLine("********************************************");
        } 
        #endregion

        #region 3.0 游戏进行中 void Playing()
        /// <summary>
        /// 3.0 游戏进行中
        /// </summary>
        static void Playing()
        {
            //3.1清屏
            Console.Clear();
            //3.2显示Logo
            ShowLogo();
            //3.3显示第一次运行游戏的 说明消息
            ShowFirstRoundMsg();
            //3.4游戏轮流进行
            PlayRounds();
        } 
        #endregion

        #region 3.1 显示第一次运行游戏的 说明消息 void ShowFirstRoundMsg()
        /// <summary>
        /// 3.1 显示第一次运行游戏的 说明消息
        /// </summary>
        static void ShowFirstRoundMsg()
        {
            Console.WriteLine("{0} 和 {1} 两个好基友将在此次游戏中一决雌雄~~!", playerNames[0], playerNames[1]);
            Console.WriteLine("玩家【{0}】用【A】表示~~", playerNames[0]);
            Console.WriteLine("玩家【{0}】用【B】表示~~", playerNames[1]);
            Console.WriteLine("如果两个玩家位置相同,则用 <> 表示~!");
            Console.WriteLine("游戏开始~~~");
        } 
        #endregion

        /// <summary>
        /// 游戏结束 标识
        /// </summary>
        static bool isGameOver = false;

        #region 3.2 游戏轮流进行 void PlayRound()
        /// <summary>
        /// 3.2 游戏轮流进行
        /// </summary>
        static void PlayRounds()
        {
            //3.2.1绘制地图
            ShowMap();
            while (!isGameOver)
            {
                //3.2.2玩家开始玩~~
                PlayAnRound();
            }
        } 
        #endregion

        #region 3.2.1 绘制地图 void ShowMap()
        /// <summary>
        /// 3.2.1 绘制地图
        /// </summary>
        static void ShowMap()
        {
            //1.绘制 第一部分:第1个横杠(从左到右)
            for (int i = 0; i < 30; i++)
            {
                string unitIcon = GetMapUnitIconByType(i);
                Console.Write(unitIcon);
            }
            Console.WriteLine();
            //2.绘制 第二部分:第1个竖线(右竖线)
            for (int i = 30; i < 35; i++)
            {
                string unitIcon = GetMapUnitIconByType(i);
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                Console.WriteLine(unitIcon);
            }

            //3.绘制 第三部分:第2个横杠(从右到左)
            for (int i = 64; i>=35; i--)
            {
                string unitIcon = GetMapUnitIconByType(i);
                Console.Write(unitIcon);
            }
            Console.WriteLine();

            //4.绘制 第四部分:第2个竖线(左竖线)
            for (int i = 65; i < 70; i++)
            {
                string unitIcon = GetMapUnitIconByType(i);
                Console.WriteLine(unitIcon);
            }
            //5.绘制 第五部分:第3个横杠(从左到右)
            for (int i = 70; i < 100; i++)
            {
                string unitIcon = GetMapUnitIconByType(i);
                Console.Write(unitIcon);
            }
            Console.WriteLine();
            //绘制地图后,恢复 原来的 字体颜色
            Console.ResetColor();
        }
        #endregion

        #region 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识 string GetMapUnitIconByType(int mapIndex)
        /// <summary>
        /// 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识
        /// 获取地图 下标对应的 地图单元类型(普通、地雷、陷阱...),返回对应的符号!
        /// </summary>
        /// <param name="mapIndex">地图单元下标</param>
        static string GetMapUnitIconByType(int mapIndex)
        {
            string strUnitIcon = "";

            //1.判断 地图位置 是否有玩家
            if (mapIndex == playerPosition[0])//玩家A的位置
            {
                //如果两个玩家的位置相同,则需要 返回 <>
                if (playerPosition[0] == playerPosition[1])
                {
                    Console.ForegroundColor = ConsoleColor.Gray;
                    strUnitIcon = "<>";
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.White;
                    strUnitIcon = playerMark[0];
                }
            }
            else if (mapIndex == playerPosition[1])//玩家B的位置
            {
                Console.ForegroundColor = ConsoleColor.White;
                strUnitIcon = playerMark[1];
            }
            else//地图 符号
            {
                switch (mapData[mapIndex])
                {
                    case "普通":
                        Console.ForegroundColor = ConsoleColor.White;
                        strUnitIcon = "□";
                        break;
                    case "地雷":
                        Console.ForegroundColor = ConsoleColor.Red;
                        strUnitIcon = "◎";
                        break;
                    case "幸运轮盘":
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        strUnitIcon = "卐";
                        break;
                    case "时空隧道":
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        strUnitIcon = "○";
                        break;
                    case "陷阱":
                        Console.ForegroundColor = ConsoleColor.Green;
                        strUnitIcon = "井";
                        break;
                }
            }

            return strUnitIcon;
        } 
        #endregion

        #region 3.2.2 两个玩家各投一次骰子 void PlayAnRound()
        /// <summary>
        /// 3.2.2 两个玩家各投一次骰子
        /// </summary>
        static void PlayAnRound()
        {
            int playNum = 0;
            //1.玩家A投骰子--------------------------
            //0.判断玩家A是否在陷阱中
            if (playerIsInTrap[0] == true)//如果在陷阱中,则停止一轮
            {
                Console.WriteLine("玩家【A】正艰难的向陷阱外攀爬~~~~按回车继续");
                playerIsInTrap[0] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮)
                Console.ReadLine();
            }
            else//否则,进行 投骰子
            {
                playNum = GetAnRandomNum();
                //1.1修改玩家A的位置
                playerPosition[0] += playNum;
                Console.WriteLine("玩家【A】投了一个数字:{0},按回车继续...", playNum);
                Console.ReadLine();
                //1.2重新绘制地图
                Console.Clear();
                ShowLogo();
                ShowMap();
                //1.3判断玩家A新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理
                JudgePosition(true);
            }

            //2.玩家B投骰子-----------------------------
            //0.判断玩家A是否在陷阱中
            if (playerIsInTrap[1] == true)//如果在陷阱中,则停止一轮
            {
                Console.WriteLine("玩家【B】正艰难的向陷阱外攀爬~~~~按回车继续");
                playerIsInTrap[1] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮)
                Console.ReadLine();
            }
            else
            {
                playNum = GetAnRandomNum();
                //2.1修改玩家B的位置
                playerPosition[1] += playNum;
                Console.WriteLine("玩家【B】投了一个数字:{0},按回车继续...", playNum);
                Console.ReadLine();
                //2.2重新绘制地图
                Console.Clear();
                ShowLogo();
                ShowMap();
                //2.3判断玩家B新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理
                JudgePosition(false);
            }
        } 
        #endregion

        #region 3.2.2.1 获取一个 骰子 数(1-6)
        /// <summary>
        /// 3.2.2.1 获取一个 骰子 数(1-6)
        /// </summary>
        static int GetAnRandomNum()
        {
            Random ran = new Random();
            return ran.Next(1, 7);
        } 
        #endregion

        #region  3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 void JudgePosition(bool isPlayerA)
        /// <summary>
        /// 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作
        /// </summary>
        /// <param name="index"></param>
        static void JudgePosition(bool isPlayerA)
        {
            //0.判断两个玩家的新位置 是否 已经超过地图,如果超过,则结束游戏
            if (playerPosition[0] >= 99)
            {
                Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[0]);
                isGameOver = true;
            }
            else if (playerPosition[1] >= 99)
            {
                Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[1]);
                isGameOver = true;
            }
            else
            {
                //1.玩家的位置
                int playerIndex = isPlayerA ? playerPosition[0] : playerPosition[1];
                //2.根据玩家所在地图 的障碍物 执行不同的操作
                switch (mapData[playerIndex])
                {
                    case "地雷":
                        {
                            MeetBomb(isPlayerA);
                            break;
                        }
                    case "幸运轮盘":
                        {
                            MeetLuckyCircle(isPlayerA);
                            break;
                        }
                    case "时空隧道":
                        {
                            MeetTimeTunnuel(isPlayerA);
                            break;
                        }
                    case "陷阱":
                        {
                            MeetTrap(isPlayerA);
                            break;
                        }
                }
            }
        }
        #endregion


        #region 3.2.2.2.1 遇到地雷 void MeetBomb(bool isPlayerA)
        /// <summary>
        /// 3.2.2.2.1 遇到地雷
        /// </summary>
        /// <param name="isPlayerA">是否为玩家A,或者玩家B</param>
        static void MeetBomb(bool isPlayerA)
        {
            //1.如果是地雷,则提示 要后退 6 格
            Console.WriteLine("真倒霉~~【{0}】踩到了 地雷了~~!后退6格~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
            //2.玩家退后 6 格
            if (isPlayerA)
            {
                playerPosition[0] -= 6;
            }
            else
            {
                playerPosition[1] -= 6;
            }
            CheckPosition();
            Console.ReadLine();
            Console.Clear();
            ShowLogo();
            ShowMap();
        } 
        #endregion

        #region 3.2.2.2.2 遇到时空隧道 void MeetTimeTunnuel(bool isPlayerA)
        /// <summary>
        /// 3.2.2.2.2 遇到时空隧道
        /// </summary>
        /// <param name="isPlayerA">是否为玩家A,或者玩家B</param>
        static void MeetTimeTunnuel(bool isPlayerA)
        {
            //1.如果是地雷,则提示 要后退 6 格
            Console.WriteLine("真幸运~~【{0}】进入时空隧道了~~ !前进6格子~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
            //2.玩家退后 6 格
            if (isPlayerA)
            {
                playerPosition[0] += 6;
            }
            else
            {
                playerPosition[1] += 6;
            }
            CheckPosition();
            Console.ReadLine();
            Console.Clear();
            ShowLogo();
            ShowMap();
        }
        #endregion

        #region 3.3.2.2.3 遇到陷阱 void MeetTrap(bool isPlayerA)
        /// <summary>
        /// 3.3.2.2.3 遇到陷阱
        /// </summary>
        /// <param name="isPlayerA"></param>
        static void MeetTrap(bool isPlayerA)
        {
            //1.如果是地雷,则提示 要后退 6 格
            Console.WriteLine("啊~~【{0}】掉进陷阱了~~ !暂停一局!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
            //2.玩家进入陷阱
            if (isPlayerA)
            {
                playerIsInTrap[0] = true;
            }
            else
            {
                playerIsInTrap[1] = true;
            }
            Console.ReadLine();
        } 
        #endregion

        #region 3.3.2.4 遇到幸运轮盘 void MeetLuckyCircle()
        /// <summary>
        /// 3.3.2.4 遇到幸运轮盘
        /// </summary>
        static void MeetLuckyCircle(bool isPlayerA)
        {
            //1.如果是地雷,则提示 要后退 6 格
            string strPalyerMark = isPlayerA ? playerMark[0] : playerMark[1];
            int num = ReadANum("啊~~【" + strPalyerMark + "】被幸运之神遭砸了~~,请选择一个愿望:1.轰炸对方,对方后退6格;2.乾坤大挪移,和对方交换位置:");
            switch (num)
            {
                case 1://轰炸对方,对方后退6格
                    {
                        //如果是玩家A,那么 玩家B的位置后退6格
                        if (isPlayerA)
                        {
                            playerPosition[1] -= 6;
                            Console.WriteLine("您选择轰炸对方,玩家【B】将后退6格~!");
                        }
                        else//如果是玩家B,那么 玩家A的位置后退6格
                        {
                            playerPosition[0] -= 6;
                            Console.WriteLine("您选择轰炸对方,玩家【A】将后退6格~!");
                        }
                        break;
                    }
                case 2://乾坤大挪移,和对方交换位置
                    {
                        //playerPosition[0] = playerPosition[0] + playerPosition[1];
                        //playerPosition[1] = playerPosition[0] - playerPosition[1];
                        //playerPosition[0] = playerPosition[0] - playerPosition[1];

                        int temp = playerPosition[0];
                        playerPosition[0] = playerPosition[1];
                        playerPosition[1] = temp;

                        Console.WriteLine("您选择了乾坤大挪移,和对方交换位置~!");
                        break;
                    }
            }
            CheckPosition();
            Console.ReadLine();
            Console.Clear();
            ShowLogo();
            ShowMap();
        } 
        #endregion

        #region 4.检查玩家位置,一旦出现越界,则设置临界值 void CheckPosition()
        /// <summary>
        /// 4.检查玩家位置,一旦出现越界,则设置临界值
        /// </summary>
        static void CheckPosition()
        {
            if (playerPosition[0] < 0) playerPosition[0] = 0;
            if (playerPosition[1] < 0) playerPosition[1] = 0;


            if (playerPosition[0] > 99) playerPosition[0] = 99;
            if (playerPosition[1] > 99) playerPosition[1] = 99;
        } 
        #endregion

        //-----------------------工具方法-------------------------------
        //-------------------------------------------------------------

        #region 0.0 读取一个非空字符串 string ReadString(string strMsg)
        /// <summary>
        /// 0.0 读取一个非空字符串
        /// </summary>
        /// <returns></returns>
        static string ReadString(string strMsg)
        {
            string strMsgBack="";

            while (true)
            {
                Console.Write(strMsg);
                strMsgBack = Console.ReadLine().Trim();
                if (string.IsNullOrEmpty(strMsgBack))
                {
                    Console.WriteLine("您输入的字符串不能为空~~");
                }
                else
                {
                    break;
                }
            }
            return strMsgBack;//返回 接收到的 非空字符串
            //Trim方法用来去掉 字符串两边的 空格 ,如:" aaa aaa       "  => "aaa aaa"
            //string.IsNullOrEmpty 判断字符串是否为空,如果为空,则返回 true;否则返回 false
        } 
        #endregion

        #region 0.0 读取一个数值 int ReadANum(string strMsg)
        /// <summary>
        /// 0.0 读取一个数值
        /// </summary>
        /// <returns></returns>
        static int ReadANum(string strMsg)
        {
            int num = -1;
            while (true)
            {
                string strMsgBack = ReadString(strMsg);
                if (int.TryParse(strMsgBack, out num) && (num > 0 && num<3))
                {
                    break;
                }
                else {
                    Console.WriteLine("请输入 1-2 之间的一个数值!");
                }
            }
            return num;
        }
        #endregion
    }
}

  

posted @ 2015-01-17 17:48  枫伶忆  阅读(1005)  评论(0编辑  收藏  举报