我一直在努力完成几天前收到的任务。基本上该任务是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之后被击中了。
答案 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();
}