0

我的代码有问题。我认为我的问题很简单,但是我编译了 3 天,没有好的结果。我有三个图像。它们每次都一对一地出现在屏幕上。如果图像的侧面是向上、向下、向右或向左,用户可以从 4 个按钮中进行选择。另外,我想了解用户是否错了,然后我会计算错误。当用户犯 3 个错误时,游戏将停止。我在下面显示了代码。如果您有任何好主意,请帮助我。问题是在第一个循环中,运行正确。它在第一个 if 处运行。之后它执行循环,然后它不会进入第二个 if。如果它更有帮助,一些细节:我想制作一个程序,它将向用户显示图像。这个图像有 4 个侧面(上、下、右、左)。当图像在“上侧”时,用户必须点击向上按钮,当图像在“下侧”时,用户必须单击向下按钮等。用户最多可以执行 3 个错误。首先,程序在右侧显示图像,如果用户单击右键,那么我想在左侧显示“第二张图像”。如果用户不在左侧,那么我想添加一个错误(错误++)和在它显示第三张图像之后等等。我希望它对理解更有帮助。如果你不能请告诉我。我的程序在 Netbeans,java。谢谢

public void actionPerformed(ActionEvent e) 
{    
    while(errors<3)
    {
        image.setIcon(createImageIcon("visual1" + e.getActionCommand() + ".PNG"));
        if (k==1) 
        {
            if(e.getSource() == right_button)
            {
                image.setIcon(createImageIcon("visual2" + e.getActionCommand() + ".PNG"));          
            }          
        } 
        else if ( k==2 )
        {
            if(e.getSource() == left_button )
            {
                image.setIcon(createImageIcon("visual3" + e.getActionCommand() + ".PNG"));
            }
        }       
        else if (k==3 )
        {
            if(e.getSource() == up_button)
            {
                System.out.print("if3");
            }
        }
        else
        {
            errors++;
        }
        k=k+1;
    }
}
4

2 回答 2

0

我在您的 while 循环中看到的一个问题是它有陷入无限循环的风险,因为用作退出标准的变量仅在某些时候在 else 块中更新。我认为你应该重新安排你的逻辑:

  • 摆脱那个while循环,因为它只会造成麻烦。它对于线性命令行程序很有用,但对于像您这样的事件驱动的 GUI 程序则不适用。
  • 读入所有图像并在类构造函数中创建所有 ImageIcon,并将它们存储在变量中。无需多次重新读取图像(除非它们很大)。
  • 不要使用 while 循环,而是在上面的方法中增加错误变量,然后编写该方法,以便它根据错误的值(取决于类的状态)改变行为。

例如,

// somewhere in your code create your icons
Icon rightIcon = ......;
Icon leftIcon = .....;
Icon upIcon = .....;
Icon downIcon = .....;

// elsewhere in your code
public void actionPerformed(ActionEvent e) {
  if (errors >= 3) {
    // notify user of error
    return;  // end this method
  }

  // check if current icon matches image
  // if so, change icon
  // if not increment error
}

请注意, anenum Direction {UP, DOWN, LEFT, RIGHT}和 aMap<Direction, Icon>在这里可能会有所帮助。

于 2013-11-02T14:59:27.843 回答
0

您应该考虑在像这样更新您的 GUI 之后立即调用RepaintInvalidate -

    mainframe.repaint();
    mainframe.invalidate();

这里的大型机是您的 JFrame 对象。

于 2013-11-02T14:46:28.497 回答