質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

1567閲覧

java fx パズルゲームでのシャッフル機能

KosukeDayo_

総合スコア5

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/04/21 10:13

前提・実現したいこと

javafxを使ってパズルゲームを作成しています。
開始ボタンを押すと4x4の16枚のパズルがランダムな配置につくようプログラミングしたいのですが、いくつか同じx,y座標に位置するようになってしまいます。
resultX,resultYに与えられる座標の数値がいくつか同じものが出てしまうため同じ座標に位置してしまうのだと思われます。
一度使った座標(例えばxは20,yは270に一度配置されたらそこには配置されないような仕組みを作る)に配置しなくなるようにはどうしたらいいでしょうか?

発生している問題・エラーメッセージ

パズルをシャッフルする際に同じ座標に位置するものが出てしまう

該当のソースコード

Button buttons[] = { this.button1, this.button2, this.button3, this.button4,
this.button5, this.button6, this.button7, this.button8,
this.button9, this.button10, this.button11, this.button12,
this.button13, this.button14, this.button15, this.button16 };

for (int i = 0; i < buttons.length; i++) { List<Integer> listX = Arrays.asList(20, 80, 140, 200); List<Integer> listY = Arrays.asList(270, 330, 390, 450); int indexX = new Random().nextInt(listX.size()); Integer resultX = listX.get(indexX); int indexY = new Random().nextInt(listY.size()); Integer resultY = listY.get(indexY); buttons[i].setLayoutX(resultX); buttons[i].setLayoutY(resultY); }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

シャッフル機能。やりたいことそのもの名前のメソッドがあります。Collections#shuffle()

例は、Buttonの配列ではありませんが、やることは一緒です。

java

1import java.security.SecureRandom; 2import java.util.Arrays; 3import java.util.Collections; 4public class xxHoge { 5 @Test 6 public void bbb() { 7 final String[] buttons = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"}; 8 System.out.println(Arrays.toString(buttons)); 9 System.out.println("shuffle"); 10 Collections.shuffle(Arrays.asList(buttons), new SecureRandom()); 11 System.out.println(Arrays.toString(buttons)); 12 } 13} 14// [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] 15// shuffle 16// [o, e, d, p, m, b, k, g, l, j, c, f, n, i, a, h]

質問の意図を読み違えていました。追記します。

上記を使い、こんな感じではどうでしょうか。

java

1import javafx.geometry.Point2D; 2... 3 @Test 4 public void ccc() { 5 final Button[] buttons = new Button[]{...}; 6 7 final List<Integer> listX = Arrays.asList(20, 80, 140, 200); 8 final List<Integer> listY = Arrays.asList(270, 330, 390, 450); 9 10 final List<Point2D> points = 11 listX.stream().flatMap(x -> 12 listY.stream().map(y -> new Point2D(x, y)) 13 ).collect(Collectors.toList()); 14 15 Collections.shuffle(points, new SecureRandom()); 16 17 for (int index = 0; index < buttons.length; index++) { 18 buttons[index].setLayoutX(points.get(index).getX()); 19 buttons[index].setLayoutY(points.get(index).getY()); 20 } 21 }

KosukeDayo_
2020/04/21 23:45
final List<Point2D> points = から Collections.shuffle(points, new SecureRandom()); までで行っている動作の説明をしていただいてもよろしいでしょうか・・・?初学者のため、申し訳ありません。

java

1 final List<Point2D> points = new ArrayList<>(); 2 for (int x : listX) { 3 for (int y : listY) { 4 points.add(new Point2D(x, y)); 5 } 6 } 7 8// final List<Point2D> points = 9// listX.stream().flatMap(x -> 10// listY.stream().map(y -> new Point2D(x, y)) 11// ).collect(Collectors.toList());

投稿2020/04/21 13:23

編集2020/04/21 21:59
shiketa

総合スコア4041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KosukeDayo_

2020/04/21 13:33

回答ありがとうございます このメソッドを使えばランダムな値を重複なく代入できるというのは分かったのですが、これをどう活用したらよいかが思いつきません……… 良い案はありますでしょうか?
shiketa

2020/04/21 14:12 編集

x位置とy位置を組合せてから、shuffleする。追記しました。
KosukeDayo_

2020/04/21 14:45

final List<Point2D> points = から Collections.shuffle(points, new SecureRandom()); までで行っている動作の説明をしていただいてもよろしいでしょうか・・・?初学者のため、申し訳ありません。
guest

0

すいません、取り下げます。
これでは明らかにシャッフルとは言えませんね。。。

投稿2020/04/22 01:24

編集2020/04/22 07:19
TN8001

総合スコア9813

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ボタンに映像が付いているのであれば、
ボタンのシャッフルをした後、その並びで座標を割り当てればいいのでは?

java

1 2List<Button> buttons = Arrays.asList( this.button1, this.button2, this.button3, this.button4, 3this.button5, this.button6, this.button7, this.button8, 4this.button9, this.button10, this.button11, this.button12, 5this.button13, this.button14, this.button15, this.button16 ); 6Collections.shuffle(buttons); 7 8List<Integer> listX = Arrays.asList(20, 80, 140, 200); 9List<Integer> listY = Arrays.asList(270, 330, 390, 450); 10 11for (int i = 0; i < 4; i++) { 12 int x = listX.get(i); 13 for (int j = 0; j < 4; j++) { 14 Button target = buttons.get(i * 4 + j); 15 target.setLayoutX(resultX); 16 target.setLayoutY(resultY); 17 } 18 19}

投稿2020/04/22 00:56

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問