2016-04-15 59 views
-2

所以我正在做一些小事情,我有点失落。这是我迄今为止所拥有的。c中的扫雷(简单)#

static void izris() 
{ 
    Random bombe = new Random(); 
    int[,] polje = new int[7, 7]; 
    string stolpci = " ABCDEFG"; 
    int vrstice=1; 
    foreach (char c in stolpci) 
    { 
     Console.Write(c); 
     Console.Write(" "); 

    } 
    Console.WriteLine(); 
    for (int i = 0; i < 7; i++) 
    { 
     for (int j = 0; j < 7; j++) 
     { 
      polje[i, j] = bombe.Next(0, 2); 
     } 
    } 
    //izris polja 
    for(int i=0;i<7;i++) 
    { 
     Console.Write(vrstice); 
     vrstice++; 
     Console.Write(" "); 
     for (int j = 0; j < 7; j++) 
     { 
      Console.Write(polje[i,j]); 
      Console.Write(" "); 
     } 
     Console.WriteLine(); 
    } 
} 

所以它的作用是什么,它打印包含从0到1。现在1意味着它是一个煤矿的随机数的7x7的领域,0意味着它是不是我的。现在,如果你看,有标记列(ABCDEFG)的字符和1-7标记行的数字。现在我想要做的是,例如用户输入一个字符串,字符串将是B4。然后该程序会检查并查看用户选择的字段是矿(0)还是炸弹(1)。如果是炸弹,它也会说有多少炸弹(1)在附近。我不知道如何做到这一点。 我正在考虑将A-F字符转换为0,6数字,这样我可以更容易地编制索引,但我不知道。

所以我做了这个检查输入是否正确。

static void vnospolja() 
    { 
     string lokacija; 
     string nekaj = "A"; 
     int nekaj2 = nekaj[0] - 'A'; 
     lokacija = Convert.ToString(Console.ReadLine()); 
     while (lokacija.Length < 2) 
     { 
      string pravilnalokacija=lokacija.Substring(0,1); 
      int pravilnalokacijaint = pravilnalokacija[0]; 
      if(pravilnalokacijaint>65 && pravilnalokacijaint<72) 
      { 
       Console.Write("input ok"); 
      } 

      string drugiznak = lokacija.Substring(1, 1); 
      int drugiznakint = drugiznak[0]; 
      if(drugiznakint>0 && drugiznakint<8) 
      { 
       Console.Write("input ok"); 
      } 
     } 
    } 

现在我需要一些关于如何做到这一点的想法,例如用户输入A4,所以输入是正确的。那么我如何实际移动我的7,7场并检查A4?我不明白这一点,我的朋友在我的多维领域告诉了我一些关于第二个索引器的东西,但我不知道。

+0

好了,你写的代码来创建雷区,地雷填充它,并在屏幕上打印结果。接下来你要做的就是读入用户输入('Console.ReadLine')。您可能需要一个函数来查找所选单元格的邻居,并且您需要记住哪些单元格已被发现。我们不会为你编写这些代码,但是给它一个镜头,如果遇到任何*特定的问题,那么回到这里告诉我们出了什么问题。 –

+0

您的索引想法将起作用,绝对将一封信映射到索引。这将使您的查找更容易。至于在炸弹附近搜索,你将需要扫描阵列的相邻单元格。最佳方法是从选定的单元格开始,并开始在各个方向上扫描。您可以使用OOP通过创建节点来解决此问题(图形式解决方案)。如果每个节点知道它的相邻节点,那么递归地找到所有相邻的炸弹是很容易的。 – Tom

回答

0

如何使用字典而不是使用数组?

  Dictionary<string, bool> p = new Dictionary<string, bool>(); 
      if (p.ContainsKey("a1")) 
      { 
       //do something 
      } 
      else { } // not a bomb/mine 

所以你可以很容易地检查它是否是炸弹。

+0

不能使用它。 –

0

如果要将用户输入(例如B4)转换为行和列,可以使用下面的简单方法。由于您已经有一个列名称集合stolpci,因此您可以使用string.IndexOf,它将查找字符串中某个字符的位置。例如,B代替2-发现(利用基于0的索引)


" ABCDEFG" 

由于你想B映射到列号1,而不是2扫雷阵列中,则需要减去一个。

就号码部分而言,您可以使用int.Parse来读取号码。再一次,该数字将会偏离1,因为行号4实际上对应于扫雷阵列基于0的索引中的行号3。所以你的最终结果可能是这样的:

var input = "B4"; // this would come from the user, hard-coding for example 
var column = stolpci.IndexOf(entry.Substring(0, 1)); // 2 
var row = int.Parse(entry.Substring(1, 1)); // 4 
var isBomb = polje[row - 1, col - 1] == 1; // offset by 1 for 0-based indexing 
// do something with this 
1

只是将用户输入转换为基于0的坐标,您可以使用它。

static int[] GetInput() 
{ 
    string input = Console.ReadLine(); 
    //validate input here.. 
    int x = input[0] - 'A'; //converts char to int 
    int y = int.Parse(input.Substring(1)) - 1; 
    return new int[]{ x, y }; 
} 

你可以这样做使用此方法...

var selected = GetInput(); 
if(polje[selected[0]][selected[1]] == 1) 
{ 
    //its a bomb 
} 
+0

但是,这将与我的领域工作? –

+0

是的。我将展示如何打电话。 – fqhv