private int fireSession(BattleshipsPlayer attacker, BattleshipsPlayer defender, BoardImpl board) {
   int maxShots = sizeX * sizeY;
   int shots = 0;
   while (board.getNumberOfShips() > 0 && shots < maxShots) {
     Position pos = attacker.getFireCoordinates(board);
     boolean hit = board.fire(pos);
     attacker.hitFeedBack(hit, board);
     defender.incoming(pos);
     ++shots;
   }
   return maxShots - shots;
 }
  @Override
  public GameResult run(BattleshipsPlayer playerA, BattleshipsPlayer playerB) {
    // Wrap players in proxys to avoid exploits and exceptions...
    BattleshipsPlayer pA = new ProxyPlayer(playerA);
    BattleshipsPlayer pB = new ProxyPlayer(playerB);

    // BattleshipsPlayer pA = playerA;
    // BattleshipsPlayer pB =playerB;

    int winsA = 0;
    int winsB = 0;
    pA.startMatch(rounds);
    pB.startMatch(rounds);
    for (int i = 0; i < rounds; ++i) {
      StartFleet fleetA = new StartFleet(ships);
      StartFleet fleetB = new StartFleet(ships);
      BoardImpl boardA = new BoardImpl(sizeX, sizeY);
      BoardImpl boardB = new BoardImpl(sizeX, sizeY);
      // Begin round
      pA.startRound(i + 1);
      pB.startRound(i + 1);
      // Place ships
      pA.placeShips(fleetA, boardA);
      pB.placeShips(fleetB, boardB);
      /*
      System.out.println("Player A board: ");
      System.out.println(boardA);
      System.out.println("Player B board: ");
      System.out.println(boardB);
      */
      // Attack
      int pointsB = fireSession(pB, pA, boardA);
      int pointsA = fireSession(pA, pB, boardB);
      pA.endRound(i + 1, pointsA, pointsB);
      pB.endRound(i + 1, pointsB, pointsA);
      if (pointsA > pointsB) ++winsA;
      else if (pointsB > pointsA) ++winsB;
    }
    int draws = rounds - winsA - winsB;
    pA.endMatch(winsA, winsB, draws);
    pB.endMatch(winsB, winsA, draws);
    int majorA = 0;
    int majorB = 0;
    if (winsA > winsB) {
      majorA = 1;
      majorB = -1;
    } else if (winsB > winsA) {
      majorA = -1;
      majorB = 1;
    }
    return new GameResult(majorA, winsA, majorB, winsB);
  }