在用户找到正确的路径之前,向用户提出相同问题的最佳方法是什么?

时间:2019-10-29 12:27:16

标签: c# recursion

我有一个由地图构成的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!!");
}

1 个答案:

答案 0 :(得分:1)

这最初是作为评论,但它变得太大了,所以...

请注意,此代码中还存在其他问题:

首先,您对来自int.Parse的值使用Console.ReadLine()-并没有阻止用户输入诸如ConleyBanana这样的值的情况, 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);
}