AreWe

Game Of Epicness 100/100

Jul 8th, 2020
1,141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. gameOfEpicness = (kingdoms = [], battles = []) => {
  2.     function General(name = '', army = 0) {
  3.         this.addArmy = (army = 0) => {
  4.             this.army += army;
  5.         };
  6.  
  7.         this.score = (isWin) => {
  8.             this.army = Math.floor(this.army * (isWin ? 1.1 : 0.9));
  9.             isWin ? this.wins++ : this.losses++;
  10.         };
  11.  
  12.         this.attack = (defender) => {
  13.             if (this.army !== defender.army) {
  14.                 const isWin = this.army > defender.army;
  15.                 this.score(isWin);
  16.                 defender.score(!isWin);
  17.             }
  18.         };
  19.  
  20.         [this.name, this.army, this.wins, this.losses] = [name, 0, 0, 0];
  21.         this.addArmy(army);
  22.     }
  23.  
  24.     function Kingdom(name, general, army) {
  25.         this.addGeneral = (general, army) => {
  26.             if (!this.generals[general]) {
  27.                 this.generals[general] = new General(general, army);
  28.             } else {
  29.                 this.generals[general].addArmy(army);
  30.             }
  31.         };
  32.  
  33.         this.getScore = () => {
  34.             return Object.values(this.generals).reduce(
  35.                 (score, gen) => {
  36.                     [score.wins, score.losses] = [score.wins + gen.wins, score.losses + gen.losses];
  37.                     return score;
  38.                 },
  39.                 { wins: 0, losses: 0 },
  40.             );
  41.         };
  42.  
  43.         this.getGenerals = () => {
  44.             return Object.values(this.generals)
  45.                 .sort((a, b) => b.army - a.army)
  46.                 .map(
  47.                     (gen) =>
  48.                         `/\\general: ${gen.name}\n---army: ${gen.army}\n---wins: ${gen.wins}\n---losses: ${gen.losses}`,
  49.                 )
  50.                 .join('\n');
  51.         };
  52.  
  53.         [this.name, this.generals] = [name, {}];
  54.         this.addGeneral(general, army);
  55.     }
  56.  
  57.     function Battlefield() {
  58.         this.addKingdom = ([kingdom, general, army]) => {
  59.             if (this.kingdoms[kingdom]) {
  60.                 this.kingdoms[kingdom].addGeneral(general, army);
  61.             } else {
  62.                 this.kingdoms[kingdom] = new Kingdom(kingdom, general, army);
  63.             }
  64.         };
  65.  
  66.         this.battle = ([atkKing, atkGen, defKing, defGen]) => {
  67.             if (atkKing !== defKing) {
  68.                 const [attacker, defender] = [
  69.                     this.kingdoms[atkKing].generals[atkGen],
  70.                     this.kingdoms[defKing].generals[defGen],
  71.                 ];
  72.                 attacker.attack(defender);
  73.             }
  74.         };
  75.  
  76.         this.getWinner = () => {
  77.             const winner = Object.values(this.kingdoms).sort((a, b) => {
  78.                 const [score1, score2] = [a.getScore(), b.getScore()];
  79.                 return score2.wins - score1.wins || score1.losses - score2.losses || a.name.localeCompare(b.name);
  80.             })[0];
  81.             return `Winner: ${winner.name}\n${winner.getGenerals()}`;
  82.         };
  83.  
  84.         this.kingdoms = {};
  85.     }
  86.  
  87.     const battlefield = new Battlefield();
  88.     kingdoms.forEach((kingdom) => battlefield.addKingdom(Object.values(kingdom)));
  89.     battles.forEach((battle) => battlefield.battle(battle));
  90.     return battlefield.getWinner();
  91. };
Advertisement
Add Comment
Please, Sign In to add comment