Пример #1
0
        public void ThinkOnFuroDahai(int mypositionId, string pai, List<Tehai> tehais, List<Kawa> kawas,
                                 Field field, List<InfoForResult> ifrs, Yama yama)
        {
            var myTehai = tehais[mypositionId];

            var dahaiPaiString = CalcMinShantenPai(mypositionId, tehais, kawas, field,yama);

            SendDahai(new MJsonMessageDahai(mypositionId, dahaiPaiString, dahaiPaiString == pai));
        }
Пример #2
0
        public void Unit_YamaTsumoTest()
        {
            Yama testYama = new Yama();

            Assert.AreEqual(testYama.GetRestYamaNum(), FIRST_YAMA_LENGTH);
            foreach (var omote in testYama.GetDoraMarkerStrings())
            {
                Debug.WriteLine("Dora = " + omote);
            }

            while (testYama.GetRestYamaNum() > 0)
            {
                var tsumoObj = testYama.DoTsumo();
                Debug.WriteLine(tsumoObj.PaiString);
            }
        }
Пример #3
0
        public void ThinkOnMyTsumo(int mypositionId, string tsumopai, List<Tehai> tehais, List<Kawa> kawas,
                                 Field field, List<InfoForResult> ifrs, Yama yama)
        {
            var myTehai = tehais[mypositionId];

            if (myTehai.IsHora())
            {
                var result = CalcHora(mypositionId, tsumopai);

                if (result.yakuResult.HasYakuExcludeDora)
                {
                    if (DisplayHora)
                    {
                        Debug.WriteLine("on tsumo");
                        Debug.WriteLine(myTehai.ToString());
                        result.yakuResult.yakus.ForEach(e => Debug.Write(e[0] + ","));
                        Debug.WriteLine("");
                        Debug.WriteLine("--------------------------------------------------------------------------------");
                    }

                    SendHora(new MJsonMessageHora(mypositionId, mypositionId, tsumopai));
                    CalcHora(mypositionId, tsumopai);

                    return;
                }

            }

            if (ifrs[mypositionId].IsReach)
            {
                SendDahai(new MJsonMessageDahai(mypositionId, tsumopai, true));
                return;
            }

            var dahaiPaiString = CalcMinShantenPai(mypositionId, tehais, kawas, field,yama);

            if (CanReach(tehais[mypositionId],ifrs[mypositionId],yama))
            {

                MessagebufferForReach = new MJsonMessageDahai(mypositionId,dahaiPaiString, dahaiPaiString == tsumopai);
                SendReach(new MJsonMessageReach(mypositionId));
                return;
            }

            SendDahai(new MJsonMessageDahai(mypositionId, dahaiPaiString, dahaiPaiString == tsumopai));
        }
Пример #4
0
        public void Unit_YamaRinshanTest()
        {
            Yama testYama = new Yama();

            Assert.AreEqual(testYama.GetRestYamaNum(), FIRST_YAMA_LENGTH);

            var rinshanObj = testYama.DoRinshan();
            Debug.WriteLine(rinshanObj.PaiString);
            Assert.AreEqual(testYama.GetRestYamaNum(), FIRST_YAMA_LENGTH - 1);
            Assert.IsTrue(testYama.CanKan());

            rinshanObj = testYama.DoRinshan();
            Debug.WriteLine(rinshanObj.PaiString);
            Assert.IsTrue(testYama.CanKan());

            rinshanObj = testYama.DoRinshan();
            Debug.WriteLine(rinshanObj.PaiString);
            Assert.IsTrue(testYama.CanKan());

            rinshanObj = testYama.DoRinshan();
            Debug.WriteLine(rinshanObj.PaiString);
            Assert.IsFalse(testYama.CanKan());
        }
Пример #5
0
 bool CanReach(Tehai tehai, InfoForResult infoForResult, Yama yama)
 {
     return ( tehai.IsTenpai() || tehai.IsHora() )
     && tehai.IsMenzen()
     && (infoForResult.IsReach == false && infoForResult.IsDoubleReach == false)
     && (yama.GetRestYamaNum() >= Constants.PLAYER_NUM);
 }
