private Tile chooseDiscardForDef(out DefEvalResult defEvalResult, List <Tuple <Tile, EvalResult> > options) { var evalResults = new Dictionary <string, DefEvalResult>(); Tuple <Tile, DefEvalResult> bestResult = null; Trace.WriteLine("Defense: " + gameData.players.Where(p => defLevel(p) > 0).ToString(", ", p => string.Format("player({0}):{1}", p.id, defLevel(p)))); foreach (var tile in player.hand) { if (!evalResults.ContainsKey(tile.Name)) { var atkEvalResult = options.Where(tuple => tuple.Item1.Name == tile.Name).DefaultIfEmpty(Tuple.Create <Tile, EvalResult>(null, null)).First().Item2; var result = evalResults[tile.Name] = evalDef(tile, atkEvalResult); Trace.WriteLine(string.Format("Option: discard {0}, {1}", tile.Name, result)); if (bestResult == null || defEvalResultComp.Compare(result, bestResult.Item2) > 0) { bestResult = new Tuple <Tile, DefEvalResult>(tile, result); } } } foreach (var tile in player.hand) { var result = evalResults[tile.Name]; if (result.Risk - result.Bonus <= (bestResult.Item2.Risk - bestResult.Item2.Bonus) && evalResultComp.Compare(result.AtkEvalResult, bestResult.Item2.AtkEvalResult) > 0) { bestResult = new Tuple <Tile, DefEvalResult>(tile, result); } } Trace.WriteLine(string.Format("BestResult: discard {0}, {1}", bestResult.Item1.Name, bestResult.Item2)); defEvalResult = bestResult.Item2; return(bestResult.Item1); }
private Tile chooseDiscardForDef(out DefEvalResult defEvalResult) { var evalResults = new Dictionary <string, DefEvalResult>(); Tuple <Tile, DefEvalResult> bestResult = null; Trace.WriteLine("Defense: " + gameData.players.Where(p => defLevel(p) > 0).ToString(", ", p => string.Format("player({0}):{1}", p.id, defLevel(p)))); foreach (var tile in player.hand) { if (!evalResults.ContainsKey(tile.Name)) { var result = evalResults[tile.Name] = evalDef(tile); Trace.WriteLine(string.Format("Option: discard {0}, Risk: {1:0.##}{2}", tile.Name, result.Risk, result.Risk == 0 ? "(" + result.RiskForOthers.ToString("0.##") + ")" : "")); if (bestResult == null || defEvalResultComp.Compare(result, bestResult.Item2) > 0) { bestResult = new Tuple <Tile, DefEvalResult>(tile, result); } } } Trace.WriteLine(string.Format("BestResult: discard {0}, Risk: {1:0.##}{2}", bestResult.Item1.Name, bestResult.Item2.Risk, bestResult.Item2.Risk == 0 ? "(" + bestResult.Item2.RiskForOthers.ToString("0.##") + ")" : "")); defEvalResult = bestResult.Item2; return(bestResult.Item1); }
private DefEvalResult evalDef(Tile tile, Player forPlayer) { var res = new DefEvalResult(); if (forPlayer.safeTiles.Get().TileExists(tile)) { res.Risk = 0; } else if (tile.Type == "z") { res.Risk = evalDefZ(tile, forPlayer); } else if (tile.Number == 1 || tile.Number == 9) { res.Risk = evalDef19(tile, forPlayer, tile.Number); } else if (tile.Number == 2 || tile.Number == 8) { res.Risk = evalDef28(tile, forPlayer, tile.Number); } else if (tile.Number == 3 || tile.Number == 7) { res.Risk = evalDef37(tile, forPlayer, tile.Number); } else { res.Risk = evalDefMid(tile, forPlayer); } var tmp = forPlayer.graveyard.Where(t => t.Type != "z" && t.Number != 1 && t.Number != 9).Take(2).ToList(); if (tmp.Count >= 1 && isOutsideOf(tile, tmp[0])) { res.Risk /= 4; } if (tmp.Count >= 2 && isOutsideOf(tile, tmp[1])) { res.Risk /= 2; } if (doraValue(tile) > 0) { res.Risk += 5; } else if (res.Risk > 0 && gameData.dora.Exists(t => t.Type == tile.Type && t.Type != "z" && t.getNextGeneralId() + 1 == tile.GenaralId && t.getNextGeneralId() - 1 == tile.GenaralId)) { res.Risk += 3; } else if (res.Risk > 0 && gameData.dora.Exists(t => t.Type == tile.Type && t.Type != "z" && t.getNextGeneralId() + 2 == tile.GenaralId && t.getNextGeneralId() - 2 == tile.GenaralId)) { res.Risk += 2; } else if (res.Risk > 0 && gameData.dora.Exists(t => t.Type == tile.Type && t.Type != "z" && t.getNextGeneralId() + 3 == tile.GenaralId && t.getNextGeneralId() - 3 == tile.GenaralId)) { res.Risk += 1; } return(res); }
public DefEvalResult evalDef(Tile tile) { var res = new DefEvalResult(); var defTargets = gameData.players.Where(p => defLevel(p) > 0); res.Risk = defTargets.Sum(p => evalDef(tile, p).Risk *defLevel(p)) / defTargets.Sum(p => defLevel(p)); var others = gameData.players.Where(p => p != player && defLevel(p) == 0); res.RiskForOthers = others.Count() > 0 ? others.Average(p => evalDef(tile, p).Risk) : 0; return(res); }
public DefEvalResult evalDef(Tile tile, EvalResult atkEvalResult = null) { var res = new DefEvalResult(); var defTargets = gameData.players.Where(p => defLevel(p) > 0); res.Risk = defTargets.Sum(p => evalDef(tile, p).Risk *defLevel(p)) / defTargets.Sum(p => defLevel(p)); var others = gameData.players.Where(p => p != player && defLevel(p) == 0); res.RiskForOthers = others.Count() > 0 ? others.Average(p => evalDef(tile, p).Risk) : 0; res.Bonus = atkEvalResult == null ? 0 : isAllLastTop() ? 5 : atkEvalResult.E_Point > 0 ? atkEvalResult.E_Point / 800 : gameData.remainingTile < 16 && atkEvalResult.Distance == 0 ? 1 : // 晚巡型听 0; res.AtkEvalResult = atkEvalResult; return(res); }