java - MouseListener 的问题

标签 java swing mouse-listeners

我真的很需要一些关于我正在制作的游戏的帮助。我已经尝试了很长时间,但解决方案却无法解决。目前它的作用并不大。基本上,我需要鼠标监听器来查找左键单击并以一种方式更改蛇的方向,而另一种方式则用于右键单击。但我似乎无法正确设置监听器。如果我的编码很差,或者如果我正在做的事情有更好的解决方案,请原谅,我已经编码了那么久了。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.*;
import java.awt.Color;
import java.util.*;
import java.awt.event.*;

public class SnakeGame implements MouseListener{
static int delta = 10;

public static void main(String[] args) {

    JFrame f = new JFrame("Snake Game"){
        @Override
        public void paint(Graphics g){
            ArrayList<Integer> snakeX = new ArrayList<Integer>();
            ArrayList<Integer> snakeY = new ArrayList<Integer>();
            ArrayList<Integer> food = new ArrayList<Integer>();
            char direction = 'e';
            int tail = 2;
            int foodX;
            int foodY;
            boolean game = true;
            boolean check = false;
            boolean recheck = true;

            snakeX.add(0,20);
            snakeX.add(1,10);
            snakeX.add(2,0);

            snakeY.add(0,0);
            snakeY.add(1,0);
            snakeY.add(2,0);

            Random rnd = new Random();
            do{
                foodX = (rnd.nextInt(750/delta)+1) * delta;
                foodY = (rnd.nextInt(750/delta)+1) * delta;
                //System.out.println(foodX + " : " + foodY);
                for(int i = 0; i < snakeX.size(); i++){
                    if(recheck){
                        if(foodX != snakeX.get(i).intValue() && foodY != snakeY.get(i).intValue()){
                            check = true;
                            recheck = false;
                        }

                        else{
                            check = false;
                            recheck = true;
                        }
                    }

                }
            }while(!check);

            food.add(0, foodX);
            food.add(1, foodY);

            while (game){
            g.fillRect(0,0,759,781);
            drawSnake(snakeX, snakeY, food, g);
            moveSnake(snakeX, snakeY, direction, game, food, g);
            drawFood(food, g);
            for(long delay = 0; delay < 75000000; delay++);
            }
        }
    };
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(768,790);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }

    public void mousePressed(MouseEvent e){
    }

    public void mouseEntered(MouseEvent e){
    }

    public void mouseReleased(MouseEvent e){
    }

    public void mouseClicked(MouseEvent e){
    }

    public void mouseExited(MouseEvent e){
    }

    public static void drawFood(ArrayList<Integer> food, Graphics g){
        g.setColor(Color.red);
        g.fillRect(food.get(0).intValue()+9, food.get(1).intValue()+31, delta, delta);
    }

    public static void drawSnake(ArrayList<Integer> snakeX, ArrayList<Integer> snakeY, ArrayList<Integer> food, Graphics g){
        g.setColor(Color.black);
        g.fillRect(0,0,760,782);
        drawFood(food, g);
        g.setColor(Color.white);
        for(int i = 0; i < snakeX.size(); i++){
            g.fillRect(snakeX.get(i)+9, (int) snakeY.get(i)+31, delta, delta);
        }
    }

    public static void checkContact(ArrayList<Integer> snakeX, ArrayList<Integer> snakeY, Boolean game){
        for(int i = 1; i < snakeX.size(); i++){
            if(snakeX.get(i) == snakeX.get(0) && snakeY.get(i) == snakeY.get(0))
                game = false;
        }
    }

    public static void checkFood(ArrayList<Integer> snakeX, ArrayList<Integer> snakeY, ArrayList<Integer> food, Graphics g){
        if(snakeX.get(0).intValue() == food.get(0).intValue() && snakeY.get(0).intValue() == food.get(1).intValue()){
            setFood(food, snakeX, snakeY);
            snakeX.add(snakeX.get(snakeX.size()-1).intValue()-delta);
            snakeY.add(snakeY.get(snakeY.size()-1).intValue()-delta);
        }
    }
    public static void setFood(ArrayList<Integer> food, ArrayList<Integer> snakeX, ArrayList<Integer> snakeY){
        boolean check = false;
        boolean recheck = true;
        Random rnd = new Random();
        int foodX;
        int foodY;
        do{
            foodX = (rnd.nextInt(750/delta)+1) * delta;
            foodY = (rnd.nextInt(750/delta)+1) * delta;
            //System.out.println(foodX + " : " + foodY);
            for(int i = 0; i < snakeX.size(); i++){
                if(recheck){
                    if(foodX != snakeX.get(i).intValue() && foodY != snakeY.get(i).intValue()){
                        check = true;
                        recheck = false;
                    }

                    else{
                        check = false;
                        recheck = true;
                    }
                }

            }
        }while(!check);

        food.set(0, foodX);
        food.set(1, foodY);
    }

    public static void moveSnake(ArrayList<Integer> snakeX, ArrayList<Integer> snakeY, char direction, Boolean game, ArrayList<Integer> food, Graphics g){
        if(snakeX.get(0).intValue() < 740 && snakeX.get(0).intValue() >= 0 && snakeY.get(0).intValue() < 740 && snakeY.get(0).intValue() >= 0){
        if(direction == 'e'){
            int temp = snakeX.get(0).intValue();
            int temp2 = 0;
            snakeX.set(0, temp+delta);
            for(int i = 1; i < snakeX.size(); i++){
                temp2 = snakeX.get(i);
                snakeX.set(i,temp);
                temp = temp2;
            }

            int tempY = snakeY.get(0).intValue();
            int tempY2 = 0;
            snakeY.set(0, tempY);
            for(int i = 1; i < snakeY.size(); i++){
                tempY2 = snakeY.get(i);
                snakeY.set(i,tempY);
                tempY = tempY2;
            }

        }
        else if(direction == 'n'){
            int temp = snakeX.get(0).intValue();
            int temp2 = 0;
            snakeX.set(0, temp);
            for(int i = 1; i < snakeX.size(); i++){
                temp2 = snakeX.get(i);
                snakeX.set(i,temp);
                temp = temp2;
            }

            int tempY = snakeY.get(0).intValue();
            int tempY2 = 0;
            snakeY.set(0, tempY+delta);
            for(int i = 1; i < snakeY.size(); i++){
                tempY2 = snakeY.get(i);
                snakeY.set(i,tempY);
                tempY = tempY2;
            }
        }
        else if(direction == 'w'){
            int temp = snakeX.get(0).intValue();
            int temp2 = 0;
            snakeX.set(0, temp-delta);
            for(int i = 1; i < snakeX.size(); i++){
                temp2 = snakeX.get(i);
                snakeX.set(i,temp);
                temp = temp2;
            }

            int tempY = snakeY.get(0).intValue();
            int tempY2 = 0;
            snakeY.set(0, tempY);
            for(int i = 1; i < snakeY.size(); i++){
                tempY2 = snakeY.get(i);
                snakeY.set(i,tempY);
                tempY = tempY2;
            }

        }
        else if(direction == 's'){
            int temp = snakeX.get(0).intValue();
            int temp2 = 0;
            snakeX.set(0, temp);
            for(int i = 1; i < snakeX.size(); i++){
                temp2 = snakeX.get(i);
                snakeX.set(i,temp);
                temp = temp2;
            }

            int tempY = snakeY.get(0).intValue();
            int tempY2 = 0;
            snakeY.set(0, tempY-delta);
            for(int i = 1; i < snakeY.size(); i++){
                tempY2 = snakeY.get(i);
                snakeY.set(i,tempY);
                tempY = tempY2;
            }
        }
        checkFood(snakeX, snakeY, food, g);
        checkContact(snakeX, snakeY, game);
        }
        drawSnake(snakeX, snakeY, food, g);
    }
}

最佳答案

您的游戏循环(代码中表示 while(game) 的部分)应该一直运行到游戏结束,但有点错位。因为该循环故意是无限的,所以它永远不会到达它之后为帧设置值的行。这些陈述:

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(768,790);
f.setLocationRelativeTo(null);
f.setVisible(true);

需要放在循环之前。然后,要正确注册框架的鼠标监听器,您必须将其添加到框架中,如下所示:

f.addMouseListener(this);

这之所以有效,是因为 SnakeGame 可以被视为 MouseListener,因为它实现了该接口(interface)。

额外提示: 暂停执行的正确方法是使用 Swing 计时器,而不是多次运行 for 循环。

阅读this有关使用计时器的更多信息。 希望有帮助!

关于java - MouseListener 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22264211/

相关文章:

java - 从 Java 执行命令并等待命令完成

java - Swing GUI 在数据处理期间不会更新

java - 将监听器添加到表中

java - 让 JPanel 在单击时突出显示

java - com.mysql.jdbc.PacketTooBigException :Packet too long to query

java - 如何序列化 JComboBox 选择?

java - 提交flink作业时如何处理akka AskTimeoutException

java - 想要设置在由枚举填充的 JComboBox 中选择的默认值

swing - 如何在 swing 中运行 javaFX MediaPlayer?

java - 如何为java jtable创建鼠标双监听器