C# - 飞行棋小游戏3-依据关卡数据绘制地图 058

C# - 飞行棋小游戏3-依据关卡数据绘制地图 058

首页休闲益智乱斗飞行棋更新时间:2024-05-11

整个游戏地图最终效果图

1)需要一个记录两个玩家在地图数组中的坐标变量,此变量声明位置与地图数组一样

class Program { //地图数组声明为 类的成员变量 //表示游戏中所有关卡的格子 static int[] levelData = new int[100]; //表示两个玩家在地图中的坐标(对应levelData中的下标) //static int player1 = 0, player2=0; //使用数组表示两个玩家的坐标 static int[] pos = new int[] { 0,0 }; //pos[0]=0; 表示玩家A //pos[1]=0; 表示玩家B //程序入口方法 static void Main(string[] args) { } }

2)分解绘制地图中的各关卡在地图数组中的下标

绘制地图时的下标数据

游戏地图的关卡使用长度为30个格子,宽度为5个格子进行绘制;三个横排90个关卡,两个竖排10个关卡共同组成长度为100的游戏关卡,以此对应地图数组

3)绘制时玩家AB使用全角符号表示,不仅好看更利于下面关卡的绘制

全角符号A

半角符号A

4)在绘制各类型关卡及设置各关卡的颜色

绘制各个关卡

绘制什么类型的关卡就是依据地图数组初始化后的数据

5)绘制各类型关卡时,首先判断两个玩家的坐标,判断顺序1)两个玩家坐标是否相同2)判断两个玩家各自的坐标3)排除前两个条件之后再判断各种类型关卡

这样做的目的防止玩家与其他类型的关卡在一起时关卡图案覆盖玩家的图案

绘制地图

绘制暂停关卡图案

1 绘制第一横排的关卡(下标0-29)

class Program { //地图数组声明为 类的成员变量 //表示游戏中所有关卡的格子 static int[] levelData = new int[100]; //记录两个玩家在地图中的坐标(对应levelData中的下标) //static int player1 = 0, player2=0; //使用数组表示两个玩家的坐标 static int[] pos = new int[] { 0,0 }; //程序入口方法 static void Main(string[] args) { //显示游戏信息 ShowMapInfo(); //初始化地图关卡数据 InitData(); //调用绘制地图的方法 DrawMap(); Console.ReadKey(); } #region 3 依据关卡数据绘制地图 static void DrawMap() { //绘制第一横排30个关卡 for (int i = 0; i <= 29; i ) { #region 绘制关卡 //判断两个玩家坐标是否相同 if (i == pos[0] && pos[0] == pos[1]) { //设置输出字符时要显示的颜色 Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("><"); } //判断玩家A else if (i == pos[0]) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("A"); } //判断玩家B else if (i == pos[1]) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("B"); } //排除前面条件后判断各类型关卡 else { //int index = levelData[i]; //switch (index) //假设index=3,此关卡是地雷关卡 //因此当前坐标就会输出●,其他关卡以此类推 //判断各类型关卡 switch (levelData[i]) { //普通关卡 case 0: Console.ForegroundColor = ConsoleColor.White; Console.Write("□"); break; //地雷关卡 case 1: Console.ForegroundColor = ConsoleColor.Red; Console.Write("●"); break; //暂停关卡 case 2: Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("▲"); break; //飞盘关卡 case 3: Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Write("◎"); break; //防止意外数据(可以忽略不要) default: Console.ForegroundColor = ConsoleColor.White; Console.Write("□"); break; } } #endregion } } #endregion #region 2 手动初始化关卡数据 //初始化地图关卡数据 static void InitData() { //●表示地雷 设置元素值为 1 int[] mine = { 3, 23, 35, 47, 52, 66, 79, 82, 93 }; //▲表示暂停 设置元素值为 2 int[] suspend = { 7, 26, 55, 69, 88 }; //◎表示飞盘 设置元素值为 3 int[] frisbee = { 9, 33, 59, 85 }; for (int i = 0; i < mine.Length; i ) { //int a=mine[i]; //chequer[a]=1; //等同于下面 levelData[mine[i]] = 1; } for (int i = 0; i < suspend.Length; i ) { levelData[suspend[i]] = 2; } for (int i = 0; i < frisbee.Length; i ) { levelData[frisbee[i]] = 3; } } #endregion #region 1 显示游戏信息 //显示游戏信息 static void ShowMapInfo() { string title = "飞行棋小游戏 1.0"; Console.Title = title; Console.WriteLine("\t\t\t***************************"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("\t\t\t* " title " *"); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("\t\t\t***************************"); Console.WriteLine("\t\t\t\t飞行棋游戏规则"); Console.WriteLine("\t\t\t●地雷(-6) ▲暂停(0) ◎飞盘( 10)"); Console.WriteLine(""); } #endregion }

绘制第一横排关卡效果图

2 绘制第一竖排(下标 30-34)

static void DrawMap() { #region 绘制第一横排30个关卡 //绘制第一横排30个关卡 for (int i = 0; i <= 29; i ) { //绘制代码上面有不再拷贝 } #endregion #region 绘制第一竖排5个关卡 for (int i = 30; i < 35; i ) { #region 绘制关卡 //判断两个玩家坐标是否相同 if (i == pos[0] && pos[0] == pos[1]) { //设置输出字符时要显示的颜色 Console.ForegroundColor = ConsoleColor.Cyan; //以下都不能使用 Console.Write();方法 //绘制一个关卡需要换一行 Console.WriteLine("><"); } //判断玩家A else if (i == pos[0]) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("A"); } //判断玩家B else if (i == pos[1]) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("B"); } //排除前面条件后判断各类型关卡 else { //判断各类型关卡 switch (levelData[i]) { //普通关卡 case 0: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("□"); break; //地雷关卡 case 1: Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("●"); break; //暂停关卡 case 2: Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("▲"); break; //飞盘关卡 case 3: Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine("◎"); break; //防止意外数据(可以忽略不要) default: Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("□"); break; } } #endregion } #endregion }

绘制第一竖排关卡

与第一横排不同的是,竖排时绘制一个关卡后就要换一行

1)每一竖排关卡绘制时前面需要绘制29个全角的空格或58个半角的空格

2)绘制第一竖排之前需要换行,否则竖排只会显示4个关卡(下面行17号的代码)

