2012-03-05 2 views
0

나는 gui에서 주사위를 굴리고 있습니다. 반환 할 (random int 1-6) 숫자가 표시되고 있지만 표시 할 이미지가 표시되지 않습니다. 처음에는 올바른 이미지를 보여 주지만 결코 변경하지 않습니다. 여기에 코드입니다 :JAVA. 주사위 굴림을 인쇄하는 사람

public void layoutComponents() 
{ 
    Container container = frame.getContentPane(); 
    container.setLayout(new GridLayout(1, 1)); 
    diceRoll.setEditable(true); 
    container.add(button); 
    container.add(addPanel()); 
    //container.add(diceRoll); 
    frame.setSize(200, 200); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
} 

class DiceActions implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     layoutComponents(); 
     //diceRoll.append(Double.toString((int)numberRolled)); 
    } 

} 

public ImageIcon rollDice() 
{ 
    double numberRolled = (int)(Math.random() * 10 + 1); 
    ImageIcon image = dice1; 
    if (numberRolled > 6) 
    { 
     numberRolled -= 4; 
    } 
    if(numberRolled == 1) 
    { 
     image = dice1; 
     System.out.println("1"); 
     System.out.println(numberRolled); 
     return image = dice1; 
    } 
    else if(numberRolled == 2) 
    { 
     image = dice2; 
     System.out.println("2"); 
     return image = dice2; 
    } 
    else if(numberRolled == 3) 
    { 
     image = dice3; 
     System.out.println("3"); 
     return image = dice3; 
    } 
    else if(numberRolled == 4) 
    { 
     image = dice4; 
     System.out.println("4"); 
     return image = dice4; 
    } 
    else if(numberRolled == 5) 
    { 
     image = dice5; 
     System.out.println("5"); 
     return image = dice5; 
    } 
    else if(numberRolled == 6) 
    { 
     image = dice6; 
     System.out.println("6"); 
     return image = dice6; 
    } 
    else 
     System.out.println("never reached"); 
    System.out.println(numberRolled); 
    return image; 
} 

public JPanel addPanel() 
{ 
    JPanel panel = new JPanel(); 
    panel.add(new JLabel(rollDice())); 
    return panel; 
} 

public void addListeners() 
{ 
    DiceActions action = new DiceActions(); 
    button.addActionListener(action); 
} 
+0

dice1 이미지를 계속 표시합니다. – user1198199

+0

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 코드 블록에 일관성 있고 논리적 인 들여 쓰기를 사용하십시오. –

+3

GUI 코드가 잘못된 부분을 알려주기를 원하지만 모든 코드를 제공하지는 마십시오. 독자적으로 연구하는 한 가지 방법은 필수 요소로 줄이는 것입니다. 그래도 문제를 찾지 못하면 전체 내용을 게시 할 수있을만큼 작을 것입니다. – arcy

답변

1

double numberRolled = (int)(Math.random() * 10 + 1);

내가 (내가 JVM이 그것을 처리하는 방법을 의미)에 대한 확실하지 않다,하지만 그것은 일부 반올림 문제가 이렇게 원인이 될 수 있습니다 == 연산자 거짓을 제공합니다. 당신은 그것을 int로 타입 변환 했으므로 왜 그것을 int로 저장하지 않을까요?

return image = dice1;, return image = dice2; 등등 ...

왜 당신은 단순히`diceX를 반환하지 않는다 '? 로컬 ImageIcon 변수를 가질 필요가 없습니다. 그것은 여전히 ​​Java에서 작동 할 수 있습니다. 즉, C의 의미를 전달하지만 그렇게하지 않으려는 경우 예기치 않은 결과가 나올 수 있습니다.

0
double numberRolled = (int)(Math.random() * 10 + 1); 
ImageIcon image = dice1; 
if (numberRolled > 6) 
{ 
    numberRolled -= 4; 
} 

이 코드는 uniformly random numbers을 생성하지 못합니다. 코드로 게임을하는 사람은 누구나 의 결과가 무작위가 아니라는 것을 빨리 알게됩니다.

Lindent을 통해이 코드를 실행하여 읽기가 가능하도록하고 코드를 중간에 가져 왔습니다. 단지 물건의 일반적인 흐름 에주의 : 당신이 dice1image 초기화 한

ImageIcon image = dice1; 

if (numberRolled > 6) { 
    numberRolled -= 4; 
} 
if (numberRolled == 1) { 
    image = dice1; 
    System.out.println("1"); 
    System.out.println(numberRolled); 
    return image = dice1; 
} 
/* ... */ 
else if (numberRolled == 6) { 
    image = dice6; 
    System.out.println("6"); 
    return image = dice6; 
} else 
    System.out.println("never reached"); 

System.out.println(numberRolled); 
return image; 

참고. 이것은 아마도 이라는 나쁜 생각 일 것입니다. 버그를 찾기가 훨씬 어려워지기 때문입니다. 대신 을 null으로 초기화하십시오. 나머지 코드가 값을 올바르게 설정하지 않으면 다른 코드가 죽음 (NullPointerException)으로 비참하게됩니다.

하지만 그 모든 것을 버려라. 당신이하고 싶은 일은 배열 ~ 사이에 다이 이미지와 값 사이의 관계를 저장하는 것입니다. 코드 1/6, 버그가 적고 10, 12, 또는 20 면체로 확장하기가 쉽습니다.

관련 문제