サイコロクラスを実装してみた
まだ動作は未確認、動くかな?
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;
}