有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

试图将java if/else转换为循环的数组

作为大学学习的一部分,我正在构建一个Java游戏,并试图将大量if/else语句转换为循环

当前的非工作代码为:

    public void kickBall() {
        if(ballDirection == 1) {
            for (int y = 0; y < 15; y++)
            {
                gamePosition[ballPositionX][ballPositionY].setIcon(bg_icon);
                gamePosition[ballPositionX][++ballPositionY].setIcon(ball_icon);
                if(y == baby2PositionY) {
                    gamePosition[ballPositionX][ballPositionY].setIcon(baby2_icon);
                    ballDirection = 2;
                }
            }

Eclipse控制台日志:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 16
    at CBabyBallBounce.kickBall(CBabyBallBounce.java:613)
    at CBabyBallBounce$14.actionPerformed(CBabyBallBounce.java:516)
    at javax.swing.Timer.fireActionPerformed(Unknown Source)
    at javax.swing.Timer$DoPostEvent.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

第613行是第二个游戏位置线,第516行是方法调用,但我很难理解问题是什么,我将如何纠正它

以前的代码(如果有用的话)

        if (ballPositionY == 1 && ballDirection == 1) {
                gamePosition[ballPositionX][ballPositionY].setIcon(bg_icon);
                gamePosition[ballPositionX][++ballPositionY].setIcon(ball_icon);
            }
            else if(ballPositionY == 2 && ballDirection == 1) {
                gamePosition[ballPositionX][ballPositionY].setIcon(bg_icon);
                gamePosition[ballPositionX][++ballPositionY].setIcon(ball_icon);
            }
etc..

游戏位置代码-这在13x16网格布局JPanel中:

    private JButton gamePosition[][] = new JButton[13][16];
.....

    for (int i=0; i<13; i++)
        for (int j=0; j<16; j++)
        {
            JButton game_display = new JButton(bg_icon);
            game_display.setContentAreaFilled(false);
            game_display.setBorder(null);
            game_display.setFocusable(false);
            gamePosition[i][j] = game_display;
            gamePosition[i][j].setFocusable(false);

            if(j==8)
            {
                gamePosition[i][j].setIcon(wall_icon);
            }
        }

谢谢


共 (1) 个答案

  1. # 1 楼答案

    代码中有两个问题:

    1. 您尚未检查数组的边界
    2. 您尚未检查null

    按如下方式操作:

    public void kickBall() {
        if (ballDirection == 1) {
            for (int y = 0; y < 15 && ballPositionX < gamePosition.length
                    && ballPositionY < gamePosition[ballPositionX].length
                    && gamePosition[ballPositionX][ballPositionY] != null; y++) {
                gamePosition[ballPositionX][ballPositionY].setIcon(bg_icon);
                ballPositionY++;
                if (ballPositionY < gamePosition[ballPositionX] && gamePosition[ballPositionX][ballPositionY] != null) {
                    gamePosition[ballPositionX][ballPositionY].setIcon(ball_icon);
                    if (y == baby2PositionY) {
                        gamePosition[ballPositionX][ballPositionY].setIcon(baby2_icon);
                        ballDirection = 2;
                    }
                }
            }
            // ...
        }
        // ...
    }