【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」とか思いながら挑んだものの、よくよく考えたらサイコロの動きってどうやって再現するんだ・・・?と何分も悩んでしまう悲しき事態に…。
頑張って考えたのでここで供養する。
この記事が気に入ったらサポートをしてみませんか?