どうも、パチスロを自作している素人&変人です。
出目情報を管理するクラスを作ったのですが、だいぶゴチャついてきました。
今回はクラス間で出目情報のやり取りをする部分を整理します。
C# の Tuple(タプル)という機能を使うと便利でした。
今回の記事はPart10です。
自作パチスロについて記事のまとめはこちらです。
パチスロにおいて、どこの部分の話か?
リール停止 –> リール配列をもとに出目算出 –> 出目情報を保持
の部分の話です。
クラス間のやり取りの話です。
出目管理クラスで出目情報を保持しておけば、いつでも、どこからでも問合せして出目を参照できます。
各クラスの関係について
今回は4つのクラスが登場します。完成までに作り直す可能性もありけり。
- ストップ管理 —> どのリールを停止するか管理するクラス
- リール管理 —> リールオブジェクトの回転や停止コマ数計算などを管理するクラス
- 出目管理 —> 停止後の出目情報を保持するクラス(シングルトン)
- リール配列 —> リール配列の情報を保持するクラス(シングルトン)
全体の流れ(シーケンス図)
こんな感じの流れです。
出目管理 –> リール配列間でポイントとなるのは、引数として渡す「停止コマ数」は1つなのに対し、欲しい情報は上段・中段・下段の3つという部分です。
↓のような感じにすると冗長なコードになります。
そこで!タプルを使うと↓のような感じで簡潔で理解しやすいコードになります。
複数の戻り値を返すことができる
|——–戻り値——-| タプル名 |———–引数———–|
( 上段 , 中段 , 下段 ) タプル名 ( 停止コマ数 , リール名 )
ちなみにタプルには、名前を定義しないパターンと定義するパターンがありますが、今回は名前を付けています。
実際のコード
まずはリール配列の情報を保持するクラス側でタプルを作っておきます。
リール配列クラスのタプル
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;
}
プレビュー
今回のコードを、なんやかんやして図柄名で表示できるようにしたものがこちら
リール停止時にリール配列を参照してどの小役が止まったか判定しています。
コンソールの文字が潰れてしまったので別で載せます。
第一停止
第二停止
第三停止
コメント