Exemplo n.º 1
0
        public static float GetScore(GameHistory game)
        {
            float      reward    = 0;
            Stats      result    = new Stats();
            Stats      oppresult = new Stats();
            StatsRound stats     = game.Stats.Last();

            result.DamageDone            = stats.Damage[1];
            result.MineralValueKilled    = stats.Killed[1];
            oppresult.DamageDone         = stats.Damage[0];
            oppresult.MineralValueKilled = stats.Killed[0];

            RESTResult rgame = new RESTResult();

            rgame.Result     = stats.winner;
            rgame.DamageP1   = oppresult.DamageDone;
            rgame.MinValueP1 = oppresult.MineralValueKilled;
            rgame.DamageP2   = result.DamageDone;
            rgame.MinValueP2 = result.MineralValueKilled;

            float killsP1 = 0;
            float unitsP1 = 0;

            foreach (Unit unit in game.Players.SingleOrDefault(x => x.Pos == 1).Units.Where(x => x.Status != UnitStatuses.Available))
            {
                unitsP1++;
                killsP1 += unit.Kills;
            }
            float killsP2 = 0;
            float unitsP2 = 0;

            foreach (Unit unit in game.Players.SingleOrDefault(x => x.Pos == 4).Units.Where(x => x.Status != UnitStatuses.Available))
            {
                unitsP2++;
                killsP2 += unit.Kills;
            }

            float minerals = paxgame.Income * game.Spawn;
            float scoreP1  = ((killsP1 / unitsP2) * 3 + ((float)rgame.MinValueP1 / minerals) * 2 + ((float)rgame.DamageP1 / stats.ArmyHPT2)) / 6;
            //float scoreP2 = ((killsP2 / unitsP1) * 3 + ((float)rgame.MinValueP2 / minerals) * 2 + ((float)rgame.DamageP2 / stats.ArmyHPT1)) / 6;
            //float scoreP1 = (((float)rgame.MinValueP1 / minerals) * 2 + ((float)rgame.DamageP1 / stats.ArmyHPT2)) / 3;
            float scoreP2 = (((float)rgame.MinValueP2 / minerals) * 2 + ((float)rgame.DamageP2 / stats.ArmyHPT1)) / 3;

            // u cannot hide
            if (scoreP2 == 0)
            {
                scoreP1 = -10;
            }

            //reward = scoreP1 + 1 - scoreP2;
            reward = scoreP1;
            reward = MathF.Round(reward, 2, MidpointRounding.AwayFromZero);
            return(reward);
        }
Exemplo n.º 2
0
        public static async Task <StatsRound> GenRoundStats(GameHistory _game, bool mstats = true)
        {
            _game.Spawn++;
            float armyvaluet1 = 0;
            float armyvaluet2 = 0;

            if (!_game.Health.FirstOrDefault().Equals(default(KeyValuePair <float, float>)))
            {
                armyvaluet1 = _game.Health.First().Key;
                armyvaluet2 = _game.Health.First().Value;
            }

            int winner = 0;

            if (_game.Health.Any())
            {
                if (_game.Health.Last().Key > 0 && _game.Health.Last().Value == 0)
                {
                    winner = 1;
                }
                else if (_game.Health.Last().Key == 0 && _game.Health.Last().Value > 0)
                {
                    winner = 2;
                }
            }

            StatsRound stats = new StatsRound();

            stats.winner   = winner;
            stats.ArmyHPT1 = armyvaluet1;
            stats.ArmyHPT2 = armyvaluet2;

            foreach (Player player in _game.Players.OrderBy(o => o.Pos))
            {
                float damage = 0;
                float killed = 0;
                float army   = 0;
                float tech   = 0;
                Unit  plmvp  = new Unit();

                foreach (UnitAbility ability in player.AbilityUpgrades)
                {
                    tech += ability.Cost;
                }

                foreach (UnitUpgrade upgrade in player.Upgrades)
                {
                    try
                    {
                        tech += UpgradePool.Upgrades.SingleOrDefault(x => x.Race == player.Race && x.Name == upgrade.Upgrade).Cost.ElementAt(upgrade.Level - 1).Value;
                    } catch { }
                }



                foreach (Unit unit in _game.battlefield.Units.Where(x => x.Status == UnitStatuses.Spawned && x.Owner == player.Pos && x.Race == player.Race))
                {
                    damage += unit.DamageDoneRound;
                    killed += unit.MineralValueKilledRound;
                    army   += unit.Cost;

                    unit.DamageDone         += damage;
                    unit.MineralValueKilled += killed;

                    if (unit.DamageDoneRound > plmvp.DamageDoneRound)
                    {
                        plmvp = unit;
                    }
                }
                if (plmvp.DamageDoneRound > stats.MVP.DamageDoneRound)
                {
                    stats.MVP = plmvp;
                }

                stats.Damage.Add(damage);
                stats.Killed.Add(killed);
                stats.Army.Add(army);
                stats.Tech.Add(tech);
                stats.Mvp.Add(plmvp);

                if (mstats == true)
                {
                    M_stats chartstats = new M_stats();
                    chartstats.ArmyHPTeam1 = MathF.Round(stats.ArmyHPT1, 2);
                    chartstats.ArmyHPTeam2 = MathF.Round(stats.ArmyHPT2, 2);
                    chartstats.ArmyValue   = MathF.Round(stats.Army.Last(), 2);
                    chartstats.DamageDone  = MathF.Round(stats.Damage.Last(), 2);
                    if (winner == 1 && player.Pos <= 3)
                    {
                        chartstats.RoundsWon = 1;
                    }
                    else if (winner == 2 && player.Pos > 3)
                    {
                        chartstats.RoundsWon = 1;
                    }
                    chartstats.Upgrades       = MathF.Round(stats.Tech.Last(), 2);
                    chartstats.VlaueKilled    = MathF.Round(stats.Killed.Last(), 2);
                    player.Stats[_game.Spawn] = chartstats;
                }
            }
            _game.Stats.Add(stats);
            return(stats);
        }