如何解决重置无法正常进行计数器问题,错过了公爵小姐错过时影像显示不正确
我正在使用“重置”按钮进行学校作业,但在数小时的时间内仍无法弄清楚如何重置计数器。我认为这与鼠标单击代码中的某些内容有关,但我无法弄清楚。对于公爵小姐的问题,我无法显示它,因此当我错过公爵雕像时,图像不会显示。
import java.awt.*;
import java.awt.event.*;
public class CatchDuke extends Frame implements ItemListener,ActionListener {
static final int MAX_LEVEL = 5;
static final int INITIAL_LEVEL = 1;
int hits = 0;
int misses = 0;
// Labels and controls
Label hitLabel;
Label missLabel;
Button reset;
Choice levelChoice;
// the canvas
DukeCanvas canvas;
/**
* Constructor
*/
public CatchDuke() {
setTitle("Catch the Duke");
setLayout(new BorderLayout());
// create display and control
Panel topPanel = new Panel(new GridLayout(2,1));
add(topPanel,BorderLayout.norTH);
Panel labelPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
topPanel.add(labelPanel);
Label label = new Label("Number of Hits:");
labelPanel.add(label);
hitLabel = new Label(" 0");
labelPanel.add(hitLabel);
label = new Label("Number of Misses:");
labelPanel.add(label);
missLabel = new Label(" 0");
labelPanel.add(missLabel);
Panel controlPanel = new Panel(new FlowLayout(FlowLayout.LEFT));
topPanel.add(controlPanel);
label = new Label("Select Level:");
controlPanel.add(label);
levelChoice = new Choice();
for(int i=1; i<=MAX_LEVEL; i++) {
levelChoice.add(i+" ");
}
levelChoice.select(INITIAL_LEVEL-1);
controlPanel.add(levelChoice);
levelChoice.addItemListener(this);
reset = new Button("Reset");
controlPanel.add(reset);
reset.addActionListener(this);
// create the canvas
canvas = new DukeCanvas();
add(canvas,BorderLayout.CENTER);
canvas.setLevel(levelChoice.getSelectedindex());
} // end of constructor
/**
* Implementing ItemListener
*/
public void itemStateChanged(ItemEvent event) {
canvas.setLevel(levelChoice.getSelectedindex());
}
@Override
public void actionPerformed(ActionEvent event) {
levelChoice.select(INITIAL_LEVEL-1);
canvas.setLevel(INITIAL_LEVEL-1);
hits = 0;
misses = 0;
hitLabel.setText(String.valueOf(hits));
missLabel.setText(String.valueOf(misses));
}
/**
* the DukeCanvas class
*/
class DukeCanvas extends Canvas implements MouseListener,MouseMotionListener {
// duke images
Image duke,dukeWave,dukeMiss;
// current position of duke
int dukeX,dukeY;
// size of duke
int dukeWidth,dukeHeight;
// number of hits and misses
int hits = 0;
int misses = 0;
boolean hit = false;
// level of difficulty
private int level = 0; // add private
public void setLevel(int level) {
this.level = level;
}
/**
* Constructor
*/
public DukeCanvas() {
setBackground(Color.white);
// load images
Toolkit toolkit = Toolkit.getDefaultToolkit();
duke = toolkit.getimage("duke.gif");
dukeWave = toolkit.getimage("dukeWave.gif");
dukeMiss = toolkit.getimage("dukeMiss.gif");
addMouseListener(this);
addMouseMotionListener(this);
} // end of constructor
/**
* painting the component
*/
public void paint(Graphics g) {
// get canvas width and height
int canvasWidth = getSize().width-2;
int canvasHeight = getSize().height-2;
// draw a border
g.drawRect(0,getSize().width,getSize().height);
if(hit) {
// display hit image
g.drawImage(dukeWave,dukeX,dukeY,this);
}
// else if (width)
// {
// g.drawImage(dukeMiss,this);
// }
else
{
// get image width and height
dukeWidth = duke.getWidth(this);
dukeHeight = duke.getHeight(this);
// calculate the width and height of the display area
int dWidth = canvasWidth - dukeWidth;
int dHeight = canvasHeight - dukeHeight;
// generate a new position for the duke and draw it
dukeX = (int)(Math.random()*1000) % dWidth;
dukeY = (int)(Math.random()*1000) % dHeight;
g.drawImage(duke,this);
}
}
/**
* Implementing MouseListener
*/
public void mouseClicked(MouseEvent event) {
if(hit) { // No successive hits allowed
hit = true;
repaint();
return;
}
int x = event.getX();
int y = event.getY();
if((dukeX < x && x < dukeX+dukeWidth) &&
(dukeY < y && y < dukeY+dukeHeight)) {
hits++;
hitLabel.setText(String.valueOf(hits));
hit = true;
}
else {
misses++;
Toolkit.getDefaultToolkit().beep();
missLabel.setText(String.valueOf(misses));
hit = false;
}
repaint();
}
我已经知道重置按钮存在反问题,但我不确定问题的哪一部分出了错。不确定如何使Duke Miss图片正确显示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。