@Override
    public GameMap generateMap(boolean visual, int x, int y) {
        this.visual = visual;
        numFloor = (int) (x * y * percentFill);

        GameMap retMap = new GameMap(x, y);
        retMap.fillMap(MapCellWall.getInstance());
        for (int i = 0; i < initFloors; i++) {
            retMap.setCell(rand.nextInt(x - 2) + 1, rand.nextInt(y - 2) + 1, MapCellFloor.getInstance());
        }
        //System.out.println(numFloor);
        for (int i = 0; i < numFloor; i++) {
            doWalk(retMap);
        }

        if (visual) {
            Visualizer.displayMap(retMap);
        }
        Pair<Integer, Integer> pair;
        do {
            pair = new Pair<Integer, Integer>(rand.nextInt(x - 2) + 1, rand.nextInt(y - 2) + 1);
            if (visual) {
                IMapCell temp = retMap.getCell(pair);
                retMap.setCell(pair, MapCellEntry.getInstance());
                Visualizer.displayMap(retMap);
                retMap.setCell(pair, temp);
            }
        } while (!retMap.getCell(pair).isPassable());
        retMap.setEntry(pair);
        retMap.setCell(pair, MapCellEntry.getInstance());

        do {
            pair = new Pair<Integer, Integer>(rand.nextInt(x - 2) + 1, rand.nextInt(y - 2) + 1);
            if (visual) {
                IMapCell temp = retMap.getCell(pair);
                retMap.setCell(pair, MapCellExit.getInstance());
                Visualizer.displayMap(retMap);
                retMap.setCell(pair, temp);
            }
        } while (!retMap.getCell(pair).isPassable() && !retMap.getEntry().equals(pair));
        retMap.setExit(pair);
        retMap.setCell(pair, MapCellExit.getInstance());

        return retMap;
    }