public Simulation(Environment wumpusEnvironment, int maxSteps, boolean nonDeterministic) {

    // start the simulator
    simulationRunning = true;

    // outputWriter = outWriter;
    transferPercept = new TransferPercept(wumpusEnvironment);
    environment = wumpusEnvironment;

    agent = new Agent(environment, transferPercept, nonDeterministic);

    environment.placeAgent(agent);
    environment.printEnvironment();

    printCurrentPerceptSequence();

    StateSeq.add(lastAction);

    try {

      System.out.println("Current score: " + currScore);
      // outputWriter.write("Current score: " + currScore + "\n");

      while (simulationRunning == true && stepCounter < maxSteps) {

        System.out.println("Last action: " + Action.printAction(lastAction));
        // outputWriter.write("Last action: " + Action.printAction(lastAction) + "\n");

        System.out.println("Time step: " + stepCounter);
        // outputWriter.write("Time step: " + stepCounter + "\n");

        int action = agent.chooseAction();
        handleAction(action);

        StateSeq.add(action);

        wumpusEnvironment.placeAgent(agent);

        environment.printEnvironment();
        printCurrentPerceptSequence();

        System.out.println("Current score: " + currScore);
        // outputWriter.write("Current score: " + currScore + "\n");

        // Scanner in = new Scanner(System.in);
        // in.next();

        stepCounter += 1;

        if (stepCounter == maxSteps || simulationRunning == false) {
          System.out.println("Last action: " + Action.printAction(lastAction));
          // outputWriter.write("Last action: " + Action.printAction(lastAction) + "\n");

          System.out.println("Time step: " + stepCounter);
          // outputWriter.write("Time step: " + stepCounter + "\n");

          lastAction = Action.END_TRIAL;
          StateSeq.add(lastAction);
        }

        if (agent.getHasGold() == true) {
          System.out.println("\n" + agent.getName() + " found the GOLD!!");
          // outputWriter.write("\n" + agent.getName() + " found the GOLD!!\n");
        }
        if (agent.getIsDead() == true) {
          System.out.println("\n" + agent.getName() + " is DEAD!!");
          // outputWriter.write("\n" + agent.getName() + " is DEAD!!\n");
        }
      }

    } catch (Exception e) {
      System.out.println("An exception was thrown: " + e);
      e.printStackTrace();
    }

    printEndWorld();
  }
  public void handleAction(int action) {

    try {

      if (action == Action.GO_FORWARD) {

        if (environment.getBump() == true) environment.setBump(false);

        agent.goForward();
        environment.placeAgent(agent);

        if (environment.checkDeath() == true) {

          currScore += deathCost;
          simulationRunning = false;

          agent.setIsDead(true);
        } else {
          currScore += actionCost;
        }

        if (environment.getScream() == true) environment.setScream(false);

        lastAction = Action.GO_FORWARD;
      } else if (action == Action.TURN_RIGHT) {

        currScore += actionCost;
        agent.turnRight();
        environment.placeAgent(agent);

        if (environment.getBump() == true) environment.setBump(false);
        if (environment.getScream() == true) environment.setScream(false);

        lastAction = Action.TURN_RIGHT;
      } else if (action == Action.TURN_LEFT) {

        currScore += actionCost;
        agent.turnLeft();
        environment.placeAgent(agent);

        if (environment.getBump() == true) environment.setBump(false);
        if (environment.getScream() == true) environment.setScream(false);

        lastAction = Action.TURN_LEFT;
      } else if (action == Action.GRAB) {

        if (environment.grabGold() == true) {

          currScore += goldCost;
          simulationRunning = false;

          agent.setHasGold(true);
        } else currScore += actionCost;

        environment.placeAgent(agent);

        if (environment.getBump() == true) environment.setBump(false);
        if (environment.getScream() == true) environment.setScream(false);

        lastAction = Action.GRAB;
      } else if (action == Action.SHOOT) {

        if (agent.shootArrow() == true) {

          if (environment.shootArrow() == true) environment.setScream(true);

          currScore += shootCost;
        } else {

          if (environment.getScream() == true) environment.setScream(false);

          currScore += actionCost;
        }

        environment.placeAgent(agent);

        if (environment.getBump() == true) environment.setBump(false);

        lastAction = Action.SHOOT;
      } else if (action == Action.NO_OP) {

        environment.placeAgent(agent);

        if (environment.getBump() == true) environment.setBump(false);
        if (environment.getScream() == true) environment.setScream(false);

        lastAction = Action.NO_OP;
      }

    } catch (Exception e) {

      System.out.println("An exception was thrown: " + e);
    }
  }