パチスロを作ってみたPart10(クラス間で出目情報をやり取りする)

この記事は約7分で読めます。

どうも、パチスロを自作している素人&変人です。

出目情報を管理するクラスを作ったのですが、だいぶゴチャついてきました。

今回はクラス間で出目情報のやり取りをする部分を整理します

C# の Tuple(タプル)という機能を使うと便利でした。

今回の記事はPart10です。

自作パチスロについて記事のまとめはこちらです。

今回やること

・プログラムの開発環境はUnity , C#

・Tupleを使って簡潔なコードを書く(タプる)

パチスロにおいて、どこの部分の話か?

リール停止 –> リール配列をもとに出目算出 –> 出目情報を保持

の部分の話です。

クラス間のやり取りの話です

出目管理クラスで出目情報を保持しておけば、いつでも、どこからでも問合せして出目を参照できます。

各クラスの関係について

今回は4つのクラスが登場します。完成までに作り直す可能性もありけり。

  • ストップ管理 —> どのリールを停止するか管理するクラス
  • リール管理  —> リールオブジェクトの回転や停止コマ数計算などを管理するクラス
  • 出目管理   —> 停止後の出目情報を保持するクラス(シングルトン)
  • リール配列  —> リール配列の情報を保持するクラス(シングルトン)

全体の流れ(シーケンス図)

こんな感じの流れです。

出目管理 –> リール配列間でポイントとなるのは、引数として渡す「停止コマ数」は1つなのに対し、欲しい情報は上段・中段・下段の3つという部分です。

↓のような感じにすると冗長なコードになります。

そこで!タプルを使うと↓のような感じで簡潔で理解しやすいコードになります。

タプル(Tuple)の説明

複数の戻り値を返すことができる

|——–戻り値——-| タプル名 |———–引数———–|

( 上段 , 中段 , 下段 ) タプル名 ( 停止コマ数 , リール名 )

ちなみにタプルには、名前を定義しないパターンと定義するパターンがありますが、今回は名前を付けています。

実際のコード

まずはリール配列の情報を保持するクラス側でタプルを作っておきます。

リール配列クラスのタプル

public class ReelHairetuData 
{
    // シングルトンとかその他のコードは割愛しています

    // 配列データはリソースから読み込めないのでベタ打ち(モノビヘイビア承継していない)
    private int[] _reelHairetu_Left = new int[21] {2,1,32,1,4,2,4,1,8,64,2,4,1,2,64,4,2,1,16,8,16};
    private int[] _reelHairetu_Center = new int[21] {2,8,32,8,1,2,8,2,1,4,16,8,2,1,4,8,1,2,64,64,1};
    private int[] _reelHairetu_Right = new int[21] {1,8,32,2,4,1,4,2,16,1,16,2,4,1,8,2,4,1,64,2,4};    

 
// ここがタプル
public (int jyoudann, int tyuudann, int gedann) Get_ZugaraNum_Tuple(int komaNum, string reelName)
    {
        // 停止コマ数を自作コンバーターで調整  (1コマ〜21コマに収まるように)
        int ge    = Over21KomaConverter(komaNum - 1); // 要素番号とコマ数より 1 少ない
        int tyuu = Over21KomaConverter(ge + 1);
        int jyou = Over21KomaConverter(ge + 2);

        // あらかじめ小役情報が入った配列を作っています(リールごとのint型)今回は記載しません
        return (ReelNameToArray (reelName) [jyou], // 上段
                     ReelNameToArray (reelName) [tyuu], // 中段
                     ReelNameToArray (reelName) [ge]);  // 下段
    }
}

以下が自作コンバーター(メソッド)

    // 21コマを超える場合は修正
    int Over21KomaConverter(int argsKoma)
    {
        // 21を超える場合は1からに変換
        if (argsKoma > 21)  {   argsKoma -= 21;   }
        return argsKoma;
    }

以下が引数のリール名に応じてリール配列を格納した配列を返すメソッド

    // リール名に応じた配列を返すメソッド
    int[] ReelNameToArray (string reelName)
    {
        if         (reelName == "ReelLeftObj")     {  return _reelHairetu_Left;  }
        else if (reelName == "ReelCenterObj") {  return _reelHairetu_Center;   }
        else if (reelName == "ReelRightObj")    {  return _reelHairetu_Right;   }
        return null;
    }

出目管理クラス –> リール配列クラス の問い合わせ部分

    public List<int> _currentReelLeftDemes_int { set; get; } = new List<int>();   // 左リール  
    public List<int> _currentReelCenterDemes_int { set; get; } = new List<int>(); // 中リール 
    public List<int> _currentReelRightDemes_int { set; get; } = new List<int>();  // 右リール 

    public void SetDemeData(int stopKomaNum, string reelName)
    {
        // リール配列クラスはシングルトン
        ReelHairetuData reelHairetuData = ReelHairetuData.GetInstance();

        // リール配列を参照し図柄番号を取得
        var tuple_zugaraNum = reelHairetuData.Get_ZugaraNum_Tuple(stopKomaNum, reelName);

        ReelNameToListName(reelName).Clear();
        ReelNameToListName(reelName).Add(tuple_zugaraNum.jyoudann); // [0]上段
        ReelNameToListName(reelName).Add(tuple_zugaraNum.tyuudann); // [1]中段
        ReelNameToListName(reelName).Add(tuple_zugaraNum.gedann);   // [2]下段
    }

こちらも引数のリール名に応じてリール配列を格納した配列を返すメソッドを作っています。

 List<int> ReelNameToListName (string reelName)
    {
        if         (reelName == "ReelLeftObj")      {  return _currentReelLeftDemes_int; }
        else if (reelName == "ReelCenterObj")  {  return _currentReelCenterDemes_int; }
        else if (reelName == "ReelRightObj")    {  return _currentReelRightDemes_int; }
        return null;
    }

プレビュー

今回のコードを、なんやかんやして図柄名で表示できるようにしたものがこちら

リール停止時にリール配列を参照してどの小役が止まったか判定しています。

コンソールの文字が潰れてしまったので別で載せます。

第一停止

第二停止

第三停止

コメント

タイトルとURLをコピーしました