3)有冗余代码,需要优化每个关卡需要显示什么图案的代码

//整个代码优化为 #region 3 依据关卡数据绘制地图 static void DrawMap() { #region 绘制第一横排30个关卡 //绘制第一横排30个关卡 for (int i = 0; i <= 29; i ) { //string str = GetPattern(i); //Console.Write(str); //调用方法即可 Console.Write(GetPattern(i)); } #endregion //换行绘制竖排 Console.WriteLine(""); #region 绘制第一竖排5个关卡 for (int i = 30; i < 35; i ) { //绘制竖排关卡前面的空格 ////一个半角空格 //for (int j = 0; j < 58; j ) //{ // Console.Write(" "); //} //一个全角空格(就是两个半角空格) for (int j = 0; j < 29; j ) { Console.Write(" "); } //绘制第一竖排关卡 Console.WriteLine(GetPattern(i)); } #endregion } //封装为方法可以减少冗余代码 //达到方法复用的功能 /// <summary> /// 根据下标返回对应的关卡图案 /// </summary> /// <param name="index">下标</param> /// <returns>返回对应关卡图案</returns> static string GetPattern(int index) { string strPt = ""; //判断两个玩家坐标是否相同 if (index == pos[0] && pos[0] == pos[1]) { //设置输出字符时要显示的颜色 Console.ForegroundColor = ConsoleColor.Cyan; strPt = "><"; } //判断玩家A else if (index == pos[0]) { Console.ForegroundColor = ConsoleColor.Cyan; strPt = "A"; } //判断玩家B else if (index == pos[1]) { Console.ForegroundColor = ConsoleColor.Cyan; strPt = "B"; } //排除前面条件后判断各类型关卡 else { //判断各类型关卡 switch (levelData[index]) { //普通关卡 case 0: Console.ForegroundColor = ConsoleColor.White; strPt = "□"; break; //地雷关卡 case 1: Console.ForegroundColor = ConsoleColor.Red; strPt = "●"; break; //暂停关卡 case 2: Console.ForegroundColor = ConsoleColor.Yellow; strPt = "▲"; break; //飞盘关卡 case 3: Console.ForegroundColor = ConsoleColor.DarkGreen; strPt = "◎"; break; //防止意外数据(可以忽略不要) default: Console.ForegroundColor = ConsoleColor.White; strPt = "□"; break; } } return strPt; } #endregion

优化代码后绘制的地图

3 绘制第二横排(下标64-35,需要倒着循环绘制)

4 绘制第二竖排(下标65-70,需要先换行,后绘制竖排;与第一竖排一样)

5 绘制第三横排(下标70-100)

