有没有一种方法可以缩短我的代码?

4

我是一名新手C#程序员。我正在通过控制台应用程序创建一个基于文本的冒险游戏。我创建了一个地图命令,当您键入“map”时,它会显示一个带有X标记当前位置的地图。 int变量xCoordinate和yCoordinate用于表示地图上的角色位置,并在键入“go north”或“go south”等命令时变化1。该地图为13x10,因此您的角色可能有130个不同的位置。我编写了130个不同的if语句,它运行得很好。我的问题是是否有更有效/更简单的方法来做到这一点。以下是我的代码:

    public static void Map()

    {
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.WriteLine("\n" + xCoordinate + ", " + yCoordinate);
        Console.WriteLine("\nTowns are represented by a \"T\". Current location is shown as an \"X\".\n");
        Console.ForegroundColor = ConsoleColor.DarkGray;
        if ((xCoordinate == -7) && (yCoordinate == -4))
        {
            Console.Write("[ ][ ][ ][ ][ ][ ][ ][T][ ][ ][ ][ ][ ] 5\n");
            Console.Write("[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 4\n");
            Console.Write("[ ][ ][ ][ ][T][ ][ ][ ][ ][T][ ][ ][ ] 3\n");
            Console.Write("[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 2\n");
            Console.Write("[ ][ ][T][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 1\n");
            Console.Write("[T][ ][ ][ ][ ][ ][ ][T][ ][ ][ ][T][ ] 0\n");
            Console.Write("[ ][ ][ ][ ][T][ ][ ][ ][ ][ ][ ][ ][ ]-1\n");
            Console.Write("[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]-2\n");
            Console.Write("[ ][ ][T][ ][ ][ ][T][ ][ ][ ][T][ ][ ]-3\n");
            Console.Write("[X][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]-4\n");
            Console.Write("-7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5\n\n");
        }
        Console.ForegroundColor = ConsoleColor.White;
  }

我已经用130个不同的if语句将地图打印了130次,每次X的位置都不同。我认为应该有更好的方法来做到这一点,但我不知道怎么做。


8
这个问题更适合于http://codereview.stackexchange.com。 - Ondrej Tucny
12
感谢您持续写下那130次,直到思考“一定有更好的方法”之前。+1 - Jamiec
6
我想看完全部的130个if循环,这样做有错吗? - glosrob
8
随着你继续编程,你会学到一个重要的原则:任何时候如果你重复代码一次以上,那么你可能做错了什么。这通常被称为DRY原则:不要重复自己。重复130次代码很明显是有更简单的方法的强烈信号。你编程教育的下一步应该是学习“表示”和“显示”的区别。你需要一个“数据结构”来表示游戏状态,然后是将其呈现在屏幕上的“显示逻辑”。 - Eric Lippert
2
这可能会帮助你入门:https://gist.github.com/jasonsperske/5163529(它绝不是完美的) - Jason Sperske
显示剩余6条评论
2个回答

10

你应该阅读并学习像for这样的循环。

类似以下内容:

for(var xCoordinate  = -10; xCoordinate  <=10; xCoordinate ++)
{
   for(var yCoordinate = 5; yCoordinate >= 5; yCoordinate --)
   {
      if (xCoordinate  == ... && yCoordinate == ..)
      { 
         Console.Write("[X]");
      }
      else
      { 
         Console.Write("[ ]");
      }
    }
    Console.WriteLine();
}

1
    public static void Map()
    {
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.WriteLine("\n" + xCoordinate + ", " + yCoordinate);
        Console.WriteLine("\nTowns are represented by a \"T\". Current location is shown as an \"X\".\n");
        Console.ForegroundColor = ConsoleColor.DarkGray;

        for (int y = 5; y >= -4; y--)
        {
            for (int x = -7; x <= 5; x++)
            {
                Console.Write(yCoordinate == y && xCoordinate == x ? "[X]" : "[ ]");
            }
            Console.WriteLine(" {0}", y);
        }
        Console.Write("-7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5\n\n");
        Console.ForegroundColor = ConsoleColor.White;
    }

原文中的 T 是什么意思? - Jamiec
1
请返回仅翻译的文本:https://gist.github.com/jasonsperske/5163529,因为我无法自控地执着于此 :P - Jason Sperske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接