2017-05-31 13 views
-1

あなたは「KMines」というコンピュータのゲームを知っている人が多く、Android Studioで携帯電話用のアプリケーションを作成します。 ゲームはうまくいきますが、選択したボックスの周囲にどれくらいの爆弾があるかを数えるコントロールが非常に多く、遅れているためです。 MY MAP 私は助けが必要です。ボックスに爆弾が入っていなければ、私のコントロールです。私はそれらを減らす方法を探しています。"KMines"ゲームで爆弾の数を数えるコントロールを減らす

if(mat_prato[y][x] == 0){ 

         if(y == 0 && x == 0){   //The four corners of the map 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x + 1] == 9) 
           c = c + 1; 
         } else if(y == 0 && x == 9){ 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x- 1] == 9) 
           c = c + 1; 
         } else if(y == 9 && x == 9){ 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x- 1] == 9) 
           c = c + 1; 
         } else if(y == 9 && x == 0){ 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x+ 1] == 9) 
           c = c + 1; 
         } else if(y == 0 && 0 < x && x < 9){  // The sides of the map 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
         } else if(y == 9 && 0 < x && x < 9){ 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
         } else if(x == 0 && 0 < y && y < 9){ 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
         } else if(x == 9 && 0 < y && y < 9){ 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
         } else if(0 < x && x < 9 && 0 < y && y < 9){  // The other cell in the center 
          if(mat_prato[y - 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y - 1][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y][x + 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x - 1] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x] == 9) 
           c = c + 1; 
          if(mat_prato[y + 1][x + 1] == 9) 
           c = c + 1; 
         } 

         if(c == 0){ 
          mat_prato[y][x] = 10; 
          mThumb[position] = R.drawable.empty; 
         } else if(c == 1){ 
          mat_prato[y][x] = 1; 
          mThumb[position] = R.drawable.one; 
         } else if(c == 2){ 
          mat_prato[y][x] = 2; 
          mThumb[position] = R.drawable.two; 
         } else if(c == 3){ 
          mat_prato[y][x] = 3; 
          mThumb[position] = R.drawable.three; 
         } else if(c == 4){ 
          mat_prato[y][x] = 4; 
          mThumb[position] = R.drawable.four; 
         } else if(c == 5){ 
          mat_prato[y][x] = 5; 
          mThumb[position] = R.drawable.five; 
         } else if(c == 6){ 
          mat_prato[y][x] = 6; 
          mThumb[position] = R.drawable.six; 
         } else if(c == 7){ 
          mat_prato[y][x] = 7; 
          mThumb[position] = R.drawable.seven; 
         } else if(c == 8){ 
          mat_prato[y][x] = 8; 
          mThumb[position] = R.drawable.eight; 
         } 
        } 
+0

forループを使用します。また、コードを確実に(ループを使用して)クリーンアップすることができますが、ループにはほぼ同じ時間がかかります。したがって、これは遅い原因ではありません。 – tucuxi

+0

どのように? exp37解決を –

答えて

1

巨大なif文ではなく、セルの近傍を反復処理するループを使用する必要があります。ループは高速ではないかもしれませんが、プログラマーはこの問題のために他のものを使用することはありません。

私たちはあなたがこの方法で定義されていると仮定しましょう:

// returns true only if bomb at x,y; and false for "outside" or "no bomb" 
private boolean isBomb(int x, int y) 

今、あなたはそれを使用しています。この他の方法で定義することができます。

private int countBombsAround(int x, int y) { 
    int deltas[][] = { 
     {-1, -1}, {-1, 0}, {-1, 1}, 
     { 0, -1}, /*skip*/ { 0, 1}, 
     { 1, -1}, { 1, 0}, { 1, 1}}; 
    int bombs = 0; 
    for (int delta[] : deltas) { 
     if (isBomb(x+delta[1], y+delta[0]) bombs ++; 
    } 
    return bombs; 
} 

をそして、この方法は、すべての有効な(とさえ無効のために働きます!)ゲーム中のx、yの位置。また、はるかに短く、テストすることで動作することが分かったら、再度変更する必要はありません。 Win-win !.

上記のコードは中央の四角では表示されません。最初にisBombで確認してください。また、同様のループを書く多くの方法があります。重要な点は、あなたがプログラムで何度も何度も同じようなことを書いていることが分かった場合、にはより良い方法があるということです

+0

ありがとう、この夜私はdoscrivoにそれを試みる –

関連する問題