ホーム > libalgo

サイコロ

概要

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;
    }
};