static void DrawMap() { #region 绘制第一横排30个关卡 //绘制第一横排30个关卡 for (int i = 0; i <= 29; i ) { //string str = GetPattern(i); //Console.Write(str); //调用方法即可 Console.Write(GetPattern(i)); } #endregion //换行绘制竖排 Console.WriteLine(""); #region 绘制第一竖排5个关卡 for (int i = 30; i < 35; i ) { //绘制竖排关卡前面的空格 ////一个半角空格 //for (int j = 0; j < 58; j ) //{ // Console.Write(" "); //} //一个全角空格(就是两个半角空格) for (int j = 0; j < 29; j ) { Console.Write(" "); } //绘制关卡 Console.WriteLine(GetPattern(i)); } #endregion //绘制第二横排关卡 for (int i = 64; i >= 35; i--) { Console.Write(GetPattern(i)); } //先换行,后绘制 Console.WriteLine(""); //倒着绘制第二竖排关卡 for (int i = 65; i < 70; i ) { Console.WriteLine(GetPattern(i)); } //绘制第三横排 for (int i = 70; i < 100; i ) { Console.Write(GetPattern(i)); } }

绘制地图全部代码(可以说前面所写都是过渡,只要理清下面的代码即可)

#region 2 绘制地图 class Program { //地图数组声明为 类的成员变量 //表示游戏中所有关卡的格子 static int[] levelData = new int[100]; //表示两个玩家在地图中的坐标(对应levelData中的下标) //static int player1 = 0, player2=0; //使用数组表示两个玩家的坐标 static int[] pos = new int[] { 0, 0 }; //程序入口方法 static void Main(string[] args) { //显示游戏信息 ShowMapInfo(); //初始化地图关卡数据 InitData(); //调用绘制地图方法 DrawMap(); Console.ReadKey(); } #region 3 依据关卡数据绘制地图 static void DrawMap() { #region 绘制第一横排30个关卡 //绘制第一横排30个关卡 for (int i = 0; i <= 29; i ) { //string str = GetPattern(i); //Console.Write(str); //调用方法即可 Console.Write(GetPattern(i)); } #endregion //换行绘制竖排 Console.WriteLine(""); #region 绘制第一竖排5个关卡 for (int i = 30; i < 35; i ) { //绘制竖排关卡前面的空格 ////一个半角空格 //for (int j = 0; j < 58; j ) //{ // Console.Write(" "); //} //一个全角空格(就是两个半角空格) for (int j = 0; j < 29; j ) { Console.Write(" "); } //绘制关卡 Console.WriteLine(GetPattern(i)); } #endregion //绘制第二横排关卡 for (int i = 64; i >= 35; i--) { Console.Write(GetPattern(i)); } //绘制第二竖排关卡 Console.WriteLine(""); for (int i = 65; i < 70; i ) { Console.WriteLine(GetPattern(i)); } //绘制第三横排 for (int i = 70; i < 100; i ) { Console.Write(GetPattern(i)); } //恢复默认颜色,否则下面再输入其他字符 //就会是之前最后设置的前景色 //Console.ResetColor(); //或者设置为 Console.ForegroundColor = ConsoleColor.White; } /// <summary> /// 根据当前下标返回对应的关卡图案 /// </summary> /// <param name="index">下标</param> /// <returns>返回对应关卡图案</returns> static string GetPattern(int index) { string strPt = ""; //判断两个玩家坐标是否相同 if (index == pos[0] && pos[0] == pos[1]) { //设置输出字符时要显示的颜色 Console.ForegroundColor = ConsoleColor.Cyan; strPt = "><"; } //判断玩家A else if (index == pos[0]) { Console.ForegroundColor = ConsoleColor.Cyan; strPt = "A"; } //判断玩家B else if (index == pos[1]) { Console.ForegroundColor = ConsoleColor.Cyan; strPt = "B"; } //排除前面条件后判断各类型关卡 else { //判断各类型关卡 switch (levelData[index]) { //普通关卡 case 0: Console.ForegroundColor = ConsoleColor.White; strPt = "□"; break; //地雷关卡 case 1: Console.ForegroundColor = ConsoleColor.Red; strPt = "●"; break; //暂停关卡 case 2: Console.ForegroundColor = ConsoleColor.Yellow; strPt = "▲"; break; //飞盘关卡 case 3: Console.ForegroundColor = ConsoleColor.DarkGreen; strPt = "◎"; break; //防止意外数据(可以忽略不要) default: Console.ForegroundColor = ConsoleColor.White; strPt = "□"; break; } } return strPt; } #endregion #region 2 手动初始化关卡数据 //初始化地图关卡数据 static void InitData() { //●表示地雷 设置元素值为 1 int[] mine = { 3, 23, 35, 47, 52, 66, 79, 82, 93 }; //▲表示暂停 设置元素值为 2 int[] suspend = { 7, 26, 55, 69, 88 }; //◎表示飞盘 设置元素值为 3 int[] frisbee = { 9, 33, 59, 85 }; for (int i = 0; i < mine.Length; i ) { //int a=mine[i]; //chequer[a]=1; //等同于下面 levelData[mine[i]] = 1; } for (int i = 0; i < suspend.Length; i ) { levelData[suspend[i]] = 2; } for (int i = 0; i < frisbee.Length; i ) { levelData[frisbee[i]] = 3; } } #endregion #region 1 显示游戏信息 //显示游戏信息 static void ShowMapInfo() { string title = "飞行棋小游戏 1.0"; Console.Title = title; Console.WriteLine("\t\t\t***************************"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("\t\t\t* " title " *"); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("\t\t\t***************************"); Console.WriteLine("\t\t\t\t飞行棋游戏规则"); Console.WriteLine("\t\t\t●地雷(-6) ▲暂停(0) ◎飞盘( 10)"); Console.WriteLine(""); } #endregion } #endregion

上面行号 78-82代码如果没有设置就会显现下面的效果

//截取自上面行号 73-77 //行号 82需要注释掉才会显现下面效果 //绘制第三横排 for (int i = 70; i < 94; i ) { Console.Write(GetPattern(i)) }

继承之前设置的前景色

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved