Help us understand the problem. What is going on with this article?

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;
}
syo-sa1982
Androidアプリ作って生きてる
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away