2016-04-15 58 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