Пример #6
0
        private string CalcMinShantenPai(int mypositionId, List<Tehai> tehais, List<Kawa> kawas, Field field, Yama yama)
        {
            int fordebug = -1;
            int[] fordebug2 = new int[0];
            try
            {
                var restNum = Enumerable.Repeat(4, MJUtil.LENGTH_SYU_ALL).ToArray();
                tehais[mypositionId].tehai.ForEach(pai => restNum[pai.PaiNumber]--);
                tehais.ForEach(player => player.furos.ForEach(furo => furo.consumed.ForEach(pai => restNum[pai.PaiNumber]--)));
                kawas.ForEach(player => player.discards.ForEach(pai => restNum[pai.PaiNumber]--));
                yama.GetDoraMarkerStrings().ForEach(paiStr => restNum[PaiConverter.STRING_TO_ID[paiStr]]--);

                var kokushiShanten = shantenCalclator.CalcKokushiShanten(tehais[mypositionId].tehaiString);
                if (kokushiShanten > 3)
                {
                    shantenCalclator.SetUseKokushi(false);
                }

                var chitoitsuShanten = shantenCalclator.CalcChitoitsuShanten(tehais[mypositionId].tehaiString);
                if (chitoitsuShanten <= 1)
                {
                    shantenCalclator.SetUseChitoitsu(true);
                }
                else
                {
                    shantenCalclator.SetUseChitoitsu(false);
                }

                var nowShanten = shantenCalclator.CalcShanten(tehais[mypositionId]);

                var validateMap = new Dictionary<int, int>();

                var dahaiCandidate = tehais[mypositionId].tehai;

                foreach (var pai in dahaiCandidate)
                {
                    if (validateMap.ContainsKey(pai.PaiNumber))
                    {
                        continue;
                    }

                    var tehaiIds = tehais[mypositionId].tehai.Select(e => e.PaiNumber).ToList();
                    var furoCount = tehais[mypositionId].furos.Count;
                    tehaiIds.Remove(pai.PaiNumber);

                    var validPai = 0;
                    var syuArray = Enumerable.Repeat(0, MJUtil.LENGTH_SYU_ALL).ToArray();
                    tehaiIds.ForEach(e => syuArray[e]++);

                    for (int i = 0; i < MJUtil.LENGTH_SYU_ALL; i++)
                    {
                        if (restNum[i] <= 0)
                        {
                            continue;
                        }

                        fordebug = i;
                        fordebug2 = syuArray;

                        syuArray[i]++;
                        var tempShanten = shantenCalclator.CalcShantenWithFuro(syuArray, furoCount);
                        if (tempShanten < nowShanten)
                        {
                            validPai += restNum[i];
                        }
                        syuArray[i]--;
                    }
                    validateMap.Add(pai.PaiNumber, validPai);
                }

                shantenCalclator.SetUseKokushi(true);
                shantenCalclator.SetUseChitoitsu(true);

                var bestValidNumber = validateMap.OrderByDescending(e => e.Value).First().Value;
                var dahaiCandidateMap = validateMap.Where(e => e.Value == bestValidNumber);

                var bestNumber = -1;// temp value
                if (dahaiCandidateMap.Any(e => e.Key >= MJUtil.LENGTH_SYU_ONE_NUMBERS * 3))
                {
                    bestNumber = dahaiCandidateMap.Last().Key;
                }
                else if (dahaiCandidateMap.Any(e => e.Key % 9 == 0 || e.Key % 9 == 8))
                {
                    bestNumber = dahaiCandidateMap.Where(e => e.Key % 9 == 0 || e.Key % 9 == 8).Last().Key;
                }
                else if (dahaiCandidateMap.Any(e => e.Key % 9 == 1 || e.Key % 9 == 7))
                {
                    bestNumber = dahaiCandidateMap.Where(e => e.Key % 9 == 1 || e.Key % 9 == 7).Last().Key;
                }
                else if (dahaiCandidateMap.Any(e => e.Key % 9 == 2 || e.Key % 9 == 6))
                {
                    bestNumber = dahaiCandidateMap.Where(e => e.Key % 9 == 2 || e.Key % 9 == 6).Last().Key;
                }
                else if (dahaiCandidateMap.Any(e => e.Key % 9 == 3 || e.Key % 9 == 5))
                {
                    bestNumber = dahaiCandidateMap.Where(e => e.Key % 9 == 3 || e.Key % 9 == 5).Last().Key;
                }
                else
                {
                    bestNumber = dahaiCandidateMap.Last().Key;
                }

                var paiString = tehais[mypositionId].tehai.Where(e => e.PaiNumber == bestNumber).First().PaiString;

                var tehaiString = tehais[mypositionId].ToString();
                return paiString;
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
                Debug.WriteLine(fordebug);
                fordebug2.ToList().ForEach(v => Debug.Write(v+","));

                return "";
            }
        }
