double avg = 9.99999999
string s = avg.ToString("0.00");这样可以把Double类型转换为9.99
avg = Convert.ToDouble(s);
先将double转换为2位小数的string,再将string转换为double;
Console.WriteLine("{0:0.00}"); 和 ToString("0.00"); 都会保留四舍五入;
要实现一个功能最好将它写成一个方法;这样每次要用到这个功能的时候只要调用这个方法就可以了;
你要改变一个数组,不管是改变元素的位置也好,还是改变元素的大小也好,用一个方法来实现的话,这个方法不需要有任何的返回值;方法中的参数也不需要ref;数组是个例外;
飞行棋:画面不停的闪,其实就是不停的重新画的过程;因为要不停得重新的画,所以把它封装成方法;重画的时候只要调用方法就可以了;
Console.Foreground = ConsoleColor.Yellow;
Console.WriteLine("*******************"); //这行输出的是黄色的*
Console.Foreground = ConsoleColor.Red;
Console.WriteLine("*******************"); //这行输出的是红色的*
在游戏里,进入一个场景之前有一个进度条在读取,这个时候是加载地图所需要的资源;
在控制台绘制飞行棋的地图的时候,将整数数组的数字编程控制台中显示的特殊字符串的这个过程,就是初始化地图;
当很多的方法都要用到某个变量的时候,可以把它声明成一个静态的字段来模拟全局变量; static int[] maps = new int[100];
在写飞行棋的时候,由于特殊字符地图是由一个int数组存储,但是有很多不同的特殊字符,方块,幸运盘,五角星等等,我们把幸运盘所在的字符设为1,字符串默认为0的设为方块,这个时候,我们就可以声明几个数组
int[] LuckyTurn = {6,23,40,55,69,83}; maps中索引为这些的画为幸运盘;
int[] LandMine = {2,34,56,77}; maps中索引为这些的画为地雷;
int[] Pause = {23,45,76}; maps中索引为这些的画为暂停;
int[] TimeTunnel = { 20,56,64 }; maps中索引为这些的画为时空隧道;
public static void BiaoJi(int[] nums ,int flag)
{
for(int i = 0; i<nums.Length;i++)
{
maps[nums[i]] = flag;
}
}
//自己写的方法对错未知;给maps赋值;
初始化数组说白了就是给这个地图赋值;
由于图是一横一竖的,因此画图只能一横行,一竖行这样画;
因为有两个玩家,因此声明一个静态数组用来存储玩家A和玩家B的坐标;
static int[] playerpos = new int[2];
public static void DrawMap()
{
for (int i = 0;i < 30; i++)
{
Console.Write(DrawStringMap(i));
}
}//第一横行
为什么关卡不是随机生成的;而是用数组定死的;可能产生6个连续的地雷导致游戏无法玩;
为了使得代码看起来清晰,要使用#region #endregion 折叠代码;
画竖行的时候,用for循环的双重嵌套;
画完第一横行之后应该先换行;
Console.WriteLine();
for(int i = 30 ; i < 35; i++)
{
for(int j = 0;j < 29; j++)
{
Console.Write(" ");
}
//每画完一行就要换行;
Console.Write(DrawStringMap(i));
Console.WriteLine();
} //第一竖行
for(int i = 64;i>=35;i--)
{
Console.Write(DrawStringMap(i));
} //第二横行
Console.WriteLine();
for(int i = 65;i<=69;i++)
{
Console.WriteLine(DrawStringMap(i));
} //第二竖行
for(int i = 70;i<=99;i++)
{
Console.Write(DrawStringMap(i));
} //第三横行;
//从画地图的方法中抽离出来的一个方法,因为经常被调用;实现方法的封装;
//如果玩家A和玩家B的坐标相同,并且都在这个地图上,那么画一个尖括号;先上来先画AB,因为AB是时时刻刻在改变其他的;再画关卡;
public static string DrawStringMap(int i)
{
string str = "";
if(playerpos[0] == playerpos[1]&&playerpos[1]==i)
{
str = "<>"; // <>是半角的,A,B是全角的;控制台上两个半角等于一个全角
}
else if(playerpos[0] = i)
{
str = "A";
}
else if(playerpos[1] = i)
{
str = "B";
}
else
{
switch(Maps[i])
{
case 0;
Console.Foreground = ConsoleColor.Yellow;
str = "■";
break;
case 1;
Console.Foreground = ConsoleColor.Red;
str = "○";
break;
case 2;
Console.Foreground = ConsoleColor.Green;
str = "★";
break;
case 3;
Console.Foreground = ConsoleColor.Blue;
str = "△";
break;
case 4;
Console.Foreground = ConsoleColor.Purple;
str = "*";
break;
}
}
return str;
}
以上就三步
1.画游戏头
2.初始化地图 给maps赋值,
3.画游戏地图;写一个统一的打印字符的方法,打印地图;
4.输入姓名;
//存储两个玩家的姓名
static string[] playerName = new string[2];
Console.clear(); 清屏;
如何在控制台复制文本,右键控制台最上角的图标,右键,编辑,标记;选中要复制的文本,按下回车就复制了;
5.正式开始写游戏的精华;
A玩一次B玩一次,如果玩游戏写成方法的话就是A调用一次,B调用一次;这个游戏有一个玩家到了终点就不玩了,他们俩要玩游戏的条件是谁都没到终点;
Console.ReadKey(true);用户按下的键不显示在控制台;
while(playerPos[0]<99 && playerPos[1]<99)
{
}
playerPos[0] += 4;让玩家前进四格;
通过Maps[playPos[0]] == 0,1,2,3,4来判断玩家踩到了什么;
switch可以不用default;
把一段代码写成方法的时候,复制过去,看哪些变量下面有红线,就把它传参;
static bool[] Flags = new bool[2];玩家的两个标记,跟暂停有关;
if(PlayerPos[ PlayerNum ] == PlayerPos[ 1 - PlayerNum ])
{
PlayerPos[ PlayerNum ] -= 6;
}
while(true)
{
if(input == "1")
{
int temp = PlayPos[PlayNumber];
PlayPos[PlayNumber] = PlayPos[1-PlayNumber];
PlayPos[1-PlayNumber] = temp;
}
.........
}
暂停的话用这些代码来实现;
if(Flags[0] == false)
{
PlayGames[0];
}
else
{
Flags[0] == true;
}
if(Flags[1] == false)
{
PlayGames[1];
}
else
{
Flags[1] == true;
}