Beispiel #1
0
  /**
   * Returns random move (attack or move).
   *
   * @param overworld overworld
   * @param player player
   * @param forceAttack true if we want to force an attack if possible
   * @param forceMove true if we want to force a move if possible
   * @param types types of moves allowed (attack or move)
   * @return random move
   */
  protected static Move getRandomMove(
      Overworld overworld,
      Player player,
      boolean forceAttack,
      boolean forceMove,
      Move.Type... types) {

    List<Region> regions = PlayerUtils.getPlayerRegions(overworld, player, false);

    // check possible moves
    boolean allowAttack = false;
    boolean allowMove = false;
    for (Move.Type type : types) {
      switch (type) {
        case ATTACK:
          allowAttack = true;
          break;
        case MOVE:
          allowMove = true;
          break;
      }
    }

    // choose random region to take action with
    int regionIndex = Utils.random().nextInt(regions.size());
    int regionStartIndex = regionIndex;

    // check if region can take action

    // get regions to attack
    List<Region> attackRegions = RegionUtils.getAttacks(regions.get(regionIndex));
    List<Region> moveRegions = RegionUtils.getMoves(regions.get(regionIndex));

    // if region can't attack or move, check other regions if we force an attack or move
    while ((allowAttack && forceAttack && attackRegions.size() == 0)
        || (allowMove && forceMove && moveRegions.size() == 0)) {

      regionIndex++;

      if (regionIndex >= regions.size()) {
        regionIndex = 0;
      }

      // exit loop if we've checked all regions
      if (regionIndex == regionStartIndex) {
        break;
      }

      attackRegions = RegionUtils.getAttacks(regions.get(regionIndex));
      moveRegions = RegionUtils.getMoves(regions.get(regionIndex));
    }

    // region to attack
    if (allowAttack && attackRegions.size() > 0) {
      // choose random region to attack
      Region attackRegion = attackRegions.get(Utils.random().nextInt(attackRegions.size()));

      return new Move(Move.Type.ATTACK, regions.get(regionIndex), attackRegion);
    } else if (allowMove && moveRegions.size() > 0) {
      // choose random region to move to
      Region moveRegion = moveRegions.get(Utils.random().nextInt(moveRegions.size()));

      return new Move(Move.Type.MOVE, regions.get(regionIndex), moveRegion);
    }

    return new Move(Move.Type.END_PHASE);
  }