LoginSignup
1
1

More than 5 years have passed since last update.

サイコロクラス

Last updated at Posted at 2013-08-19

サイコロクラスを実装してみた
まだ動作は未確認、動くかな?

class srd::ostream;辺りが怪しい・・・

後出来ればmEngineをrandom_deviceで初期化したいんだけどいい案は無いか・・・
出来ればイニシャライズリストでやりたいなーなんて

追記 初期化できたのでそのように修正

ヘッダー

Dice.h
#ifndef _DICE_H_
#define _DICE_H_

#include <random>
#include <vector>

namespace std{
    template<typename _Ty>
    class  basic_ostream<_Ty>;
}

class Dice{
public:
    typedef typename std::vector<int> rollData_t;
    Dice();
    Dice(int num,int surface);
    virtual ~Dice(){}

    int roll();
    int roll(std::ostream& ost);
    int roll(int num,int surface);
    rollData_t getRollData()const;
    void setDice(int num,int surface);
private:
    int generate();
private:
    std::mt19937 mEngine;
    std::uniform_int_distribution<int> mDistribution;
    rollData_t mData;
};
#endif

cppファイル

Dice.cpp
#include "Dice.h"

#include <algorithm>

Dice::Dice():
    mEngine(std::random_device()),
    mDistribution(1,6),
    mData(1)
{}


Dice::Dice(int num,int surface):
    mEngine(std::random_device()),
    mDistribution(1,surface),
    mData(num)
{}


int Dice::generate(){
    return mDistribution(mEngine);
}

int Dice::roll(){
    std::for_each(mData.begin(),mData.end(),[&](int& elem){ return elem = generate();});
    int sum=0;
    std::for_each(mData.begin(),mData.end(),[&](const int elem){return sum+=elem;});
    return sum;
}

int Dice::roll(std::ostream& ost){
    int res = roll();
    std::for_each(
        mData.begin(),
        mData.end(),
        [&](int elem){ost<<"["<<elem<<"]";});
    return res;
}
int Dice::roll(int num,int surface){
    int result = 0;
    std::uniform_int_distribution<int> dist(1,surface);
    for(int i=0;i<num;i++)
        result+=dist(engine);
    return result;
}


void Dice::setDice(int num,int surface){
    mDistribution = std::uniform_int_distribution<int>(1,surface);
    mData = rollData_t(num);
}


Dice::rollData_t Dice::getRollData()const{
    return mData;
}


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1