コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }