我有一个由地图构成的2D数组,要求用户输入坐标x和y。我只是想不断询问用户输入的坐标,直到他们达到目标为止。
我想知道使用switch / case语句而不是多个if / else if语句是否会更好。我尝试编写一个名为CoordinateInput的单独方法,该方法将输入指令封装给用户,然后在坐标!='G'时返回。这并不令人遗憾。
char[,] map = new char[6,6] {{ 'W', 'W', 'W', 'W', 'W', 'W' },
{ 'W', 'S', ' ', ' ', ' ', 'W' },
{ 'W', 'E', 'W', ' ', 'E', 'W' },
{ 'W', ' ', ' ', ' ', ' ', 'W' },
{ 'W', ' ', 'W', ' ', 'G', 'W' },
{ 'W', 'W', 'W', 'W', 'W', 'W' }};
for (int y = 0; y < 6; y++)
{
for (int x = 0; x < 6; x++)
{
Console.Write(map[x, y] + " ");
}
Console.WriteLine();
}
Console.WriteLine("Please enter an x coordinate");
int xC = int.Parse(Console.ReadLine());
Console.WriteLine("Please enter a y coordinate");
int yC = int.Parse(Console.ReadLine());
char coordinate = map[yC,xC];
map[yC, xC] = coordinate;
if (coordinate == ' ')
{
Console.WriteLine("You are on free block");
}
else if (coordinate == 'W')
{
Console.WriteLine("You are on a Wall");
}
else if (coordinate == 'E')
{
Console.WriteLine("You recieved an Energy Boost");
}
else if (coordinate == 'S')
{
Console.WriteLine("You the starting place");
}
else if (coordinate == 'G')
{
Console.WriteLine("You Win!! You reached the goal!!");
}
答案 0 :(得分:1)
这最初是作为评论,但它变得太大了,所以...
请注意,此代码中还存在其他问题:
首先,您对来自int.Parse
的值使用Console.ReadLine()
-并没有阻止用户输入诸如Conley
或Banana
这样的值的情况, FormatException
,然后炸毁游戏。
第二,即使用户输入一个数字,如果该数字太大或太小(也可能是IndexOutOfBoundException
,它仍可能导致异常。
第三,您似乎在用一种方法完成整个事情-违反了单一责任原则。
第四,您正在将逻辑与用户交互混合在一起。在编写一个简单的控制台应用程序时并不是那么糟糕,但是这是一个不好的做法,您应该避免使用它来尽早学习最佳做法。
第五,您正在使用硬编码值绘制地图。这意味着,如果您更改地图,则还必须更改循环。请改用GetLength()
方法。
因此-可以通过使用不同的方法从用户读取坐标来处理第一,第二和第三,这样可以使您获得所需的东西:
static int ReadCoordinate(string message, int maxValue)
{
Console.WriteLine(message);
var isValid = false;
int value;
do
{
isValid = int.TryParse(Console.ReadLine(), out value) && value > 0 && value <= maxValue;
if (!isValid)
{
Console.WriteLine("Please try again.");
}
} while (!isValid);
return value;
}
然后,以另一种方法绘制地图:
static void DrawMap(char[,] map)
{
for (int x = 0; x < map.GetLength(0); x++)
{
for (int y = 0; y < map.GetLength(1); y++)
{
Console.Write(map[x, y] + " ");
}
Console.WriteLine();
}
}
最后,另一种玩法:
static void GamePlay(char[,] map)
{
bool gameOver = false;
do
{
var x = ReadCoordinate("Please enter an x coordinate", map.GetLength(0) - 1);
var y = ReadCoordinate("Please enter an y coordinate", map.GetLength(1) - 1);
var value = map[x, y];
var response = "";
switch (value)
{
case ' ':
response = "You are on free block";
break;
case 'W':
response = "You are on a Wall";
break;
case 'E':
response = "You recieved an Energy Boost";
break;
case 'S':
response = "You the starting place";
break;
case 'G':
response = "You Win!! You reached the goal!!";
gameOver = true;
break;
}
Console.WriteLine(response);
} while (!gameOver);
}
然后,您的Main
方法可以看起来像这样:
static void Main(string[] args)
{
char[,] map = new char[6, 6] {{ 'W', 'W', 'W', 'W', 'W', 'W' },
{ 'W', 'S', ' ', ' ', ' ', 'W' },
{ 'W', 'E', 'W', ' ', 'E', 'W' },
{ 'W', ' ', ' ', ' ', ' ', 'W' },
{ 'W', ' ', 'W', ' ', 'G', 'W' },
{ 'W', 'W', 'W', 'W', 'W', 'W' }};
DrawMap(map);
GamePlay(map);
}