サイコロ
概要
6 面サイコロ構造体.
使い方
呼び出し方 | 引数・戻り値など |
---|---|
dice d() |
構築 |
d[f] |
f の面にある目 |
d.find_face(e) |
目 e がどの面にあるか求める |
d.turn(dir) |
dir 方向に回転する.dir は enum に含まれるもの以外受け付けない |
d.all_rolls() |
等価な全ての向き (6面×4方向の回転) のサイコロを生成する |
実装
/*
. . U .
B L F R
. . D .
*/
enum { U, B, L, F, R, D };
struct dice {
int face[6];
dice() {
face[F] = 1;
face[R] = 2;
face[U] = 3;
face[B] = 6;
face[L] = 5;
face[D] = 4;
}
int find_face(int f) {
rep(i, 6) if (face[i] == f) return i;
return -1;
}
void turn(int dir) {
switch (dir) {
case R:
rotate(U, R, D, L);
break;
case B:
rotate(U, B, D, F);
break;
case L:
rotate(U, L, D, R);
break;
case F:
rotate(U, F, D, B);
break;
case U:
rotate(F, R, B, L);
break; // 上から見て反時計回り
case D:
rotate(F, L, B, R);
break; // 下から見て反時計回り
default:
assert(false);
}
}
int& operator[](int n) { return face[n]; }
const int& operator[](int n) const { return face[n]; }
std::vector<dice> all_rolls() {
std::vector<dice> res;
rep(k, 6) {
rep(i, 4) {
res.push_back(*this);
turn(R);
}
turn(k % 2 == 1 ? U : F);
}
return res;
}
void rotate(int a, int b, int c, int d) {
int t = face[d];
face[d] = face[c];
face[c] = face[b];
face[b] = face[a];
face[a] = t;
}
};