-1

These 4 if statements in this KeyListener check what arrow key was entered. I would like to make this more efficient by combining the 4 if statements into a more concise switch statement or conditional statement.

How can I combine the 4 if statements into 1 conditional or switch statement?

class MyKeyListener implements KeyListener {

    public void keyReleased(KeyEvent e) { }

    public void keyTyped(KeyEvent e) {}


    public void keyPressed(KeyEvent e) {

        int keyCode = e.getKeyCode();



        for (int i=0; i < a.length;i++){
            for (int k=0; k < a[i].length;k++){
                Contents tileLeft = lr.getTile(levelData, i-1, k);
                Contents tileUp = lr.getTile(levelDate, i, k+1);
                Contents tileRight = lr.getTile(levelDate, i+1, k);
                Contents tileDown = lr.getTile(levelData, i, k-1);


                if(keyCode == KeyEvent.VK_LEFT) {     

                    if (tileLeft == Contents.EMPTY || tileLeft == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i-1][k] = Contents.PLAYER;                              
                    }
                }

                if(keyCode == KeyEvent.VK_UP) {


                    if (tileUp == Contents.EMPTY || tileUp == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i][k+1] = Contents.PLAYER;                              
                    }
                }

                if(keyCode == KeyEvent.VK_RIGHT) {

                    if (tileRight == Contents.EMPTY || tileRight == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i+1][k] = Contents.PLAYER;                              
                    }

                }

                if(keyCode == KeyEvent.VK_DOWN) {


                    if (tileDown == Contents.EMPTY || tileDown == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i][k-1] = Contents.PLAYER;                              
                    }
                }


            }
        }
    }

}
tim
  • 467
  • 5
  • 12
  • 2
    Use a `switch...case`. – AntonH Apr 10 '14 at 20:18
  • 1
    Consider using an enum of Direction and Key Bindings, not a KeyListener as per [this example](http://stackoverflow.com/a/21817447/522444) (run it to see). Also see [this similar example](http://stackoverflow.com/a/12545773/522444). – Hovercraft Full Of Eels Apr 10 '14 at 20:30

1 Answers1

0

you can try using else if to combine all of the statements into one, or using a switch.

E.g.

//Use else if and define the condition like you normally do for an if statement
            if(keyCode == KeyEvent.VK_LEFT) {

                if (tileLeft == Contents.EMPTY || tileLeft == Contents.GOAL) {
                    levelData[i][k] = Contents.EMPTY;
                    levelData[i-1][k] = Contents.PLAYER;
                }

            } else if(keyCode == KeyEvent.VK_UP) {

                if (tileUp == Contents.EMPTY || tileUp == Contents.GOAL) {
                    levelData[i][k] = Contents.EMPTY;
                    levelData[i][k+1] = Contents.PLAYER;
                }

            }else if(keyCode == KeyEvent.VK_RIGHT) {

                if (tileRight == Contents.EMPTY || tileRight == Contents.GOAL) {
                    levelData[i][k] = Contents.EMPTY;
                    levelData[i+1][k] = Contents.PLAYER;
                }

            }else if(keyCode == KeyEvent.VK_DOWN) {

                if (tileDown == Contents.EMPTY || tileDown == Contents.GOAL) {
                    levelData[i][k] = Contents.EMPTY;
                    levelData[i][k-1] = Contents.PLAYER;
                }

            }

            /**
             * Alternatively you could use a switch case statement
             * The same principle with the if statement above,  will give you the same result
             */
            switch (keyCode) {

                case KeyEvent.VK_LEFT:

                    if (tileLeft == Contents.EMPTY || tileLeft == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i-1][k] = Contents.PLAYER;
                    }

                    break;

                case KeyEvent.VK_UP:

                    if (tileUp == Contents.EMPTY || tileUp == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i][k+1] = Contents.PLAYER;
                    }

                    break;

                case KeyEvent.VK_RIGHT:

                    if (tileRight == Contents.EMPTY || tileRight == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i+1][k] = Contents.PLAYER;
                    }

                    break;

                case KeyEvent.VK_DOWN:

                    if (tileDown == Contents.EMPTY || tileDown == Contents.GOAL) {
                        levelData[i][k] = Contents.EMPTY;
                        levelData[i][k-1] = Contents.PLAYER;
                    }

                    break;
            }

Hope this helps. :)

Luke
  • 14
  • 1