2016-11-11 100 views
0

我一直在試圖做一個我幾天前收到的任務。基本上,任務是在C#控制檯應用程序:c#使用2d數組輸入的座標打印「*」字符

提示符中,直到字用戶爲2個座標輸入「STOP」進入。一旦命中「stop」字樣,在每個輸入座標處打印一個「*」(星號字符)。座標打印的字段是20x20。我嘗試過這樣做,但無濟於事。如果有人能幫助我,並告訴我如何存儲輸入X,Y爲二維數組,那簡直太好了:)

如何應用應該工作: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

可能解決你很多問題的東西是我認爲你意思是「while(!停止)' –

+1

您還將您的迴應轉換爲小寫,但是您將回應與「停止」而不是「停止」進行比較 –

+0

感謝您指出那些錯誤的人:) –

回答

0

因爲你只需要顯示一個矩陣式的輸出,你不需要使用Console.SetCursorPosition(x, y);

你也應該以某種方式讀取用戶輸入和設置給定位置上的正確值,而不是商店該座標。

試試這個,讓我知道如何爲你的作品。你也可以在this小提琴上看到它。輸入座標作爲兩個空格分隔的數字並輸入停止打印。

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

希望這有助於!

+0

Karel您的代碼確實可行,我不得不改變輸出中的for循環從1開始,所以它實際上將它打印在正確的位置上。雖然我在20,15年寫作時,它只是崩潰,說這個指數甚至不是我認爲它不是? –

+0

Yeap,你應該根據自己的需求來驗證。 C#中的數組基於zore,所以在這種情況下,20,15是無效的位置,因爲最後的位置是19,19 –

+0

非常感謝,您的編碼技能真的是令人羨慕的水平。 :) –

1

創建一個20x20二維數組。提示用戶輸入x和y。一旦用戶在數組[x,y]中每次存儲一個1,然後如果爲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(""); 
     } 
    } 
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(); 
} 
+0

非常感謝你的詳細解釋,你似乎破壞了這個C#開發:D –

+0

@BenjaminBajić:我試圖提出一個現實世界的解決方案:如果我的老闆要求我開發常規。 Vague和* incomplete *(座標是如何分開的:按','或按';'或按空格...如果提供'(-1,-1)'點......)以及反覆和*不穩定*(我說'20x20'?Nonsence!'45x45';打印在控制檯上?廢話!給我發一封電子郵件!)規格是很常見的。用戶的輸入是另一個擔憂:「我已經試過把'1; 2'點一小時,請幫助我!」 –