public RoundResult(int roundNumber, ReadonlyMoveCollection playerMoves, ReadonlyMoveCollection opponentMoves, int playerScore, int opponentScore) { RoundNumber = roundNumber; PlayerMoves = playerMoves; OpponentMoves = opponentMoves; PlayerScore = playerScore; OpponentScore = opponentScore; }
public RoundContext(ReadonlyMoveCollection lastOpponentMoves, int myDamage, int opponentDamage, int myLifePoints, int opponentLifePoints) { LastOpponentMoves = lastOpponentMoves; MyDamage = myDamage; OpponentDamage = opponentDamage; MyLifePoints = myLifePoints; OpponentLifePoints = opponentLifePoints; MyMoves = new MoveCollection(); }
public int CalculateScore(ReadonlyMoveCollection attacker, ReadonlyMoveCollection defender) { int points = 0; foreach (var attack in attacker.Moves.Where(x => x.Type == MoveType.Attack)) { if (!defender.Moves.Any(x => x.Type == MoveType.Defense && x.Area == attack.Area)) { points += attack.GetAttackPower(); } } return(points); }
public bool Validate(ReadonlyMoveCollection moveCollection) { return(moveCollection?.Moves.Sum(x => x.GetEnergy()) <= Energy); }
public FightResults Execute() { ReadonlyMoveCollection f1Move = null; ReadonlyMoveCollection f2Move = null; int score1 = 0; int score2 = 0; int round = 0; int f1Lifepoints, f2Lifepoints = f1Lifepoints = gameLogic.LifePoints; List <RoundResult> roundResults = new List <RoundResult>(); while (f1Lifepoints > 0 && f2Lifepoints > 0) { round++; RoundContext bot1Context = new RoundContext(f2Move, score1, score2, f1Lifepoints, f2Lifepoints); MoveCollection moves = null; bool result; try { result = Task.Run(() => moves = bot1.NextMove(bot1Context), CancellationToken.None) .Wait(gameLogic.MaxMoveTime); bot1Context.SetMoves(moves); } catch (Exception exc) { FightResultError error = new FightResultError(FightResultErrorType.Runtime, exc.InnerException.StackTrace, exc.InnerException.Message); return(FightResults.SetError(error, FightResultType.Lost).SetRoundResults(roundResults).SetRoundResults(roundResults)); } if (!result) { FightResultError error = new FightResultError(FightResultErrorType.Timeout, bot1 + " exceeded move timeout"); return(FightResults.SetError(error, FightResultType.Lost).SetRoundResults(roundResults)); } if (!gameLogic.Validate(moves)) { FightResultError error = new FightResultError(FightResultErrorType.IllegalMove, bot1 + " made an illegal move"); return(FightResults.SetError(error, FightResultType.Lost).SetRoundResults(roundResults)); } RoundContext bot2Context = new RoundContext(f1Move, score2, score1, f2Lifepoints, f1Lifepoints); try { result = Task.Run(() => moves = bot2.NextMove(bot2Context), CancellationToken.None) .Wait(gameLogic.MaxMoveTime); bot2Context.SetMoves(moves); } catch (Exception exc) { FightResultError error = new FightResultError(FightResultErrorType.Runtime, exc.InnerException.StackTrace, exc.InnerException.Message); return(FightResults.SetError(error, FightResultType.Win).SetRoundResults(roundResults).SetRoundResults(roundResults)); } if (!result) { FightResultError error = new FightResultError(FightResultErrorType.Timeout, bot2 + " exceeded move timeout"); return(FightResults.SetError(error, FightResultType.Win).SetRoundResults(roundResults)); } if (!gameLogic.Validate(moves)) { FightResultError error = new FightResultError(FightResultErrorType.IllegalMove, bot2 + " made an illegal move"); return(FightResults.SetError(error, FightResultType.Win).SetRoundResults(roundResults)); } f1Move = bot1Context.MyMoves; f2Move = bot2Context.MyMoves; score1 = gameLogic.CalculateScore(f1Move, f2Move); score2 = gameLogic.CalculateScore(f2Move, f1Move); f1Lifepoints -= score2; f2Lifepoints -= score1; RoundResult roundResult = new RoundResult(round, f1Move, f2Move, score1, score2); roundResults.Add(roundResult); if (!gameLogic.ValidateRound(round, f1Lifepoints, f2Lifepoints)) { return(FightResults.Draw(f1Lifepoints, f2Lifepoints).SetRoundResults(roundResults)); } } if (f1Lifepoints <= 0 && f2Lifepoints <= 0) { return(FightResults.Draw(f1Lifepoints, f2Lifepoints).SetRoundResults(roundResults)); } else if (f1Lifepoints > f2Lifepoints) { return(FightResults.Win(f1Lifepoints, f2Lifepoints).SetRoundResults(roundResults)); } else if (f1Lifepoints == f2Lifepoints) { return(FightResults.Draw(f1Lifepoints, f2Lifepoints).SetRoundResults(roundResults)); } return(FightResults.Lost(f1Lifepoints, f2Lifepoints).SetRoundResults(roundResults)); }