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)); }
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); } }
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)); }
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()); }
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); }
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 ""; } }
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()); }
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() }; }
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; }
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()); }