0

私はパズル ゲームを作成しており、8 個のピース​​を 3x3 グリッドにランダムに配置していますが、すべての画像が HashMap に追加されているわけではありません。誰かが理由を見ますか?

パズルを整理するために使用するコードは次のとおりです。

private HashMap<BufferedImage, Point> puzzle = new HashMap<>();
public void arrangePieces() {
    Random random = new Random();
    List<BufferedImage> rImages = new ArrayList<>();
    rImages.addAll(Arrays.asList(
                       Assets.a2, Assets.a3,
            Assets.a4, Assets.a5, Assets.a6,
            Assets.a7, Assets.a8, Assets.a9
    ));

    for(int y = 1; y <= 3; y++) {
        for(int x = 1; x <= 3; x++) {
            if(y != 1 || x != 1) {
                BufferedImage image = rImages.get(random.nextInt(rImages.size()));
                puzzle.put(image, new Point(x, y));
                System.out.println("Loading new Image at " + new Point(x, y));
                rImages.remove(image);
            }
        }
    }
    System.out.println(puzzle.size());
}

これは、ロード時にコンソールに出力されるものです。

Loading new Image at java.awt.Point[x=2,y=1]
Loading new Image at java.awt.Point[x=3,y=1]
Loading new Image at java.awt.Point[x=1,y=2]
Loading new Image at java.awt.Point[x=2,y=2]
Loading new Image at java.awt.Point[x=3,y=2]
Loading new Image at java.awt.Point[x=1,y=3]
Loading new Image at java.awt.Point[x=2,y=3]
Loading new Image at java.awt.Point[x=3,y=3]
1

puzzle.size()8 ポイントがリストされているため、ランダムな BufferedImage を使用して 8 ポイントが追加されpuzzle、その後削除されるため、8 を返さない理由がわかりません。同じ画像を 2 回選択することはありません。

編集:私はこれを解決しました。アセットが正しく読み込まれませんでした。お時間を無駄にして申し訳ありません。

4

1 に答える 1

0
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

public class Snippet {
    public static void main(String[] args) {
        arrangePieces();
    }
    private static HashMap<BufferedImage, Point> puzzle = new HashMap<>();
    public static void arrangePieces() {
        Random random = new Random();
        List<BufferedImage> rImages = new ArrayList<>();
        rImages.addAll(Arrays.asList(
                           Assets.a2, Assets.a3,
                Assets.a4, Assets.a5, Assets.a6,
                Assets.a7, Assets.a8, Assets.a9
        ));

            System.out.println(rImages.size());// try this and see what you get as response here
        for(int y = 1; y <= 3; y++) {
            for(int x = 1; x <= 3; x++) {
                if(y != 1 || x != 1) {
                    BufferedImage image = rImages.get(random.nextInt(rImages.size()));
                    puzzle.put(image, new Point(x, y));
                    System.out.println("Loading new Image at " + new Point(x, y));
                    rImages.remove(image);
                }
            }
        }
        System.out.println(puzzle.size());
    }

}
class Assets {

    public static BufferedImage a8 = new BufferedImage(1,1, 1);
    public static BufferedImage a7= new BufferedImage(1,1, 1);
    public static BufferedImage a4= new BufferedImage(1,1, 1);
    public static BufferedImage a5= new BufferedImage(1,1, 1);
    public static BufferedImage a9= new BufferedImage(1,1, 1);
    public static BufferedImage a6= new BufferedImage(1,1, 1);;
    public static BufferedImage a3= new BufferedImage(1,1, 1);
    public static BufferedImage a2= new BufferedImage(1,1, 1);


}

だから私はこれを実行すると、これを出力として取得します

java.awt.Point[x=2,y=1]
に新しいイメージをロード中 java.awt.Point[x=3,y=1]
に新しいイメージをロード中 java.awt.Point[x=1, y=2]
java.awt.Point[x=2,y=2]
で新しい画像を読み込み中 java.awt.Point[x=3,y=2] で
新しい画像を読み込み中 java.awt.Point[x=3,y=2] で新しい画像を読み込み中x=1,y=3]
java.awt.Point[x=2,y=3]
で新しいイメージをロード中 java.awt.Point[x=3,y=3] で新しいイメージをロード中
8

これは、Assets クラス オブジェクトを構築する方法に問題があることを意味します。

静的に定義すると、null に初期化され、サイズが 1 になります。これは、コードに追加したコメント SOP で簡単に確認できます。

于 2016-09-24T21:26:47.170 に答える