c#使用带有2d数组

时间:2016-11-11 19:36:37

标签: c#

我一直在努力完成几天前收到的任务。基本上该任务是C#中的控制台应用程序:

提示用户输入2个坐标,直到输入“停止”字样。一旦点击“停止”一词,在每个输入坐标处打印一个“*”(星号)。打印坐标的字段是20x20。我试过这样做,但无济于事。如果有人可以帮助我并告诉我如何将输入x,y存储到2d数组中,那就太好了:)

应用程序应如何运作:http://imgur.com/a/SnC1k

[0,5] [18,18]等是输入的坐标,稍后将在下面打印。 “#”字符不需要打印,它们只是为了帮助理解任务。

我是怎么做的但是没有工作:

namespace ConsoleApplication1
{   
class Program
{
    static void Main(string[] args)
    {
        bool stopped = false;
        int x=0;
        int y=0;


        while (stopped)
        {
            string[,] coordinates = Console.ReadLine();
            string response = Console.ReadLine();
            response = response.ToLower();

            if (response == "STOP")
                stopped = true;
            else
            {
                string[] xy = coordinates.Split(',');
                x = int.Parse(xy[0]);
                y = int.Parse(xy[1]);

                Console.SetCursorPosition(x, y);
                Console.Write("*");
            }






        }


    }
    }
    }

我做的代码没有做到。它显示了我不知道如何修复的多个错误,我唯一能做的就是当我输入第一个坐标时立即打印一个字符,而不是在每个输入的坐标处打印一个字符,在单词STOP之后被击中了。

3 个答案:

答案 0 :(得分:1)

创建一个20x20的二维数组。提示用户输入x和y。一旦用户点击阵列中的停止循环并打印出“#,y”,您的阵列中的每个商店都会有一个1 [x,y]。如果为null或0并打印' *'如果它是1.

编辑,沿着这些方向,我没有检查这是否有效或编译,但应该让你走上正确的轨道。

    int[,] grid = new int[20,20];
    while (!stopped)
    {
        string[,] coordinates = Console.ReadLine();
        string response = Console.ReadLine();
        response = response.ToUpper();

        if (response == "STOP")
            stopped = true;
        else
        {
            string[] xy = coordinates.Split(',');
            x = int.Parse(xy[0]);
            y = int.Parse(xy[1]);
            grid[x,y] = 1;  
        }

        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                if (grid[i, j] > 0)
                    Console.Write("*");
                else
                    Console.Write("#");
            }
            Console.WriteLine("");
        }
    }

答案 1 :(得分:0)

由于您只需要显示矩阵式输出,因此无需使用Console.SetCursorPosition(x, y);

此外,您应该以某种方式阅读用户输入并为给定位置设置正确的值,而不是存储坐标。

试试这个,让我知道这对你有用。你也可以在this小提琴上看到它。输入坐标作为两个以空格分隔的数字,然后输入stop to print。

using System;

public class Program
{
    public static void Main(string[] args)
    {
        int x=0;
        int y=0;
        char[,] coordinates = new char[20,20];

        while (true)
        {
            //user must enter 2 3 for example.
            string[] response = Console.ReadLine().Split(new[]{" "}, StringSplitOptions.RemoveEmptyEntries);
            if (response[0].ToLower() == "stop")
                break;

            x = int.Parse(response[0]);
            y = int.Parse(response[1]);

            coordinates[x,y] = '*';
        }


        //Print the output
        for(var i = 0; i < 20; i++)
        {
            for( var j = 0; j < 20; j++)
                if (coordinates[i,j] == (char)0)
                    Console.Write('#');
                else 
                    Console.Write(coordinates[i,j]);

            Console.WriteLine();
        }
    }
}

希望这有帮助!

答案 2 :(得分:0)

我建议分解任务,将整个rountine塞进一个Main作为不好的做法;你应该:

- ask user to enter coordinates
- print out the map

让我们提取方法:

private static List<Tuple<int, int>> s_Points = new List<Tuple<int, int>>();

private static void UserInput() {
  while (true) {
    string input = Console.ReadLine().Trim(); // be nice, let " stop   " be accepted

    if (string.Equals(input, "stop", StringComparison.OrdinalIgnoreCase))
      return;

    // let be nice to user: allow he/she to enter a point as 1,2 or 3   4 or 5 ; 7 etc.
    string[] xy = input.Split(new char[] { ',', ' ', ';', '\t' },
                              StringSplitOptions.RemoveEmptyEntries);
    int x = 0, y = 0;

    if (xy.Length == 2 && int.TryParse(xy[0], out x) && int.TryParse(xy[1], out y)) 
      s_Points.Add(new Tuple<int, int>(x, y));
    else
      Console.WriteLine($"{input} is not a valid 2D point.");
  }
}

打印

private static void PrintMap(int size = 20) {
  // initial empty map; I prefer using Linq for that, 
  // you can well rewrite it with good old for loops
  char[][] map = Enumerable.Range(0, size)
    .Select(i => Enumerable.Range(0, size)
       .Select(j => '#')
       .ToArray())
    .ToArray();

  // fill map with points; 
  // please, notice that we must not print points like (-1;3) or (4;100) 
  foreach (var point in s_Points)
    if (point.Item1 >= 0 && point.Item1 < map.Length &&
        point.Item2 >= 0 && point.Item2 < map[point.Item1].Length)
      map[point.Item1][point.Item2] = '*';

  // The string we want to output; 
  // once again, I prefer Linq solution, but for loop are nice as well
  string report = string.Join(Environment.NewLine, map
    .Select(line => string.Concat(line)));

  Console.Write(report);
}

最后,您只需要调用方法:

static void Main(string[] args) {
  UserInput(); 
  PrintMap();

  Console.ReadKey();
}