/// <summary> /// 大当たりしているか調査 /// </summary> /// <param name="reels"></param> /// <returns></returns> public bool IsOoatari(ReelElement[] reels) { var cr1 = Ginpara.Reel.CyclicReel1; var cr2 = Ginpara.Reel.CyclicReel2; var cr3 = Ginpara.Reel.CyclicReel3; var cr2List = new List<CycleSequence<ReelElement>>() { Ginpara.Reel.CyclicReel2, Ginpara.Reel.CyclicReel2SP_RIGHT, Ginpara.Reel.CyclicReel2SP_CENTER, Ginpara.Reel.CyclicReel2SP_LEFT }; foreach (var cr2e in cr2List) { if (cr2e.Contains(reels[1])) { cr2 = cr2e; } } var r1 = cr1.SkipWhile(elem => !elem.Sizi.Equals(reels[0].Sizi)) .Take(3).ToArray(); var r2 = cr2.SkipWhile(elem => !elem.Sizi.Equals(reels[1].Sizi)) .Take(3).ToArray(); var r3 = cr3.SkipWhile(elem => !elem.Sizi.Equals(reels[2].Sizi)) .Take(3).ToArray(); var line1 = new string[] { r1[0].Tokuzu, r2[0].Tokuzu, r3[0].Tokuzu }; var line2 = new string[] { r1[1].Tokuzu, r2[1].Tokuzu, r3[1].Tokuzu }; var line3 = new string[] { r1[2].Tokuzu, r2[2].Tokuzu, r3[2].Tokuzu }; var line41 = new string[] { r1[0].Tokuzu, r2[1].Tokuzu, r3[2].Tokuzu }; var line42 = new string[] { r1[2].Tokuzu, r2[1].Tokuzu, r3[0].Tokuzu }; var lines = new List<string[]> { line1, line2, line3, line41, line42 }; var result = false; lines.ForEach(line => { if (line[0].Equals(line[1]) && line[1].Equals(line[2])) { if (!line[0].Equals("*")) { result = true; } } }); return result; }
/// <summary> /// テンパイしているか返す /// </summary> /// <param name="r1">リール</param> /// <param name="r3">リール</param> /// <returns>true:テンパイしている false:テンパイしていない</returns> static private bool IsTenpai( ReelElement r1, ReelElement r3 ) { // テンパイしているか調査 if (r1.Tokuzu == r3.Tokuzu) return true; // リール取得 var Jodan = CyclicReel1.SkipWhile(elem => !elem.Sizi.Equals(r1.Sizi)) .Take(3).ToArray(); var Gedan = CyclicReel3.SkipWhile(elem => !elem.Sizi.Equals(r3.Sizi)) .Take(3).ToArray(); // 垂直方向のチェック if (Jodan[0].Tokuzu.Equals(Gedan[0].Tokuzu)) { return true; } if (Jodan[1].Tokuzu.Equals(Gedan[1].Tokuzu)) { return true; } if (Jodan[2].Tokuzu.Equals(Gedan[2].Tokuzu)) { return true; } // ナナメのチェック if (Jodan[0].Tokuzu.Equals(Gedan[2].Tokuzu)) { return true; } if (Jodan[2].Tokuzu.Equals(Gedan[0].Tokuzu)) { return true; } // テンパイしていないを返却 return false; }
/// <summary> /// 止まる位置を取得(バラケ目) /// </summary> /// <returns>指示No 上段、中段、下段( 4-1 等 )</returns> static public ReelElement[] ChooseBarakeme() { // 上段の止まる位置を抽選 var r1 = BarakemeChusen[RndFFFF].elem; ReelElement r2, r3; // 下段の止まる位置を抽選 r3 = GetElement(reel3); // テンパイを避けて均等に停止させる // テンパイすることになったら+1してズラす while (IsTenpai(r1, r3)) { r3 = CyclicReel3.SkipWhile(elem => !elem.Sizi.Equals(r3.Sizi)) .Take(2) .ToArray()[1]; } // 中段を抽選 r2 = GetElement(reel2); var reels = new ReelElement[] { r1, r2, r3 }; return reels; }
/// <summary> /// 止まる位置を取得(リーチ) /// </summary> /// <param name="ReachLine">リーチライン①~④</param> /// <param name="Tokuzu">特図の番号1~10</param> /// <returns></returns> static public ReelElement[] Choose(int ReachLine, int Tokuzu) { // 上段の止まる位置を決定 var r1 = reel1.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r2 = reel2.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r3 = reel3.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); // リーチラインに応じて、上段、下段の位置をずらす if (ReachLine == 1) { // ずらさない } else if (ReachLine == 2) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); }else if(ReachLine == 3) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } else if (ReachLine == 4) { // 上段ずらさないで、下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } // ========= // 中段を抽選 // ========= // 循環テーブルを停止特図分シフト(スキップ)し、 // リーチライン分シフト(スキップ)し、 // 抽選テーブルとZIP(統合)し、 // 抽選値の数だけ平坦化し、 // 乱数で抽選する。 var SkipReachLine = 20; // 一回転 var ChusenTable = Reel2ReachHazusiChusen123; switch (ReachLine) { case 1: break; case 2: SkipReachLine -= 1; break; case 3: SkipReachLine -= 2; break; case 4: ChusenTable = Reel2ReachHazusiChusen4; break; } var Chudan = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(SkipReachLine) .Take(20) .Select((e, index) => new BarakemePattern() { elem = e, chusenti = ChusenTable[index] }) .Select(br => BR2Sequence(br)) .SelectMany(brs => brs) .ToArray(); r2 = Chudan[RndFFFF].elem; var reels = new ReelElement[] { r1, r2, r3 }; return reels; }
/// <summary> /// 止まる位置を取得(SPリーチ) /// </summary> /// <param name="ReachLine">リーチライン①~④</param> /// <param name="Tokuzu">特図の番号1~10</param> /// <returns></returns> static public ReelElement[] ChooseSP(int ReachLine, int Tokuzu, string ReachPatternName) { // 上段、中段、下段の止まる位置を仮固定 var r1 = reel1.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r2 = reel2.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r3 = reel3.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); // リーチラインに応じて、上段、下段の位置をずらす if (ReachLine == 1) { // ずらさない } else if (ReachLine == 2) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); } else if (ReachLine == 3) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } else if (ReachLine == 4) { // 上段ずらさないで、下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } // ========= // 中段を抽選 // ========= // -1, +1, +3の抽選を行い、(-1が右側、+1が左側) // 循環テーブルを停止特図分シフト(スキップ)し、 // リーチライン分シフト(スキップ)し、 var CyclicReel = CyclicReel2SP_RIGHT; var SkipReachLine = 20; // 一回転 if (ReachLine == 1) { } else if( ReachLine == 2 ) { SkipReachLine -= 1; } else if (ReachLine == 3) { SkipReachLine -= 2; } else if (ReachLine == 4) { SkipReachLine -= 1; } // SP1, SP2は泡、魚群に応じて+1、-1を抽選する // SP3は+1、-1、+3を抽選する var shiftnum = 0; if (ReachPatternName.Contains("SP1") || ReachPatternName.Contains("SP2")) { if (ReachPatternName.Contains("泡")) { shiftnum = ChusenAwaSP12Array[RndFFFF].ShiftNum; } else { shiftnum = ChusenGyogunSP12Array[RndFFFF].ShiftNum; } } else { // SP3 shiftnum += ChusenSP3Array[RndFFFF].ShiftNum; } SkipReachLine += shiftnum; var CyclicReel2 = CyclicReel2SP_CENTER; if (shiftnum < 0) { CyclicReel2 = CyclicReel2SP_RIGHT; } else if( shiftnum > 0) { CyclicReel2 = CyclicReel2SP_LEFT; } // SP3の場合はまた違うテーブルを使う if (ReachPatternName.Contains("SP3")) { switch(shiftnum){ case -1: // -1コマハズレ用 CyclicReel2 = CyclicReel2SP3_LEFT; break; case 1: // 前図柄+1コマハズレ用 CyclicReel2 = CyclicReel2SP3_MaePlus1; break; case 3: // 後ろ図柄+1コマハズレ用 CyclicReel2 = CyclicReel2SP3_UshiroPlus1; break; } } var Chudan = CyclicReel2.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(SkipReachLine) .First(); r2 = Chudan; var reels = new ReelElement[] { r1, r2, r3 }; return reels; }
/// <summary> /// 大当たりの止まる位置を取得 /// </summary> /// <param name="result"></param> /// <param name="AtariZugara"></param> /// <returns></returns> static public ReelElement[] ChooseOoatari(DrawLotResult result, out int AtariZugara) { var Tokuzu = result.tokuzu; var ReachLine = result.reachLine; AtariZugara = Tokuzu; //Debug.Log("特図:" + Tokuzu); //Debug.Log("リーチライン:" + ReachLine); // 上段、中段、下段の止まる位置を仮固定 var r1 = reel1.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r2 = reel2.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); var r3 = reel3.Where(r => r.Tokuzu.Equals(Tokuzu.ToString())).First(); // リーチラインに応じて、上段、下段の位置をずらす if (ReachLine == 1) { // ずらさない } else if (ReachLine == 2) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); } else if (ReachLine == 3) { // 上段ずらす r1 = CyclicReel1.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); // 下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } else if (ReachLine == 4) { // 上段ずらさないで、下段ずらす r3 = CyclicReel3.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } //-------------------------------------------------------------------- // 中段を決める // リーチライン4の場合は、ダブルリーチだが、どちらで当てるかは // プログラム側で1/2の確率で決める //-------------------------------------------------------------------- if (result.reachPatternName.Contains("SP3")) { // SP3はダブルリーチ固定 CycleSequence<ReelElement> cyclicReel2SP; var rnd = UnityEngine.Random.Range(0, 2); //Debug.Log("rnd:" + rnd); //Debug.Log(rnd == 0 ? "前図柄" : "後図柄"); var Zugara = Tokuzu.ToString(); if( rnd == 0 ){ cyclicReel2SP = CyclicReel2SP3_MaeOoatari; } else { cyclicReel2SP = CyclicReel2SP3_UshiroOoatari; Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString())) .Skip(18) .First(); AtariZugara = int.Parse(Zugara); } r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Zugara)) .Skip(19) .First(); } else if (result.reachPatternName.Contains("SP")) { // SP1, SP2 var cyclicReel2SP = CyclicReel2SP3_MaeOoatari; if (ReachLine == 1) { r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(20) .First(); } else if (ReachLine == 2) { r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); } else if (ReachLine == 3) { r2 = cyclicReel2SP.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } } else if (result.reachPatternName.Contains("再始動")) { // 再始動ビタどまり // +20の場合は+1にしておく // TODO 仕様を確認 var delmitChars = new Char[] { '(', ')' }; var split = result.reachPatternName.Split(delmitChars); var num = int.Parse(split[1]); if (num == 20) num = 1; var t = ""; if (ReachLine == 1) { t = RL1[Tokuzu]; } else if (ReachLine == 2) { t = RL2[Tokuzu]; } else if (ReachLine == 3) { t = RL3[Tokuzu]; } else { var rnd = UnityEngine.Random.Range(0, 2); if (rnd == 0) { t = RL2[Tokuzu]; } else { t = RL4B[Tokuzu]; var Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString())) .Skip(2) .First(); AtariZugara = int.Parse(Zugara); } } var s = t + "-" + num.ToString(); r2 = new ReelElement() { Tokuzu = t, Sizi = s }; } else { // ノーマル if (ReachLine == 1) { } else if (ReachLine == 2) { r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(19) .First(); } else if (ReachLine == 3) { r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Tokuzu.ToString())) .Skip(18) .First(); } else if (ReachLine == 4) { // 1/2 の確率で抽選 var rnd = UnityEngine.Random.Range(0, 2); var Zugara = Tokuzu.ToString(); if (rnd == 1) { Zugara = CyclicReelUnder.SkipWhile(e => !e.Equals(Tokuzu.ToString())) .Skip(18) .First(); AtariZugara = int.Parse(Zugara); // 出力 } r2 = CyclicReel2normal.SkipWhile(elem => !elem.Tokuzu.Equals(Zugara)) .Skip(19) .First(); } } var reels = new ReelElement[] { r1, r2, r3 }; return reels; }