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被击中之后。
创建一个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();
}