• 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}的名字设置成功啦~~~:)
    ", playerMark[0]);
                do
                {
                    playerNames[1] = ReadString("请输入玩家B的姓名:");
                    if (playerNames[1] == playerNames[0])
                    {
                        Console.WriteLine("两个名字不能一样~~~");
                    }
                    else
                    {
                        Console.WriteLine("玩家{0}的名字设置成功啦~~~:)
    ", 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
        }
    }
    

      

  • 相关阅读:
    IO
    mouseover,mouseout和mouseenter,mouseleave
    【译】addEventListener 第二个参数
    Git 常用命令
    我对Backbone中url属性的理解
    小失误引起大失败
    收集各大网站的登录页面
    随笔2
    随笔1
    创建数据库
  • 原文地址:https://www.cnblogs.com/fenglingyi/p/4230847.html
Copyright © 2020-2023  润新知