2013-09-01 3 views
0

자바 7에서 PC 용 최신 버전을 만들고 있지만 수정이 불가능한 큰 문제가 발생했습니다.내 Java 게임에서 if 문이 작동하지 않는 이유는 무엇입니까?

if 문이 스페이스 바를 눌렀을 때 수명이 0보다 길고 공의 y 좌표가 600보다 큰 경우에도 왜 실행되지 않습니까?

많은 인쇄 문과 로그 파일을 사용하여 이미 테스트했지만 아무 것도 작동하지 않습니다.

import javax.swing.ImageIcon; 
    import javax.swing.JFrame; 
    import javax.swing.JOptionPane; 

    import java.awt.*; 
    //import java.awt.event.KeyAdapter; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 

    public class Game extends JFrame implements Runnable , KeyListener { 
private static final long serialVersionUID = 1L; 

private Graphics dbg; 
private Image dbi; 

int level = 0; 
int lives = 6; 
int powerup = 0; 
int blocksGone = 0; 
int vy = 0; 
int vx = 0; 
int by = 640; 
int bx = 0; 
int[] powerups = new int[8]; 

ImageIcon i0 = new ImageIcon("paddle.gif"); 
ImageIcon i1 = new ImageIcon("sidebar.gif"); 
ImageIcon i2 = new ImageIcon("laserpaddle.gif"); 
ImageIcon i3 = new ImageIcon("paddleCannon.gif"); 
ImageIcon i4 = new ImageIcon("laser.gif"); 
ImageIcon i5 = new ImageIcon("bullet.gif"); 
ImageIcon i6 = new ImageIcon("lifeIcon.gif"); 
ImageIcon i7 = new ImageIcon("ball.png"); 
ImageIcon i8 = new ImageIcon("bomb.png"); 
ImageIcon i9 = new ImageIcon("atomic.png"); 
//ImageIcon i10 = new ImageIcon("bullet.gif"); 

Image paddle; 
Image side; 
Image bullet; 
Image bomb; 
Image ball; 
Image atomc; 
Image life; 
Image dead; 

int paddlex = 400; 
int pdx = 0; 


public Game() { 
    // TODO Auto-generated constructor stub 

    setVisible(true); 
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
    setTitle("Breakout Smash"); 
    setSize(1024,560); 
    setResizable(false); 

    this.addKeyListener(this); 

} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 

    try { 

     init(); 

     while (true) { 

      move(); 
      Thread.sleep(5); 

     } 

    } catch (Exception e) { 

     System.out.println ("java.lang.Execption in line 25, class Game. Stacktrace:"); 
     e.printStackTrace(); 

    } 
    } 

    // TODO Auto-generated method stub 

private void init() { 
    // TODO Auto-generated method stub 

    paddle = i0.getImage(); 
    side = i1.getImage(); 
    ball = i7.getImage(); 

} 

public void paint (Graphics g) { 

    dbi = createImage (getWidth(),getHeight()); 
    dbg = dbi.getGraphics(); 
    paintComponent(dbg); 
    g.drawImage(dbi , 0 , 0 , this); 

} 

public void paintComponent(Graphics g) { 
    // TODO Auto-generated method stub 

    super.paint(g); 

    g.setColor(Color.DARK_GRAY); 
    g.fillRect(0,0,getWidth(),getHeight()); 
    g.drawImage(side, this.getWidth() - side.getWidth(null), 0, null); 
    g.setColor(Color.CYAN); 
    g.drawString("Score", 950, 50); 
    g.drawString("Lives: " + lives , 880, 50); 
    g.drawImage(paddle, paddlex, 520, null); 

    g.drawImage(ball, bx, by, null); 

    repaint(); 

} 

public void move() { 

    //if (by <= getHeight()) { 

    if (paddlex > 0 && paddlex < getWidth() - side.getWidth(null) - 50) { 

     paddlex += pdx; 

    } if (paddlex >= getWidth() - side.getWidth(null) - 50) { 

     paddlex-= 2; 

    } if (paddlex <= 0) { 

     paddlex++; 

    } 

    if (bx > 0 && bx < getWidth() - side.getWidth(null) && by > 10 && by < getHeight()) { 

     bx += vx; 
     by -= vy; 

    } if (by > 560) { 

     by = 575; 

     bx = 0; 

    } if (bx < 5) { 

     bx += 3; 
     vx = vx * -1; 

    } if (bx > getWidth() - side.getWidth(null) - 5) { 

     bx -= 3; 
     vx = vx * -1; 

    } if (by < 15) { 

     by++; 
     vy = vy * -1; 

    } if (by >= 515 && by <= 515 + paddle.getHeight(null) && bx + 8 > paddlex && bx + 8 < paddlex + paddle.getWidth(null)) { 

     vy = vy * -1; 
     vy ++; 
     vx *= pdx; 

     /*if (pdx == -2) { 

      vx = vx * -2; 

     } 

     if (pdx == 2) { 

      vx = vx * 2; 

     }*/ 

    } 

    //} else { 

     //vy = 0; 
     //vx = 0; 

    //} 

} 

@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 

    int keyCode = e.getKeyCode(); 

    if (keyCode == KeyEvent.VK_ESCAPE) { 

     int quit = JOptionPane.showConfirmDialog(null, "Are you sure you want to quit?", "Quit?", JOptionPane.YES_NO_OPTION); 
     if (quit == 0) System.exit(0); 

    } 

    else if (keyCode == KeyEvent.VK_LEFT) { 

     pdx = -2; 

    } 

    else if (keyCode == KeyEvent.VK_RIGHT) { 

     pdx = 2; 

    }  
} 

@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 

    int keyCode = e.getKeyCode(); 

    if (keyCode == KeyEvent.VK_LEFT) { 

     pdx = 0; 

    } 

    else if (keyCode == KeyEvent.VK_RIGHT) { 

     pdx = 0; 

    } 

    else if (keyCode == KeyEvent.VK_SPACE) { 

     //if (by > 600 && lives >= 0) { // this is my problem here 

      lives--; 

      vy = 1; 
      vx = pdx; 

      bx = paddlex + 10; 
      by = 500; 

      System.out.println ("Space hit!"); 

      /*if (lives == 0) { 

       JOptionPane.showMessageDialog(null, "Game Over!" , "!", JOptionPane.WARNING_MESSAGE); 

      } 

     } */  

    } 

} 

} 

내 코드에 표시되지 않는 항목이 있어야합니다. 큰 문제는 우주 왕복 경기에서 공을 부활시키고 동시에 한 생명을 빼지 않는 이유는 무엇입니까?

+0

당신은 문이 잘못되는 경우의 어느 부분을 이해하는 일부 디버그 정보를 추가 할 수 있습니다. – BobTheBuilder

+0

한때 keyCode 대신 keyChar를 사용해야했습니다. 어쩌면 그것이 당신 문제입니다. –

+2

스택 오버플로에 오신 것을 환영합니다! 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다.) –

답변

0

는 경우 이전

System.out.println("by:"+by+" lives:"+lives); 

를 넣습니다.

가지 경우는 :

if(you dont see anything in the console){ 
    something is wrong with the way you get the input 
} 
else if(the value of `by` OR `lives` are not correct){ 
    search somewhere else in your code where you are changing the by and lives 
} 
관련 문제