0

I am creating a Binding of Isaac-esque Roguelike that is generated using an Array List using four Booleans. The four Booleans being North, East, South, and West. Corresponding to which doors is open.

The problem with Array Lists is that it can 'overlap'. For example, if I go east, than south, than west, than north, I'll be in a whole new room, and not the original.

Is there a way to stop this from happening, or at least prevent it? Such as if the room above room 1 (room 2) has south set to true, than north will be true in room 1 to connect the two rooms. Or if room 2 has south set to false, than north will be false in room 1 to stop overlap.

Here is my current code (I know my code isn't exactly clean and has a lot of magic numbers, but those shouldn't be important for this question)-

GameState:

public class GameState extends JFrame implements KeyListener {
Container contentPane=this.getContentPane();
Graphics bufferGraphics;

int characterX=463;
int characterY=486;
int oldCharacterX=463;
int oldCharacterY=486;
int xAxis;
int yAxis;
int minimapX=1300;
int minimapY=515;
Image characterNorth = CustomImages.createImageIcon("Images/characterNorth.jpg").getImage();
Image characterEast = CustomImages.createImageIcon("Images/characterEast.jpg").getImage();
Image characterSouth = CustomImages.createImageIcon("Images/characterSouth.jpg").getImage();
Image characterWest = CustomImages.createImageIcon("Images/characterWest.jpg").getImage();
Image brickWall = CustomImages.createImageIcon("Images/brickWall.jpg").getImage();
Image brickFloor = CustomImages.createImageIcon("Images/brickFloor.jpg").getImage();
Image character=characterNorth;
boolean pressed=false;
boolean minimap=true;

ArrayList<RoomState> map = new ArrayList<RoomState>();
RoomState currentRoom = new RoomState();
RoomState currentRoomState=new RoomState();


GameState() {
    this.setBounds(0, 0, 1680, 1050);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(this);
    setFocusable(true);
    requestFocusInWindow();
}

public void move(int x, int y) { //Check Move
    currentRoomState=currentRoomState.MoveToNextRoom(true, false, false, false);
    currentRoomState=currentRoomState.MoveToNextRoom(false, true, false, false);
    currentRoomState=currentRoomState.MoveToNextRoom(false, false, true, false);
    currentRoomState=currentRoomState.MoveToNextRoom(false, false, false, true);
}

public void paint(Graphics g) { //Graphics
    for(xAxis=58;xAxis<=858;xAxis=xAxis+50) {
        for(yAxis=81;yAxis<=881;yAxis=yAxis+50) {
            g.drawImage(brickFloor,xAxis,yAxis,null);
        }
        yAxis=31;
    }
    for(xAxis=8;xAxis<958;xAxis=xAxis+50) {
        g.drawImage(brickWall,xAxis,yAxis,null);
    }
    yAxis=931;
    for(xAxis=8;xAxis<=908;xAxis=xAxis+50) {
        g.drawImage(brickWall,xAxis,yAxis,null);
    }
    xAxis=8;
    for(yAxis=81;yAxis<=881;yAxis=yAxis+50) {
        g.drawImage(brickWall,xAxis,yAxis,null);
    }
    xAxis=908;
    for(yAxis=81;yAxis<=881;yAxis=yAxis+50) {
        g.drawImage(brickWall,xAxis,yAxis,null);
    }

    if(currentRoom.northDoor) {
        g.drawImage(brickFloor,458,31,null);
    }
    if(currentRoom.eastDoor) {
        g.drawImage(brickFloor,908,481,null);
    }
    if(currentRoom.southDoor) {
        g.drawImage(brickFloor,458,931,null);
    }
    if(currentRoom.westDoor) {
        g.drawImage(brickFloor,8,481,null);
    }

    g.drawImage(character,characterX,characterY,null);

    g.drawString("[ ]",minimapX,minimapY);
    g.setColor(Color.RED);
    g.drawString("[ ]", 1300, 515);
}

@Override
public void keyPressed(KeyEvent arg0) { //Character Rotation/Movement.
    if(pressed==false) {
        pressed=true;
        oldCharacterX=characterX;
        oldCharacterY=characterY;
        if(arg0.getKeyCode() == KeyEvent.VK_W || arg0.getKeyCode() == KeyEvent.VK_UP) {
            if(character==characterNorth) {
                if(characterY>86 && characterX>13 && characterX<913) {
                    characterY=characterY-50;
                }else if(currentRoom.northDoor && characterX==463) {
                    oldCharacterY=characterY;
                    characterY=characterY-50;
                    if(characterY==-14) {
                        if(currentRoom.rs_NorthDoor != null) {
                            currentRoom=currentRoom.rs_NorthDoor;
                        }else {
                            RoomState nextRoom = new RoomState(currentRoom,false, false, true, false);
                            currentRoom.rs_NorthDoor = nextRoom;
                            map.add(nextRoom);
                            currentRoom = nextRoom;
                            nextRoom = null;
                        }
                        minimapY=minimapY-10;
                        characterX=463;
                        characterY=936;
                        repaint();
                    }
                }
            }else {
                character=characterNorth;
            }
        }
        if(arg0.getKeyCode() == KeyEvent.VK_A || arg0.getKeyCode() == KeyEvent.VK_LEFT) {
            if(character==characterWest && characterY>36 && characterY<926) {
                if(characterX>63) {
                    oldCharacterX=characterX;
                    characterX=characterX-50;
                }else if(currentRoom.westDoor && characterY==486) {
                    oldCharacterX=characterX;
                    characterX=characterX-50;
                    if(characterX==-37) {
                        if(currentRoom.rs_WestDoor != null) {
                            currentRoom = currentRoom.rs_WestDoor;
                        }else {
                            RoomState nextRoom = new RoomState(currentRoom,false, true, false, false);
                            currentRoom.rs_WestDoor = nextRoom;
                            map.add(nextRoom);
                            currentRoom = nextRoom;
                            nextRoom = null;
                        }
                        minimapX=minimapX-8;
                        characterX=913;
                        characterY=486;
                        repaint();
                    }
                }
            }else {
                character=characterWest;
            }
        }
        if(arg0.getKeyCode() == KeyEvent.VK_S || arg0.getKeyCode() == KeyEvent.VK_DOWN) {
            if(character==characterSouth) {
                if(characterY<871 && characterX>13 && characterX<913) {
                    oldCharacterY=characterY;
                    characterY=characterY+50;
                }else if(currentRoom.southDoor && characterX==463) {
                    oldCharacterY=characterY;
                    characterY=characterY+50;
                    if(characterY==986) {
                        if(currentRoom.rs_SouthDoor != null) {
                            currentRoom=currentRoom.rs_SouthDoor;
                        }else {
                            RoomState nextRoom = new RoomState(currentRoom,true, false, false, false);
                            currentRoom.rs_SouthDoor = nextRoom;
                            map.add(nextRoom);
                            currentRoom = nextRoom;
                            nextRoom = null;
                        }
                        minimapY=minimapY+10;
                        characterX=463;
                        characterY=36;
                        repaint();
                    }
                }
            }else {
                character=characterSouth;
            }
        }
        if(arg0.getKeyCode() == KeyEvent.VK_D || arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
            if(character==characterEast && characterY>36 && characterY<926) {
                if(characterX<848) {
                    oldCharacterX=characterX;
                    characterX=characterX+50;
                }else if(currentRoom.eastDoor && characterY==486) {
                    oldCharacterX=characterX;
                    characterX=characterX+50;
                    if(characterX==963) {
                        if(currentRoom.rs_EastDoor != null) {
                            currentRoom = currentRoom.rs_EastDoor;
                        }else {
                            RoomState nextRoom = new RoomState(currentRoom,false, false, false, true);
                            currentRoom.rs_EastDoor = nextRoom;
                            map.add(nextRoom);
                            currentRoom = nextRoom;         
                            nextRoom = null;
                        }
                        minimapX=minimapX+8;
                        characterX=13;
                        characterY=486;
                        repaint();
                    }
                }
            }else {
                character=characterEast;
            }
        }
        if(oldCharacterX != characterX || oldCharacterY != characterY) {
            repaint(oldCharacterX,oldCharacterY,40,40);
        }
        repaint(characterX,characterY,40,40);
    }
}

@Override
public void keyReleased(KeyEvent arg0) { //Prevents Holding Down Keys.
    if(arg0.getKeyCode() == KeyEvent.VK_W || arg0.getKeyCode() == KeyEvent.VK_UP) { 
        pressed=false;
    }
    if(arg0.getKeyCode() == KeyEvent.VK_A || arg0.getKeyCode() == KeyEvent.VK_LEFT) {
        pressed=false;
    }
    if(arg0.getKeyCode() == KeyEvent.VK_S || arg0.getKeyCode() == KeyEvent.VK_DOWN) {
        pressed=false;
    }
    if(arg0.getKeyCode() == KeyEvent.VK_D || arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
        pressed=false;
    }
}

@Override
public void keyTyped(KeyEvent arg0) {
}

}

