Java 复位不';t工作不正常(反问题),未命中时Duke miss图像显示不正确

Java 复位不';t工作不正常(反问题),未命中时Duke miss图像显示不正确,java,actionlistener,mouselistener,Java,Actionlistener,Mouselistener,我正在用“重置”按钮完成一项学校作业,几个小时内我都不知道如何重置计数器。我认为这与鼠标点击的代码中的某些内容有关,但我无法理解。对于duke miss问题,我无法显示它,因此当我错过duke时,图像不会显示 import java.awt.*; import java.awt.event.*; public class CatchDuke extends Frame implements ItemListener, ActionListener { static final int

我正在用“重置”按钮完成一项学校作业,几个小时内我都不知道如何重置计数器。我认为这与鼠标点击的代码中的某些内容有关,但我无法理解。对于duke miss问题,我无法显示它,因此当我错过duke时,图像不会显示

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, 0, getSize().width, getSize().height);

            if(hit) {
                // display hit image
                g.drawImage(dukeWave, dukeX, dukeY, this);
            }
//            else if (width)
//          {
//              g.drawImage(dukeMiss, dukeX, dukeY, 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, dukeX, dukeY, 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();
        }
import java.awt.*;
导入java.awt.event.*;
公共类CatchDuke扩展框架实现ItemListener、ActionListener{
静态最终整数最大值=5;
静态最终int初始水平=1;
int hits=0;
int未命中=0;
//标签和控件
标签标签;
标签错误;
按钮复位;
选择层次选择;
//画布
杜克帆布;
/**
*建造师
*/
公共图书馆(){
setTitle(“抓住公爵”);
setLayout(新的BorderLayout());
//创建显示和控件
面板顶部面板=新面板(新网格布局(2,1));
添加(topPanel,BorderLayout.NORTH);
Panel labelPanel=新面板(新FlowLayout(FlowLayout.LEFT));
topPanel.add(标签面板);
标签=新标签(“点击次数:”);
添加(标签);
hitLabel=新标签(“0”);
labelPanel.add(hitLabel);
标签=新标签(“未命中次数:”);
添加(标签);
错误标签=新标签(“0”);
labelPanel.add(标签错误);
面板控制面板=新面板(新的FlowLayout(FlowLayout.LEFT));
topPanel.add(控制面板);
标签=新标签(“选择级别:”);
控制面板。添加(标签);
levelChoice=新选项();

对于(int i=1;我找到了重置计数器无法正常工作的原因。结果表明,我只需要在代码的一部分中使用hits=e.getmouseclick();和miss=e.getmouseclick()。