1

このコードを書くための、より洗練された/より短い/組織的な方法はありますか?

for (int i = 0; i < SCREENSIZE; i++) {
        for (int j = 0; j < SCREENSIZE; j++) {
            if (map[y + i][x + j] == '@')
                g.drawImage(item, j * TILESIZE,i * TILESIZE, null);
            else if (map[y + i][x + j] == ' ')
                g.drawImage(ground, j * TILESIZE,i * TILESIZE, null);
            else if (map[y + i][x + j] == 'i')
                g.drawImage(bush, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '~')
                g.drawImage(ocean, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '=')
                g.drawImage(fence, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '#')
                g.drawImage(grass, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'Y')
                g.drawImage(townsPerson, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '/')
                g.drawImage(house01, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '¯')
                g.drawImage(house02, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '\\')
                g.drawImage(house03, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '[')
                g.drawImage(house04, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'n')
                g.drawImage(house05, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '_')
                g.drawImage(house06, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == ']')
                g.drawImage(house07, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '`')
                g.drawImage(cground, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'O')
                g.drawImage(boulder, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'Ÿ')
                g.drawImage(alien, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '.')
                g.drawImage(tree01, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'T')
                g.drawImage(tree02, j * TILESIZE, i * TILESIZE, null);
        }
    }
4

5 に答える 5

5

最初の改善点は、スイッチ/ケース構造を使用することですが、あなたの場合、単純なマップ(Map<Char,Image>)がさらに優れています。

さらに進んで、オブジェクトを識別するために文字の代わりに列挙型を使用することができます。これはタイプミスを回避するのに役立ちますが、少なくとも、次のような文字定数を使用する必要があります。

public static final char MAP_ITEM = '@';
public static final char MAP_GROUND = ' ';

等々。

于 2011-03-08T21:26:26.517 に答える
1

どこか (コンストラクター内?) で、Mapa をメンバー変数として保存します。

images = new HashMap<Character, Image>();
images.put('@', item);
images.put(' ', ground);

次に、図面は次のようになります。

for (int i = 0; i < SCREENSIZE; i++) {
    for (int j = 0; j < SCREENSIZE; j++) {
        g.drawImage(images.get(map[y+i][x+j]), j * TILESIZE, i * TILESIZE, null)
    }
}
于 2011-03-08T21:30:33.967 に答える
0

より明確になるように、char値でスイッチを使用できます。また、2 番目、3 番目、4 番目のパラメーターは常に同じなので、スイッチに var を設定して、メソッドを外部で呼び出すことができます。ちょっとした疑似コード:

for() {
  for() {
     Image obj;
     switch (map[y+i][x +j]) {
       case '@':
         Obj = item;
         break;
     // other cases
       default:
       //default or error handling
   }
   g.drawImage(obj, j * TILESIZE, i * TILESIZE, null);
 }
}
于 2011-03-08T21:36:38.670 に答える
0

switchキャラクターをベースにしているので、ステートメントを使用できます。他にできることは、g.drawImage(SOMETHING, j * TILESIZE, i * TILESIZE, null)すべての場合に使用しているため、スイッチの後に同じものをすべて抽出し、変数を割り当てて、それを変更に使用することです。

元:

Object graphic;
switch (map[y + i][x + j]) {
case '@': 
    graphic = item;
    break;
case '#':
    graphic = grass;
    break;
// etc....
}
g.drawImage(graphic, j * TILESIZE, i * TILESIZE, null);
于 2011-03-08T21:31:07.713 に答える
0

スイッチ/ケース(マップではなく)を使用します。これは、コンパイラーがオンに切り替えている char 値の正確なセットを知っているため、最適化する余地が増えるためです。

...
switch(map[y+i][x+j]) {
    case: '@': image = item; break;
    case: ' ': image = ground; break;
    ...
}
g.drawImage(image, j * TILESIZE, i * TILESIZE, null);
...
于 2011-03-08T21:32:32.523 に答える