RoomState:

public class RoomState {
boolean northDoor;
boolean eastDoor;
boolean southDoor;
boolean westDoor;
boolean doorsOpen;
int northRoll;
int eastRoll;
int southRoll;
int westRoll;
Random r=new Random();

//Reference to the adjacent rooms
RoomState rs_NorthDoor=null;
RoomState rs_EastDoor=null;
RoomState rs_SouthDoor=null;
RoomState rs_WestDoor=null;

RoomState() { //Initial
    while(!doorsOpen) {
        northRoll=r.nextInt(6)+1;
        eastRoll=r.nextInt(6)+1;
        southRoll=r.nextInt(6)+1;
        westRoll=r.nextInt(6)+1;
        if(northRoll==1) {
            northDoor=true;
        }else {
            northDoor=false;
        }
        if(eastRoll==1) {
            eastDoor=true;
        }else {
            eastDoor=false;
        }
        if(southRoll==1) {
            southDoor=true;
        }else {
            southDoor=false;
        }
        if(westRoll==1) {
            westDoor=true;
        }else {
            westDoor=false;
        }
        if(northDoor==false && eastDoor==false && southDoor==false && westDoor==false) {
            doorsOpen=false;
        }else {
            doorsOpen=true;
        }
    }
}

RoomState(RoomState previousState, boolean north, boolean east, boolean south, boolean west) {
    this();

    if(north) {
        rs_NorthDoor=previousState;
        northDoor=true;
    }else if(east) {
        rs_EastDoor=previousState;
        eastDoor=true;
    }else if(south) {
        rs_SouthDoor=previousState;
        southDoor=true;
    }else if(west) {
        rs_WestDoor=previousState;
        westDoor=true;
    }
}

public RoomState MoveToNextRoom(boolean north, boolean east, boolean south, boolean west) {
    if(north) {
        if(rs_NorthDoor==null) {
            rs_NorthDoor=new RoomState(this,north,east,south,west);
        }
        return rs_NorthDoor;
    }
    if(east) {
        if(rs_EastDoor==null) {
            rs_EastDoor=new RoomState(this,north,east,south,west);
        }
        return rs_EastDoor;
    }
    if(south) {
        if(rs_SouthDoor==null) {
            rs_SouthDoor=new RoomState(this,north,east,south,west);
        }
        return rs_SouthDoor;
    }
    if(west) {
        if(rs_WestDoor==null) {
            rs_WestDoor=new RoomState(this,north,east,south,west);
        }
        return rs_WestDoor;
    }
    return null;
}

}

