绘制100格游戏地图(根据“传智播客”.NET视频:飞行棋项目 制作)
这个是多个玩家的版本,增加了图标颜色,增加图例说明。
- using System;
- namespace GameMap
- {
- internal class Program
- {
- //数组的下标为0的元素对应地图上的第1格,下标为1的元素对应第2格…下标为n的元素对应第n+1格
- //定义一个数组存放地图的格数
- private static int[] Map = new int[100];
- //定义一个数组存放玩家的坐标,playerPos[0] 存玩家A的坐标,playerPos[1] 存玩家B的坐标
- private static int[] playerPos = { 1, 1, 0, 5, };
- //定义一个数组存放玩家的标识字符(不能小于玩家人数)
- private static string[] playerIco = { "A", "B", "C", "D" };
- private static void Main(string[] args)
- {
- //图例及玩家说明文字
- Console.WriteLine("图例说明:幸运×××—◎ 地雷—★ 暂停—▲ 时空隧道—※ 普通—□");
- Console.Write("玩家说明:多名玩家—<> ");
- for (int i = 0; i < playerPos.Length; i++)
- {
- Console.Write("第{0}位玩家:{1} ", i + 1, playerIco[i]);
- }
- //初始化地图数据
- InitialMap();
- //绘制地图
- DrawMap();
- Console.ReadKey();
- }
- /// <summary>
- /// 设置地图关卡的位置
- /// </summary>
- private static void InitialMap()
- {
- //在下面的数组存储我们游戏地图各个关卡
- //在数组中用以下数字表示相关图标
- //1:幸运×××—◎
- //2:地雷—★
- //3:暂停—▲
- //4:时空隧道—※
- //0:普通—□
- //定义相关关卡的位置
- 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[] timeTunel = { 20, 25, 45, 63, 72, 88, 90 }; //时空隧道4
- for (int i = 0; i < luckyTurn.Length; i++)
- {
- Map[luckyTurn[i]] = 1; //把地图Map的第luckyTurn[i]格设置为1(幸运×××)
- }
- for (int i = 0; i < landMine.Length; i++)
- {
- Map[landMine[i]] = 2; //把地图Map的第landMine[i]格设置为2(地雷)
- }
- for (int i = 0; i < pause.Length; i++) //把地图Map的第pause[i]格设置为3(暂停)
- {
- Map[pause[i]] = 3;
- }
- for (int i = 0; i < timeTunel.Length; i++) //把地图Map的第timeTunel[i]格设置为4(时空隧道)
- {
- Map[timeTunel[i]] = 4;
- }
- }
- /// <summary>
- /// 判断当前格应该绘制的图标
- /// </summary>
- /// <param name="pos">当前格位置</param>
- /// <returns>当前格图标</returns>
- private static string MapIco(int pos)
- {
- string ico = ""; //存放要绘制的图标字符
- //判断是否有两个以上的玩家处于当前格上
- int j = 0;
- for (int i = 0; i < playerPos.Length; i++)
- {
- if (playerPos[i] == pos) //判断玩家是否在当前格上
- {
- j++;
- if (j >= 2) //有两个以上玩家在同一个格上
- {
- Console.ForegroundColor = ConsoleColor.Yellow; //设置图标颜色
- ico = ("<>");
- return ico;
- }
- }
- }
- //判断当前格上是否有某一位玩家存在
- for (int i = 0; i < playerPos.Length; i++)
- {
- if (playerPos[i] == pos) //当前格有玩家playerPos[i]存在
- {
- Console.ForegroundColor = ConsoleColor.Yellow; //设置图标颜色
- ico = playerIco[i]; //获得该玩家的标识字符
- return ico;
- }
- }
- switch (Map[pos]) //根据当前格的值来显示相应的图标
- {
- case 1:
- Console.ForegroundColor = ConsoleColor.Magenta; //设置图标颜色
- ico = ("◎"); //1:幸运×××—◎
- break;
- case 2:
- Console.ForegroundColor = ConsoleColor.Red; //设置图标颜色
- ico = ("★"); //2:地雷—★
- break;
- case 3:
- Console.ForegroundColor = ConsoleColor.Cyan; //设置图标颜色
- ico = ("▲"); //3:暂停—▲
- break;
- case 4:
- Console.ForegroundColor = ConsoleColor.Green; //设置图标颜色
- ico = ("※"); //4:时空隧道—※
- break;
- default:
- Console.ForegroundColor = ConsoleColor.White; //设置图标颜色
- ico = ("□"); //0:普通—□
- break;
- }
- return ico;
- }
- /// <summary>
- /// 绘制地图
- /// </summary>
- private static void DrawMap()
- {
- Console.WriteLine(); //新起一行
- //画第一行
- for (int i = 0; i <= 29; i++)
- {
- Console.Write(MapIco(i)); //绘制当前格的图标
- }
- Console.WriteLine(); //第一行结束,换行
- //画第右边列(包含5行,每行前29格为空字符)
- for (int i = 30; i <= 34; i++) //循环绘制5行
- {
- for (int j = 0; j < 29; j++) //有图标的字符串需要绘制在第30格,因此需要每行前29格绘制两个空字符串
- {
- Console.Write(" ");
- }
- Console.WriteLine(MapIco(i)); ; //绘制当前格的图标,并换行
- }
- //画第二行
- for (int i = 64; i >= 35; i--)
- {
- Console.Write(MapIco(i)); //绘制当前格的图标
- }
- Console.WriteLine(); //第二行结束,换行
- //画第左边列
- for (int i = 65; i <= 69; i++)
- {
- Console.WriteLine(MapIco(i)); //绘制当前格的图标,并换行
- }
- //画第三行
- for (int i = 70; i <= 99; i++)
- {
- Console.Write(MapIco(i)); //绘制当前格的图标
- }
- Console.WriteLine();
- Console.ResetColor(); //重置控制台的前景色为默认
- }
- }
- }
效果图: