为什么我的游戏的重置按钮不起作用?

时间:2017-05-14 14:39:34

标签: java

我制作了一个重置​​按钮,它不会消除KeyListener的焦点,因此在点击按钮后游戏仍然可以播放。按钮的其余部分都是关于重置位置,清空arraylists和数组等等。但似乎每当我点击重启按钮时,玩家对象确实会到达它的起始点,x = 2 y = 0.但是在那之后,每当我移动时,我看到man对象/图片移动到的位置是之前,重启按钮根本不起作用。当点击重启按钮时,播放器对象实际上仍处于它所处的位置。我已经读到可能会在第二个面板下面添加,因此真正的面板没有变化?我不确定并需要你的帮助。

我的具体问题:为什么重置按钮不足以改变播放器/ man对象的位置,为什么它失败了?

package riddle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JFrame {

    private JPanel p2;
    private JButton reset;
    private GameDraw component;
    private Man m;


    public GameFrame() {
        this.setTitle("Riddle Man");
        this.setSize(719, 850);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        component = new GameDraw();
        m = new Man(component);
        component.addKeyListener(m);
        component.requestFocus();
        createButton();
        createPanel();
    }

    private void createButton() {
        reset = new JButton("Restart");
        ActionListener listener = new ClickListener();
        reset.addActionListener(listener);
    }

    private void createPanel() {
        p2 = new JPanel();
        p2.setLayout(null);
        component.setBounds(0, 0, 800, 800);
        reset.setBounds(0, 725, 100, 50);
        p2.add(component);
        p2.add(reset);
        add(p2);
    }

    class ClickListener implements ActionListener {

        public ClickListener(){

        }
        @Override
        public void actionPerformed(ActionEvent e) {
          reset.setFocusable(false);
          component.resetGame();
        }

    }
}



package riddle;

import org.apache.commons.lang3.StringUtils;
import java.awt.Color;
import static java.awt.Frame.NORMAL;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

public class GameField {

    public String[][] field;
    private String grass, wall, note, end, theRiddle, theAnswer;
    private ArrayList<Integer> arrayG;
    private ArrayList<Integer> arrayW;
    private ArrayList<Integer> arrayN;
    private ArrayList<Integer> arrayE;
    private Riddle riddle;
    private int instantRight, count, wrongs, retries;
    private boolean ok = false;

    public GameField() {
        field = new String[10][10];
        grass = "Grass";
        wall = "Wall";
        note = "Note";
        end = "End";
        theRiddle = "";
        theAnswer = "";
        instantRight = 0;
        count = 0;
        wrongs = 0;
        retries = 0;
        arrayG = new ArrayList<Integer>(Arrays.asList(0, 9, 10, 19, 20, 29, 30, 39, 40, 49, 50, 59, 60, 69, 70, 79, 80, 89, 90, 99));
        arrayW = new ArrayList<Integer>(Arrays.asList(1, 3, 4, 5, 6, 7, 8, 11, 18, 21, 22, 23, 24, 25, 26, 28, 31, 38, 41, 43, 44, 45, 46, 47, 48, 51, 58, 61, 62, 63, 64, 65, 66, 68, 71, 78, 81, 83, 84, 85, 86, 87, 88, 91, 98));
        arrayN = new ArrayList<Integer>(Arrays.asList(17, 35, 32, 54, 57, 76, 72, 94));
        arrayE = new ArrayList<Integer>(Arrays.asList(97));
        riddle = new Riddle();
        fillField();
    }

    public String checkField(int x, int y) {
        String result = "";
        if (field[y][x] == "Wall") {
            result = wall;
        } else if (field[y][x] == "Note") {
            result = note;
        } else if (field[y][x] == "End") {
            result = end;
            endGame();
        }
        return result;
    }

    private void fillField() {
        int k = 0;
        for (int i = 0; i < 10; i++) {

            for (int j = 0; j < 10; j++) {

                if (arrayG.contains(k)) {
                    field[i][j] = grass;
                } else if (arrayW.contains(k)) {
                    field[i][j] = wall;
                } else if (arrayN.contains(k)) {
                    field[i][j] = note;
                } else if (arrayE.contains(k)) {
                    field[i][j] = end;
                }

                k++;
            }
        }

    }

    public void setField(int x, int y) {
        field[x][y] = null;
    }

