【Java】6面ダイス(サイコロ)を指定数回転させたら、上面にある数字はなにか?を再現するアルゴリズム

〇ダイス(サイコロ)のイメージ画像

パワポで雑に作ったサイコロの形や面の配置の参考画像

ダイス立体

画像1:立方体としてのダイスと面の配置イメージ

ダイス展開図

画像2:展開図としてのダイスと面の配置イメージ

ダイス移動


画像3:1の面を上から見た時の、上下左右の回転方向

Up,Down,Left,Rightのメソッドに応じて、上下左右の方向にダイスを90度回転させる。
回転させた結果として、イメージ図の番号の面にはどの数字があるのかを再現する。

〇ソースコード

/**
* サイコロを再現したダイスクラス
* up,down,left,rightに応じて、上下左右に面を回転できる。
* 面の数字を表現するint配列のsurfaces[0]は値避難用のtmp変数として利用する
* surfaces[1]から[6]まではそれぞれ、サイコロの1~6の面に対応する。
* 初期状態では1が上面を向いているものとする。
*
* 面の並び(よくある展開図風)
*   5
* 4 1 3 6
*   2
*/
public class Dice {

	/*
	 * フィールド
	 */
	private int[] surfaces = {0, 1, 2, 3, 4, 5, 6};


	/*
	 * メソッド
	 */
	public Dice() {
		//何もしない
	}//const

	public Dice(int[] surfaces) throws IndexOutOfBoundsException{
		//配列の長さが想定外
		if(surfaces.length != 7) throw new IndexOutOfBoundsException();

		this.surfaces = surfaces;
	}//const


	public void up() {
		//避難
		surfaces[0] = surfaces[1];

		//入れ替え
		surfaces[1] = surfaces[2];
		surfaces[2] = surfaces[6];
		surfaces[6] = surfaces[5];
		surfaces[5] = surfaces[0];
	}//method

	public void down() {
		//避難
		surfaces[0] = surfaces[1];

		//入れ替え
		surfaces[1] = surfaces[5];
		surfaces[5] = surfaces[6];
		surfaces[6] = surfaces[2];
		surfaces[2] = surfaces[0];
	}//method

	public void left() {
		//避難
		surfaces[0] = surfaces[1];

		//入れ替え
		surfaces[1] = surfaces[3];
		surfaces[3] = surfaces[6];
		surfaces[6] = surfaces[4];
		surfaces[4] = surfaces[0];
	}//method

	public void right() {
		//避難
		surfaces[0] = surfaces[1];

		//入れ替え
		surfaces[1] = surfaces[4];
		surfaces[4] = surfaces[6];
		surfaces[6] = surfaces[3];
		surfaces[3] = surfaces[0];
	}//method


	/*
	 * ゲッター
	 */
	public int getSurfaceNum(int num) {
		return surfaces[num];
	}
}//class

〇使い方

1.インスタンスを生成する。
2.生成時に各面に好きな数字を指定するか、無指定で1~6の面の数字が1~6の標準的なダイスかを選ぶ。
3.up, down, left, rightメソッドを好きな回数実行し、回転させる。
4.getSurfaceNumメソッドを利用して、1~6の好きな面の数字を取得する

〇なぜ作ったのか…?

プログラミングの問題を出してくれるサイトで遊んでいたところ、「サイコロを転がす問題なんか楽勝楽勝ーw」とか思いながら挑んだものの、よくよく考えたらサイコロの動きってどうやって再現するんだ・・・?と何分も悩んでしまう悲しき事態に…。
頑張って考えたのでここで供養する。

この記事が気に入ったらサポートをしてみませんか?