Exemplo n.º 1
0
    /// <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;
    }
Exemplo n.º 2
0
    /// <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;
    }
Exemplo n.º 3
0
    /// <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;
    }
Exemplo n.º 4
0
    /// <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;
    }
Exemplo n.º 5
0
    /// <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;
    }
Exemplo n.º 6
0
    /// <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;
    }