    public boolean riddleTime() {
        boolean check = false;
        theRiddle = riddle.generateRiddle();
        theAnswer = riddle.getAnswer();
        while (!check) {
            check = checkReply(theRiddle, theAnswer);
        }
        return check;
    }

    public boolean checkReply(String question, String answer) {
        ImageIcon image = new ImageIcon(this.getClass().getResource("/resources/bad.png"));
        ImageIcon image2 = new ImageIcon(this.getClass().getResource("/resources/good.png"));
        String[] option = {"Yes", "Quit"};
        String reply = JOptionPane.showInputDialog(question);

        if (reply.contains(answer.toLowerCase()) || reply.contains(StringUtils.capitalize(answer)) || reply.contains(answer.toUpperCase())) {
            JOptionPane.showMessageDialog(null, riddle.getResponseC(), "", NORMAL, image2);
            ok = true;
            if (count == 0) {
                instantRight++;
            } else {
                count = 0;
            }
        } else {
            wrongs++;
            int selectedValue = JOptionPane.showOptionDialog(null, riddle.getResponseW(), "", JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_OPTION, image, option, NORMAL);
            if (selectedValue == JOptionPane.YES_OPTION) {
                checkReply(question, answer);
                retries++;
            }
            if (selectedValue == JOptionPane.NO_OPTION) {
                System.exit(0);
            }
            count++;
        }

        return ok;
    }

    private void endGame() {
        ImageIcon bad = new ImageIcon(this.getClass().getResource("/resources/endingbad.png"));
        ImageIcon good = new ImageIcon(this.getClass().getResource("/resources/endinggood.png"));
        ImageIcon info = new ImageIcon(this.getClass().getResource("/resources/info.png"));
        if (instantRight >= 6) {
            JOptionPane.showMessageDialog(null, "", "", NORMAL, good);
            JOptionPane.showMessageDialog(null, "<html><center><br><br>Instant Rights: " + instantRight + "\n" + "\n" + "Wrongs: " + wrongs + "\n" + "\n" + "Retries: " + retries + "\n" + "\n" + "          Wisdom Level: " + indicate(instantRight, wrongs, retries), "                      Statistics", NORMAL, info);
        } else {
            JOptionPane.showMessageDialog(null, "", "", NORMAL, bad);
            JOptionPane.showMessageDialog(null, "\n" + "Instant Rights: " + instantRight + "\n" + "\n" + "Wrongs: " + wrongs + "\n" + "\n" + "Retries: " + retries + "\n" + "\n" + "           Wisdom Level: " + indicate(instantRight, wrongs, retries), "                      Statistics", NORMAL, info);
        }
    }

    public String indicate(int instantRight, int wrongs, int retries) {
        String level = "";

        if (instantRight >= 6 && wrongs <= 4 && retries <= 4) {
            level = "HIGH";
        } else if (instantRight <= 3 && wrongs > 6 && retries > 6) {
            level = "LOW";
        } else {
            level = "AVERAGE";
        }
        return level;
    }

