c#打印"*"使用2d数组输入坐标的Char

本文关键字:quot 输入 坐标 Char 数组 使用 打印 2d | 更新日期: 2023-09-27 18:17:35

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

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

应用程序应该如何工作:https://i.stack.imgur.com/xyNRq.jpg

[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被击中之后。

c#打印"*"使用2d数组输入坐标的Char

创建一个20x20的2d数组。提示用户输入x和y。一旦你在数组[x,y]中存储了一个1,一旦用户点击stop循环遍历数组,如果为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("");
        }
    }

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

你也应该以某种方式读取用户输入,并为给定的位置设置适当的值,而不是存储坐标。

试试这个,让我知道这对你是如何起作用的。在这把小提琴上也能看到。输入坐标为两个空格分隔的数字,并输入停止以打印。

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();
        }
    }
}

希望这对你有帮助!

我建议分解任务,将整个例程塞进单个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();
}