Пример #7
0
        public void ThinkOnOtherPlayerDoroped(int mypositionId, int dapaiActor, string pai, List<Tehai> tehais,
                                              List<Kawa> kawas, Field field, List<InfoForResult> ifrs, Yama yama)
        {
            if (shantenCalclator.CalcShanten(tehais[mypositionId], pai) != MJUtil.SHANTEN_HORA)
            {
                SendNone(new MJsonMessageNone());
                return;
            }

            // check my furiten
            var myTehai = tehais[mypositionId];
            var myKawa = kawas[mypositionId];
            var isFuritenByMyKawa = myKawa.discards.Any(discard => myTehai.GetShanten(discard.PaiString) == MJUtil.SHANTEN_HORA);
            if(isFuritenByMyKawa)
            {
                SendNone(new MJsonMessageNone());
                return;
            }

            // check yaku
            var tempSave = ifrs[mypositionId].LastAddedPai;
            ifrs[mypositionId].LastAddedPai = new Pai(pai);

            var result = CalcHora(dapaiActor, pai);
            if (result.yakuResult.HasYakuExcludeDora)
            {
                if (DisplayHora)
                {
                    Debug.WriteLine("on other player doroped");
                    Debug.WriteLine(myTehai.ToString());
                    result.yakuResult.yakus.ForEach(e => Debug.Write(e[0] + ","));
                    Debug.WriteLine("");
                    Debug.WriteLine("--------------------------------------------------------------------------------");
                }

                SendHora(new MJsonMessageHora(mypositionId, dapaiActor, pai));
                return;
            }

            ifrs[mypositionId].LastAddedPai = tempSave;
            SendNone(new MJsonMessageNone());
        }
Пример #8
0
        public void StartKyoku(string bakaze, int kyoku, int honba, int kyotaku, int oya, string doraMarker, List<List<string>> tehais)
        {
            field = new Field(kyoku, honba, kyotaku, oya, bakaze);
            CurrentActor = oya;
            infoForResultList = new List<InfoForResult>() { new InfoForResult(field.KyokuId, 0, oya, bakaze), new InfoForResult(field.KyokuId, 1, oya, bakaze), new InfoForResult(field.KyokuId, 2, oya, bakaze), new InfoForResult(field.KyokuId, 3, oya, bakaze) };

            this.tehais = new List<Tehai> { new Tehai(tehais[0]), new Tehai(tehais[1]), new Tehai(tehais[2]), new Tehai(tehais[3]) };

            // Don't use this haipai and this operation is for restYamaNum count
            yama = new Yama();
            yama.MakeHaipai();

            kawas = new List<Kawa> { new Kawa(), new Kawa(), new Kawa(), new Kawa() };
        }
Пример #9
0
 public void Init()
 {
     yama = new Yama();
     kawas = new List<Kawa> { new Kawa(), new Kawa(), new Kawa(), new Kawa() };
     tehais = new List<Tehai> { new Tehai(), new Tehai(), new Tehai(), new Tehai() };
     field = new Field();
     infoForResultList = new List<InfoForResult>() { new InfoForResult(), new InfoForResult(), new InfoForResult(), new InfoForResult() };
     scores = new List<int> { 25000, 25000, 25000, 25000 };
     CurrentActor = 0;
 }
Пример #10
0
 public void ThinkOnOtherPlayerDoroped(int mypositionId, int dapaiActor, string pai, List<Tehai> tehais,
                                       List<Kawa> kawas, Field field, List<InfoForResult> ifrs, Yama yama)
 {
     SendNone(new MJsonMessageNone());
 }