    public void resetGame(){
        fillField();
        riddle.resetGame();
        instantRight = 0;
        wrongs = 0;
        retries = 0;
        count = 0;    
    }


}
package riddle;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class GameDraw extends JComponent {

    private int rows;
    private int columns;
    private int RWIDTH;
    private int RHEIGHT;
    private int manX;
    private int manY;
    private BufferedImage man, grass, wall, note, end;
    private Man m;
    private GameField f;

    public GameDraw() {
        //Integer variables
        rows = 9;
        columns = 9;
        RWIDTH = 70;
        RHEIGHT = 70;
        manX = 2;
        manY = 0;
        f = new GameField();
        m = new Man(this);
        this.setFocusable(true);
        URL resourceMan = this.getClass().getResource("/resources/man.png");
        try {
            man = ImageIO.read(resourceMan);
        } catch (IOException e) {
            System.out.println("Er ging iets mis met het laden van de afbeelding van de speler");
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        drawField(g);
        drawMan(g);
        drawObjects(g);

    }

    private void drawField(Graphics g) {
        int x = 0;
        int y = 0;
        Color lightgray = new Color(192, 192, 192);

        for (int i = 0; i < rows + 1; i++) {
            for (int j = 0; j < columns; j++) {
                g.setColor(lightgray);
                g.fillRect(x, y, RWIDTH, RHEIGHT);
                x += RWIDTH;
            }
            g.setColor(lightgray);
            g.fillRect(x, y, RWIDTH, RHEIGHT);
            x = 0;
            y += RHEIGHT;
        }
    }

    private void drawMan(Graphics g) {
        g.drawImage(man, manX * RWIDTH, manY * RHEIGHT, RWIDTH, RHEIGHT, this);
    }

    public void moveMan(int x, int y) {
        manX = x;
        manY = y;
        repaint();
        System.out.println(manX + " " + manY);
    }

    private void drawObjects(Graphics g) {
        URL resourceGrass = this.getClass().getResource("/resources/Grassy.png");
        URL resourceWall = this.getClass().getResource("/resources/wall.png");
        URL resourceNote = this.getClass().getResource("/resources/note.png");
        URL resourceEnd = this.getClass().getResource("/resources/chest.png");

        //Grass object
        try {
            grass = ImageIO.read(resourceGrass);
            wall = ImageIO.read(resourceWall);
            note = ImageIO.read(resourceNote);
            end = ImageIO.read(resourceEnd);
        } catch (IOException e) {
            System.out.println("Er ging iets mis met het laden van de afbeelding van de speler");
        }

        for (int j = 0; j < rows + 1; j++) {
            for (int i = 0; i < columns + 1; i++) {
                if (f.field[i][j] == "Grass") {
                    g.drawImage(grass, j * RWIDTH, i * RHEIGHT, RWIDTH, RHEIGHT, this);
                }
                if (f.field[i][j] == "Wall") {
                    g.drawImage(wall, j * RWIDTH, i * RHEIGHT, RWIDTH, RHEIGHT, this);
                }
                if (f.field[i][j] == "Note") {
                    g.drawImage(note, j * RWIDTH, i * RHEIGHT, RWIDTH, RHEIGHT, this);
                }
                if (f.field[i][j] == "End") {
                    g.drawImage(end, j * RWIDTH, i * RHEIGHT, RWIDTH, RHEIGHT, this);
                }
}
}
}

    public void repaintField(int x, int y) {
        f.field[x][y] = null;
        repaint();
    }

    public void resetGame(){
        f.resetGame();
        m.resetGame();
        System.out.println(manX + " " + manY);
    }
}

package riddle;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Man implements KeyListener {

    private int locationX;
    private int locationY;
    private GameDraw draw;
    private GameField field;

    public Man(GameDraw draw) {
        locationX = 2;
        locationY = 0;
        this.draw = draw;
        field = new GameField();
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        String check;
        boolean pass;
        switch (key) {

            case KeyEvent.VK_UP:
                locationY--;

                if (locationY < 0) {
                    locationY++;
                }
                check = field.checkField(locationX, locationY);
                if (!"Wall".equals(check) && !"Note".equals(check) && !"End".equals(check)) {
                    draw.moveMan(locationX, locationY);
                } else if (check.equals("Wall") || check.equals("End")) {
                    locationY++;
                } else if (check.equals("Note")) {
                    pass = field.riddleTime();
                    if (pass) {
                        clearNote(locationX, locationY);
                        draw.moveMan(locationX, locationY);
                    } else {
                        locationY++;
                    }
                }
                break;

            case KeyEvent.VK_DOWN:
                locationY++;

                if (locationY > 9) {
                    locationY--;
                }
                check = field.checkField(locationX, locationY);
                if (!"Wall".equals(check) && !"Note".equals(check) && !"End".equals(check)) {
                    draw.moveMan(locationX, locationY);
                }
                if (check.equals("Wall") || check.equals("End")) {
                    locationY--;
                } else if (check.equals("Note")) {
                    pass = field.riddleTime();
                    if (pass) {
                        clearNote(locationX, locationY);
                        draw.moveMan(locationX, locationY);
                    } else {
                        locationY--;
                    }
                }
                break;

            case KeyEvent.VK_LEFT:
                locationX--;
            ;
                check = field.checkField(locationX, locationY);
                if (!"Wall".equals(check) && !"Note".equals(check) && !"End".equals(check)) {
                    draw.moveMan(locationX, locationY);
                }
                if (check.equals("Wall") || check.equals("End")) {
                    locationX++;
                } else if (check.equals("Note")) {
                    pass = field.riddleTime();
                    if (pass) {
                        clearNote(locationX, locationY);
                        draw.moveMan(locationX, locationY);
                    } else {
                        locationX++;
                    }
                }
                break;

            case KeyEvent.VK_RIGHT:
                System.out.println(locationX + " " + locationY);
                locationX++;

                check = field.checkField(locationX, locationY);
                if (!"Wall".equals(check) && !"Note".equals(check) && !"End".equals(check)) {
                    draw.moveMan(locationX, locationY);
                }
                if (check.equals("Wall") || check.equals("End")) {
                    locationX--;
                } else if (check.equals("Note")) {
                    pass = field.riddleTime();
                    if (pass) {
                        clearNote(locationX, locationY);
                        draw.moveMan(locationX, locationY);
                    } else {
                        locationX--;
                    }
                }
                break;
                default:
                break;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    public void clearNote(int x, int y) {
        field.setField(y, x);
        draw.repaintField(y, x);
    }

    public void resetGame(){
        locationX = 2;
        locationY = 0;
        draw.moveMan(locationX, locationY);
        System.out.println(locationX + " " + locationY);
      }
}

package riddle;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Riddle {

    private ArrayList<String> riddles;
    private ArrayList<String> answers;
    private ArrayList<String> correct;
    private ArrayList<String> wrong;
    private ArrayList<Integer> used;
    private ArrayList<Integer> used2;
    private Random ran;
    private int indexAnswer;

    public Riddle() {
        riddles = new ArrayList<String>();
        answers = new ArrayList<String>();
        correct = new ArrayList<String>();
        wrong = new ArrayList<String>();
        used = new ArrayList<Integer>();
        used2 = new ArrayList<Integer>();
        ran = new Random();
        fillRiddles();
        fillAnswers();
        fillCorrect();
        fillWrong();
    }

    private void fillRiddles() {
        Scanner sc2 = null;
        try {
            sc2 = new Scanner(new File("C:\\Users\\John\\Documents\\NetBeansProjects\\Riddle\\src\\resources\\riddles.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (sc2.hasNextLine()) {
            Scanner s2 = new Scanner(sc2.nextLine());
            while (s2.hasNext()) {
                String s = s2.nextLine();
                riddles.add(s);

            }
        }
    }

    private void fillAnswers() {
        Scanner sc2 = null;
        try {
            sc2 = new Scanner(new File("C:\\Users\\John\\Documents\\NetBeansProjects\\Riddle\\src\\resources\\answers.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (sc2.hasNextLine()) {
            Scanner s2 = new Scanner(sc2.nextLine());
            while (s2.hasNext()) {
                String s = s2.nextLine();
                answers.add(s);
            }
        }
    }

    private void fillCorrect() {
        Scanner sc2 = null;
        try {
            sc2 = new Scanner(new File("C:\\Users\\John\\Documents\\NetBeansProjects\\Riddle\\src\\resources\\correct.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (sc2.hasNextLine()) {
            Scanner s2 = new Scanner(sc2.nextLine());
            while (s2.hasNext()) {
                String s = s2.nextLine();
                correct.add(s);
            }
        }
    }

    private void fillWrong() {
        Scanner sc2 = null;
        try {
            sc2 = new Scanner(new File("C:\\Users\\John\\Documents\\NetBeansProjects\\Riddle\\src\\resources\\wrong.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        while (sc2.hasNextLine()) {
            Scanner s2 = new Scanner(sc2.nextLine());
            while (s2.hasNext()) {
                String s = s2.nextLine();
                wrong.add(s);
            }
        }
    }

    public String generateRiddle() {
        String theRiddle = "";
        int index = ran.nextInt(riddles.size());

        if (!used.contains(index)) {
            theRiddle = riddles.get(index);
            indexAnswer = index;
            used.add(index);
        } else {
            theRiddle = generateRiddle();
        }
        return theRiddle;
    }

    public String getAnswer() {
        String theAnswer = answers.get(indexAnswer);
        return theAnswer;
    }

    public String getResponseC() {
        String response = "";
        int index = ran.nextInt(correct.size());

        if (!used2.contains(index)) {
            response = correct.get(index);
            used2.add(index);
        } else {
            response = getResponseC();
        }
        return response;
    }

    public String getResponseW() {
        String response = "";
        int index = ran.nextInt(wrong.size());
        response = wrong.get(index);
        return response;
    }

    public void resetGame(){
        riddles.clear();
        answers.clear();
        wrong.clear();
        correct.clear();
        used.clear();
        used2.clear();
        fillRiddles();
        fillAnswers();
        fillCorrect();
        fillWrong();
        indexAnswer = 0;
    }

}

0 个答案:

没有答案