防止阵列列表重叠?

时间:2018-04-26 18:28:58

标签: java arrays eclipse list procedural-generation

我正在创建一个使用四个布尔值的阵列列表生成的Isaac-esque Roguelike的绑定。四个布尔人是北,东,南和西。对应哪扇门是敞开的。

数组列表的问题在于它可以重叠“#”。例如,如果我向东,而不是向南,向西,而不是北,我会在一个全新的房间,而不是原来的。

有没有办法阻止这种情况发生,或至少阻止它?如果房间1(房间2)以上的房间南边设置为真,那么房间1的北面将是真的连接两个房间。或者,如果房间2的南边设置为假,则在房间1中北方将是假的,以便停止重叠。

这是我目前的代码(我知道我的代码并不完全干净并且有很多神奇的数字,但这些对于这个问题不重要) -

游戏状态:

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;
}

}

0 个答案:

没有答案