Edited at

C++でTRPGに使うダイスクラスを作ってみた。

More than 5 years have passed since last update.


概要

参考:http://www.youtube.com/watch?v=8eU4TDicf38

書きかけだけど、上記の動画を参考にサイコロクラスを作ってみた。

TRPG風ゲームで使えるようにnDnでロールできるようにしたい。

C++を本格的に勉強して日が浅いので、他にも良い書き方があると…思う。

あと、変数名・関数名の命名記法多分おかしいので書き直し予定。

というか、今後も更新していく予定。

ひとまず、Xcodeでは動作確認済み。

追記

とりあえず、nDnでロールできるように。あと、いらないメソッドとか削除。


ソース置き場所

https://github.com/syo-sa1982/Dice


今後追加したい機能とかやりたい事

複数回ダイスロール用のメソッド実装

⇒振る回数とダイスの面数をしていしてロール

ダイスロール合計値の内訳取得メソッド

⇒vector使って動的配列に持たせるイメージ

ダイスとしてありえない面数を指定された場合のエラー処理

⇒ここのロジックはまだ考えてない。

追記

上記2つは実装して、エラー処理は必要ないと判断。

さらに追記というか、指摘された内容のメモ(箇条書き)


  • getRollHistoryの戻り値はconst参照にしたい

  • クラス内でしか使わないorクラス内のメンバのパラメータのenumならclass内

  • using namespace std;は名前空間広すぎるので使ったらダメ。コンパイル遅くなる

  • getterはメンバの値を返す程度ならinlineで
     構文 inline typename functionname(arg)

  • メンバ内の関数や変数等を呼ぶ時はthis->をつけると可読性がガラリと変わる

  • 擬似乱数のmoduloだと乱数に規則性が出る事故が起きる危険性有り


主要なソース


Dice.h

#ifndef Dice__Dice__

#define Dice__Dice__

#include <cstdlib>
#include <vector>
#include <iostream>

class Dice
{
// 面数
enum kSurface
{
kDefaultSurface = 6
};

// 投げる回数
enum kRollCount
{
kDefaultRoll = 1
};

public:
// コンストラクタ
Dice();
// ダイスロール
// RollCount D Surface (例:3D6 6面ダイスを3回)
void roll(int Surface = kDefaultSurface, int RollCount = kDefaultRoll);
// 出目表示
void display();
// 出目リセット
void reset();
// 出目合計取得
inline int getRollResult(){ return this->totalRolls; };
// 出目履歴取得
//std::vector<int> getRollHistory() const;
inline const std::vector<int>& getRollHistory(){ return this->rollHistory; };
private:
// 履歴
std::vector<int> rollHistory;
// 振った回数
int totalRolls;
// 出目合計
int totalScore;
};
#endif /* defined(Dice__Dice__) */



Dice.cpp

#include "Dice.h"


Dice::Dice() : totalRolls(0), totalScore(0)
{
}

void Dice::roll(int surface, int rollCount)
{
std::cout << "surfaceRoll : " << surface << std::endl;
std::cout << "rollCount : " << rollCount << std::endl;

// 振った回数
this->totalRolls = rollCount;
for (int i = 0; i < rollCount; i++) {
// 出目履歴出
this->rollHistory.push_back((arc4random_uniform(surface)) + 1);
// this->rollHistory.push_back((arc4random() % surface) + 1);
std::cout << "rollHistory : " << this->rollHistory[i] << std::endl;
// 出目合計値
this->totalScore += this->rollHistory[i];
}

}

void Dice::display()
{
std::cout << "TotalRolls : " << this->totalRolls << std::endl;
std::cout << "TotalScore : " << this->totalScore << std::endl;
}

void Dice::reset()
{
rollHistory.clear();
totalRolls = 0;
totalScore = 0;
}