1

私は単純なゲームを作成しています。プレイヤーのロードアウトを表示し、プレイヤーが持っているアイテムの可能な組み合わせをすべて表示したかったのです。プレーヤーには、それぞれの列挙型 (PlayerSlotPosition) を持つ 3 つのスロットがあります。Item 列挙には複数の値がありますが、それぞれが特定の PlayerSlotPosition にある必要があります。

例:

STICK(PlayerSlotPosition.SLOT_ONE),
STONE(PlayerSlotPosition.SLOT_ONE),
EGG(PlayerSlotPosition.SLOT_TWO),
SHOVEL(PlayerSlotPosition.SLOT_TWO),
PAPER(PlayerSlotPosition.SLOT_THREE),
DIRT(PlayerSlotPosition.SLOT_THREE);

プレーヤーがどのスロット (または複数のスロット) にもアイテムを装備していない可能性を含める必要がありますが、ここで立ち往生しています。誰かがこのようなことをした経験があり、喜んで私を助けてくれるなら、私はとても感謝しています. 読んでくれてありがとう

4

3 に答える 3

0

ここでの鍵はI wanted to make a display for the player's load out, and wanted to show every possible combination of items that they have. これにより、在庫にあるアイテムの可能な組み合わせを印刷するだけで済むため、複雑さが大幅に軽減されます。

public class EnumCombinations {

//Commenting out more than 4 items, loooong printout otherwise
public static enum ITEM{
    STICK(PlayerSlotPosition.SLOT_ONE),
    STONE(PlayerSlotPosition.SLOT_ONE),
    EGG(PlayerSlotPosition.SLOT_TWO),
    SHOVEL(PlayerSlotPosition.SLOT_TWO);
//      PAPER(PlayerSlotPosition.SLOT_THREE),
//      DIRT(PlayerSlotPosition.SLOT_THREE);
    //      DIRT(PlayerSlotPosition.SLOT_THREE);

    private ITEM(PlayerSlotPosition pos){

    }
}

public static enum PlayerSlotPosition{
    SLOT_THREE, SLOT_ONE, SLOT_TWO

}

public static List<List<ITEM>> getItemCombinations(List<ITEM> inventory){
    List<ITEM> prefix = new ArrayList<>();
    List<List<ITEM>> container = new ArrayList<>();
    List<ITEM> remainder; 

    if(inventory==null){
        System.out.println("Printing all item combinations, no inventory");
        remainder =  new ArrayList<>(Arrays.asList(ITEM.values()));
    }

    else {
        remainder = new ArrayList<>(inventory);
    }
    getItemCombinations(prefix, remainder, container);
    return container;
}

private static void getItemCombinations(List<ITEM> prefix, List<ITEM> remainder, List<List<ITEM>> container){
    int n=remainder.size();

    if(remainder.isEmpty()){
        container.add(prefix);
    }

    else {
        for(int i=0; i<n; i++) {
            List<ITEM> r = new ArrayList<>();
            List<ITEM> p = new ArrayList<>(prefix);
            p.add(remainder.get(i));
            for(int j=0; j<remainder.size(); j++){
                if(j==i)
                    continue;
                r.add(remainder.get(j));
            }
            getItemCombinations(p, r, container);
        }
    }
}

public static void main (String[] args) {
    System.out.println(getItemCombinations(null)+"\n");

    List<ITEM> playerINV = new ArrayList<>();
    playerINV.add(ITEM.STICK);
    playerINV.add(ITEM.STONE);
    playerINV.add(ITEM.EGG);
    System.out.println(getItemCombinations(playerINV));

}
}

出力:

Printing all item combinations, no inventory
[[STICK, STONE, EGG, SHOVEL], [STICK, STONE, SHOVEL, EGG], [STICK, EGG, STONE, SHOVEL], [STICK, EGG, SHOVEL, STONE], [STICK, SHOVEL, STONE, EGG], [STICK, SHOVEL, EGG, STONE], [STONE, STICK, EGG, SHOVEL], [STONE, STICK, SHOVEL, EGG], [STONE, EGG, STICK, SHOVEL], [STONE, EGG, SHOVEL, STICK], [STONE, SHOVEL, STICK, EGG], [STONE, SHOVEL, EGG, STICK], [EGG, STICK, STONE, SHOVEL], [EGG, STICK, SHOVEL, STONE], [EGG, STONE, STICK, SHOVEL], [EGG, STONE, SHOVEL, STICK], [EGG, SHOVEL, STICK, STONE], [EGG, SHOVEL, STONE, STICK], [SHOVEL, STICK, STONE, EGG], [SHOVEL, STICK, EGG, STONE], [SHOVEL, STONE, STICK, EGG], [SHOVEL, STONE, EGG, STICK], [SHOVEL, EGG, STICK, STONE], [SHOVEL, EGG, STONE, STICK]]
Printing inventory: 
[[STICK, STONE, EGG], [STICK, EGG, STONE], [STONE, STICK, EGG], [STONE, EGG, STICK], [EGG, STICK, STONE], [EGG, STONE, STICK]]

あなたの質問で何か見逃した場合はコメントしてください。これは興味深い問題でした。

于 2013-06-07T12:09:47.297 に答える
0

パワーセットをチェックしてください。それがあなたが探しているものだと思います

http://en.wikipedia.org/wiki/Power_set

(作業パワーセット) Java でセットのパワーセットを取得する

于 2013-06-07T13:02:18.277 に答える
-1

問題を完全に理解しているかどうかはわかりません。私の推測では、あなたは実際にはオブジェクト指向のアプローチを使用していないため、Java に行き詰っています。

したがって、私の提案は、オブジェクトを別の方法でモデル化することです。例えば:

特定のスロット (例: SlotOneItem, SlotTwoItem) に入るアイテムのインターフェイスを作成し、アイテムをそのインターフェイスの実装にします。

public class Stick implements SlotOneItem {
    ...
}

スロットについては、適切なインターフェイスを使用して、そのスロットに格納できるアイテムを処理できます。例えば:

public class SlotOne {
   public void setItem(SlotOneItem item) {
      ...
   }

   public SlotOneItem getItem() {
      ...
   }    
}

あなたのゲームでは、両方のアイテムのインスタンスがあり、すべてのスロットの 1 つを推測し、そのスロットに収まるアイテムで満たすか、空にすることができます (含むnull)

于 2013-06-07T12:05:37.093 に答える