1

タイトルがあまり意味がなかったらすみません。プレーヤー、コイン、プッシュ可能なブロックなどの特別なものがクラスである Java Eclipse で、Chip's Challenge スタイルのゲームを作成しています。プッシュ可能ブロックとプレーヤーの間の相互作用には多くの衝突検出ロジックが必要であり、クラスのインスタンスごとに同じロジック チェックを実行する必要があるため、コードはひどくなっています。例えば:

public void pb1TouchingBaddy() {

    if (pb1.getTileX() == b1.getTileX() & pb1.getTileY() == b1.getTileY()) {
        if (b1.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b1.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b1.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b1.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b2.getTileX() & pb1.getTileY() == b2.getTileY()) {
        if (b2.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b2.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b2.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b2.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b3.getTileX() & pb1.getTileY() == b3.getTileY()) {
        if (b3.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b3.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b3.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b3.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b4.getTileX() & pb1.getTileY() == b4.getTileY()) {
        if (b4.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b4.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b4.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b4.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

ご覧のとおり、if ステートメントの 3 つのブロックはすべてまったく同じロジックであり、同じオブジェクトの異なるインスタンスに適用されているだけです。何度も繰り返さずにこれを書く方法はありますか?4 方向の移動ロジックを 1 つのメソッドに変えることができて、しばらくの間、自分は天才だと思っていましたが、同じオブジェクトの複数のインスタンスを使用して同様のことを行う方法がわかりません。現在、混乱して別のブロックのロジックを実行できなくなる前に、プッシュ可能なブロックを 2 つしか使用できません。アドバイスをいただければ幸いです、ありがとう!

4

3 に答える 3

2

ある種のIterableコレクションが必要になります。そうすれば、それをループすることができます。

于 2012-10-22T21:59:36.443 に答える
2

これらのメソッドをインターフェイスに配置し、すべてにそのインターフェイスを実装させます。

実際の具象型が何であるかを気にせずに、メソッドがそのインターフェースのみに関心を持つようにします。

于 2012-10-22T21:53:29.667 に答える
2
private function move(PBClass pb1, PBClass pb2, BClass b) {
    if (pb1.getTileX() == b.getTileX() & pb1.getTileY() == b.getTileY()) {
        if (b.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }
}

public void pb1TouchingBaddy() {
    move(pb1, pb2, b1);
    move(pb1, pb2, b2);
    move(pb1, pb2, b3);
    move(pb1, pb2, b4);
}

PBClassもちろん、 andBClassを実際のクラス名に置き換える必要があります。

オブジェクトの配列がある場合:

PBClass[] listPB = { pb1, pb2, pb3, pb4};
BClass[] listB = { b1, b2, b3, b4};

public void pb1TouchingBaddy() {
    for (int i=0; i < listPB.length - 1; i+=2) {
        for (int j=0; j < listB.length; j++) {
            move(pb[i], pb[i+1], b[j]);
        }
    }
}

ArrayListまたは、同じ方法で s を使用できます

于 2012-10-22T21:55:56.453 に答える