224634
  • 11
  • 5
  • I'm confused by what you mean overlap? If you go east, will North, south etc still remain the same or will the perspective shift? – GBlodgett Apr 26 '18 at 19:36
  • you just want to keep track of the rooms you visited? – Bentaye Apr 26 '18 at 19:50
  • @Bentaye It already keeps track of the room and stores them. You can go forwards and backwards in the dungeon however you want. But, as I said, if you go east, south, west, than north, you will not be in the original room, because you got there in a different way. You would be in the original if you went backwards though. – 224634 Apr 27 '18 at 18:29
  • @GBlodgett If you go east, you will be in a new room. in that new room, going north or south will generate new rooms. If you go back west, you will be in the original. This can go on forever. But, as I said, if you go east, that south, than west, than north, instead of going in a circle, for some reason it will generate a new room, because you got to that area by going through different room. You would return the original if you went back the way you came though. – 224634 Apr 27 '18 at 18:31
  • Keep track of your absolute coordinates, add any visited locations to a hash map or so. – Mad Physicist Apr 27 '18 at 18:38
  • When you generate a new room, don't forget to check all four directions to see if they are in the map as well. If they are, you don't get to pick whether there is a door or not randomly. – Mad Physicist Apr 27 '18 at 18:39
  • Please indent your code properly. – Mad Physicist Apr 27 '18 at 18:40

0 Answers0