2016-04-15 11 views
-2

私はいくつかの小さなことに取り組んでいます。これは私がこれまで持っていたものです。マインスイーパ(シンプル)in 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(); 
    } 
} 

だから、これはあるん何か、それは今1が、それは私のものであることを意味する0から1までの乱数が含まれている7×7のフィールドを出力し、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を確認するにはどうしたらいいですか?私はこれを理解していない、私の友人は私の多次元分野の2番目のインデクサーについて教えてくれたが、私はヒントはない。

+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はあなたがBは掃海配列内の列番号1、ではなく2にマップしたいと思うので


" ABCDEFG" 

(0ベースのインデックスを使用して)場所2で発見され、あなたは1を減算する必要があります。

数字の部分がある限り、int.Parseを使用して番号を読み取ることができます。再び、行番号4は実際には地雷探査配列の0ベースの索引付けで行番号3に対応するため、数値は1になります。したがって、最終結果は次のようになります。

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