C#—飞行棋超全总结(全注释版)
作者:互联网
目录
8.画地图上横行的方法DrawStringMapLeftToRight()
1.首先了解C#飞行棋的基本功能
飞行棋是一款非常简单的双人游戏,有点类似大富翁的玩法,别问我为什么像大富翁,问就是类似的我只玩过大富翁,玩家A、B通过掷骰子来在地图上行走,如果走到关卡位置需要执行相应操作,比如交换位置、或者前进十步等,当某个玩家走到终点后,游戏结束,先到达终点的玩家获得胜利。
2.实现飞行棋需要哪些准备
根据上述对飞行棋基本功能的描述,我们可以择出几个关键词:双人、掷骰子、地图、位置、关卡、操作。如何用最简单的代码来实现这些看起来非常复杂的功能呢,最最重要的就是方法的使用。我们可以把每一个功能定义成为一个方法,在主函数中来调用,可以大大减少代码量。所以我们在飞行棋的设计中定义了如下几个方法,每个方法的作用和参数如下表所示:
方法名 | 参数 | 返回值类型 | 作用 |
ShowUI() | 无 | 无 | 显示游戏头 |
DrawStringMap() |
pos | string | 画标识和玩家 |
ReadInt() | msg,min,max | int | 读取用户输入的值 |
RowTouZi() | playerPos | 无 | 掷骰子 |
IntMap() | 无 | 无 | 初始化地图 |
DrawStringMapLeftToRight() | left,right | 无 | 画地图横行 |
DrawMap() | 无 | 无 | 画地图 |
win() | 无 | 无 | 提示用户胜利 |
3.显示游戏头的ShowUI()方法
该方法主要用来在程序加载时显示出游戏头,主要用到了Console.WriteLine()方法。具体代码和注释如下:
public static void ShowUI()//显示游戏头
{
Console.WriteLine("***********************************************");
Console.WriteLine("* *");
Console.WriteLine("* 终极骑士飞行棋 *");
Console.WriteLine("* *");
Console.WriteLine("***********************************************");
}
4.画标识和玩家的DrawStringMap()方法
该方法主要用在画完地图后对地图上玩家和标识颜色进行补充,具体代码和注释如下:
public static string DrawStringMap(int pos)//定义一个画地图的方法
{
string temp = "";//定义一个字符串变量作为返回值
if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == pos)//如果玩家A和玩家B在一起并且在地图上就画<>
{
Console.ForegroundColor = ConsoleColor.Yellow;//图标颜色为黄色
temp="<>";
}
else if (PlayerPos[0] == pos )//如果玩家A在地图上就画A
{
temp="A";
}
else if (PlayerPos[1] == pos )//如果玩家B在地图上就画B
{
temp="B";
}
else
{
switch (Map[pos])//如果玩家A和玩家B不在一起也不在这个坐标上就画该显示的地图图标,根据索引值判断该画哪个图案
{
case 0:Console.ForegroundColor = ConsoleColor.Gray;//如果索引值为0,那么就画灰色的□
temp ="□";
break;//跳出switch case
case 1:Console.ForegroundColor = ConsoleColor.Red;//如果索引值为1,那么就画红色的⊙
temp ="⊙";
break;//跳出switch case
case 2:Console.ForegroundColor = ConsoleColor.Blue;//如果索引值为2,那么就画蓝色的☆
temp ="☆";
break;//跳出switch case
case 3:Console.ForegroundColor = ConsoleColor.Green;//如果索引值为3,那么就画绿色的▲
temp ="▲";
break;//跳出switch case
case 4:Console.ForegroundColor = ConsoleColor.Magenta;//如果索引值为4,那么就画紫红色的卐
temp ="卐";
break;//跳出switch case
}// end switch
}// end if
return temp;//返回temp的值
}
5.读取用户输入值的ReadInt()方法
该方法用来读取用户在位于幸运轮盘关卡时选择的值,具体代码和注释如下:
public static int ReadInt(string msg,int min,int max)//定义一个方法,读取用户输入的值
{
while (true)
{
try//进入try catch语句
{
Console.WriteLine(msg);//在屏幕上输出调用该方法的语句要输出的内容
int number = Convert.ToInt32(Console.ReadLine());//读取用户输入的内容,并强制转换为整型,定义一个整型变量number来接受转换后的值
if (number >=min && number <=max)//如果number的值处于min和max之间,那么返回number
{
return number;
}
else//证明number的值没有在min和max之间
{
Console.WriteLine("你的输入不合法,只能输入{0}到{1}之间的数字!", min, max);//输出提示
continue;
}
}
catch//如果强制转换发生异常,进入catch语句
{
Console.WriteLine("输入有误,请重新输入!");//提示输入有误,请重新输入
}
}
}
6.掷骰子的RowTouZi()方法
该方法主要用来生成一个随机数,玩家根据掷出的数字移动,并产生相应移动位置上的操作。具体代码和注释如下:
public static void RowTouZi(int playerPos)//定义一个掷骰子的方法,有一个整型参数playPos,无返回值
{
Random r = new Random();//实例化r为一个随机数对象
int num = r.Next(1, 7);//返回上下界之间的随机数,并且随机数可取下界值,但不能取上界值,同时定义一个整型变量num来接受随机数
string msg = "";//定义一个字符串变量msg,并赋初值为空格
Console.WriteLine("{0}按任意键开始掷骰子", PlayerNames[playerPos]);//输出某玩家的姓名按任意键开始掷骰子
Console.ReadKey(true);//当玩家按下任意键后继续
Console.WriteLine("{0}掷出了{1}", PlayerNames[playerPos],num);//输出提示玩家谁谁谁掷出了某个数字
Console.WriteLine("{0}按任意键开始行动......", PlayerNames[playerPos ]);//输出提示谁谁谁可以按任意键开始行动
Console.ReadKey(true);//当玩家按下任意键后继续
PlayerPos[playerPos] += num;//上述玩家的新位置值等于原位置加上num的值,即掷出来的值
CheckPos();//调用CheckPos()方法,确保玩家位置还在地图上
if (PlayerPos[playerPos]==PlayerPos[1-playerPos ])//判断玩家移动后的位置是否与另一位玩家位置相同,若相同,则继续
{
msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}退6格", PlayerNames[playerPos], PlayerNames[1 - playerPos], PlayerNames[1 - playerPos]);//走到这里,证明两个玩家位置相同,即符合踩一脚规则,将字符串"玩家某踩到了玩家某,玩家某退6格"这个字符串赋给msg
PlayerPos[1 - playerPos] -= 6;//被踩玩家的位置值-6
CheckPos();//调用CheckPos()方法,确保被踩玩家位置还在地图上
}
else//玩家移动后位置与另一位玩家位置不同,游戏继续
{
switch (Map[PlayerPos[playerPos]])//判断玩家此时的位置是否处在关卡位置
{
case 0: //索引值为0,代表玩家没有位于关卡位置
msg = "行动完了"; //msg的值为行动完了,即在屏幕输出行动完了
break;//跳出switch
case 1://索引值为1,代表玩家位于幸运轮盘位置
msg = string.Format("{0}走到了幸运轮盘,请选择1——交换位置,2——轰炸对方", PlayerNames[playerPos]);//输出提示
int number = ReadInt(msg, 1, 2);//调用ReadInt方法,读取用户输入的值,并定义一个整型变量number来接受该方法的返回值
if (number == 1)//如果返回值为1
{
//下面四行代码的功能就是来交换两位玩家的位置,原理就是定义一个第三方变量
int temp = 0;//定义一个整型变量temp,并赋初值为0
temp = PlayerPos[playerPos];//将当前玩家的位置赋给temp
PlayerPos[playerPos] = PlayerPos[1 - playerPos];//将另一位玩家的位置赋给当前玩家
PlayerPos[1 - playerPos] = temp;//将temp的值赋给另一位玩家
msg = string.Format("玩家{0}选择了与玩家{1}交换位置", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//输出提示
}
else//返回值不为1,即代表当前玩家选择了轰炸对方
{
PlayerPos[1 - playerPos] = 0;//另一位玩家的位置为0
msg = string.Format("玩家{0}选择轰炸玩家{1}", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//输出提示
}
break;//跳出switch
case 2://索引值为2,代表玩家处于地雷位置
msg = "恭喜你,能踩到地雷,百年不遇,退6格";//输出提示
PlayerPos[playerPos] -= 6;//当前玩家位置-6
CheckPos();//调用CheckPos()方法,确保被踩玩家位置还在地图上
break;//跳出switch
case 3://索引值为3,代表玩家处于暂停位置
msg = "踩到暂停了";//输出提示
flag[playerPos] = true;//该玩家暂停状态的值变为true,代表处于暂停状态
break;//跳出switch
case 4://索引值为4,代表玩家处于时空隧道位置
msg="恭喜你,这个猥琐家伙居然穿越了10步";//输出提示
PlayerPos[playerPos] += 10;//当前玩家位置+10
CheckPos();// 调用CheckPos()方法,确保被踩玩家位置还在地图上
break;//跳出switch
}
}
Console.Clear();//清除屏幕
DrawMap();//调用画地图方法
Console.WriteLine(msg);//输出提示
}
7.初始化地图的InitMap()方法
该方法主要用在界面加载显示游戏头后,在玩家输入姓名之前初始化地图,主要代码和注释如下:
public static void InitMap()//定义一个方法初始化地图
{
int[] luckturn = { 6, 23, 40, 55, 69, 83 };//定义幸运轮盘数组并赋初值,代表地图上幸运轮盘所处的位置
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//定义地雷数组并赋初值,代表地图上地雷所处的位置
int[] pause = { 9, 27, 60, 93 };//定义暂停数组并赋初值,代表地图上暂停所处的位置
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//定义时空隧道数组并赋初值,代表地图上时空隧道所处的位置
for (int i = 0; i < luckturn.Length; i++)
{
Map[luckturn[i]] = 1;//改变Map数组里对应幸运轮盘位置的索引对应的值为1
}
for (int i = 0; i < landMine.Length; i++)
{
Map[landMine [i]] = 2;//改变Map数组里对应地雷位置的索引对应的值为2
}
for (int i = 0; i < pause.Length; i++)
{
Map[pause [i]] = 3;//改变Map数组里对应暂停位置的索引对应的值为3
}
for (int i = 0; i < timeTunnel.Length; i++)
{
Map[timeTunnel[i]] = 4;//改变Map数组里对应时空隧道位置的索引对应的值为4
}
}
8.画地图上横行的方法DrawStringMapLeftToRight()
该方法主要用来画地图上的第一横行和第三横行,具体代码和注释如下:
public static void DrawStringMapLeftToRight(int left, int right)//定义一个画横行的方法,有两个整型参数,left和right
{
for (int i = left; i <= right; i++)//在left和right之间开始画地图
{
Console.Write(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出,且该画地图无需换行
}
}
9.画地图的DrawMap()方法
该方法主要用于画出地图,主要代码和注释如下所示:
public static void DrawMap()//定义画地图的方法
{
Console.WriteLine("图例:幸运轮盘:⊙ 地雷:☆ 暂停:▲ 时空隧道:卐 ");//输出在屏幕上
DrawStringMapLeftToRight(0, 29);//调用画横行的方法画第一横行,参数为0和29
//画地图第一竖行
for (int i = 30; i <= 34; i++)
{
for (int j = 0; j <= 28; j++)//在第二竖行前面空余部分画空格
{
Console.Write(" ");
}
Console.WriteLine(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出
}
//画地图第二横行
for (int i=64;i>=35;i--)
{
Console.Write(DrawStringMap(i));//调用画地图的方法,并在屏幕上输出,且该画地图无需换行
}
Console.WriteLine();//换行继续画
//画第二竖行
for (int i=65;i<=69;i++)
{
Console.WriteLine(DrawStringMap(i)); //调用画地图的方法,并在屏幕上输出
}
DrawStringMapLeftToRight(70, 99);//调用画横行的方法画第三横行,参数为70和99
Console.WriteLine();//输出在屏幕上
}
10.表示胜利的Win()方法
该方法主要用在某一玩家到达终点后,提示胜利界面,主要代码和注释如下所示:(粘贴过来位置变了,但是无伤大雅,这个可直接复制老师的源码)
public static void Win()//定义一个胜利的方法,用来在玩家胜利时提示胜利界面
{
Console.ForegroundColor = ConsoleColor.Red;//将输出内容的颜色改为红色
Console.WriteLine(" ◆ ");
Console.WriteLine(" ■ ◆ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ◆■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ◆ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ■■■■■■■ ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ●■● ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ● ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ● ■ ");
Console.WriteLine(" ■ ■■ ■■■■■■ ■ ● ●");
Console.ResetColor();
}
标签:Console,超全,C#,playerPos,地图,玩家,int,WriteLine,飞行棋 来源: https://blog.csdn.net/destinyzjy/article/details/106837678