尝试将 java if/else 转换为循环
Trying to convert java if/else to loops
作为我大学学习的一部分,我正在构建一个 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.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.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.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 行是第二个 gamePosition 行,第 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..
gamePosition 代码 - 这是在 13x16 GridLayout 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);
}
}
谢谢
你的代码有两个问题:
- 你还没有检查数组的边界。
- 您还没有检查
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;
}
}
}
// ...
}
// ...
}
作为我大学学习的一部分,我正在构建一个 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.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.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.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 行是第二个 gamePosition 行,第 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..
gamePosition 代码 - 这是在 13x16 GridLayout 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);
}
}
谢谢
你的代码有两个问题:
- 你还没有检查数组的边界。
- 您还没有检查
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;
}
}
}
// ...
}
// ...
}