gpt4 book ai didi

java - MouseListener 的问题

转载 作者:行者123 更新时间:2023-11-30 09:11:05 25 4
gpt4 key购买 nike

对于我正在制作的这款游戏,我真的很想得到一些帮助。我已经尝试了最长的时间,但我却找不到解决方案。目前它的作用不大。基本上,我需要鼠标监听器寻找左键单击并以一种方式改变蛇的方向,另一种方式用于右键单击。但我似乎无法正确设置监听器。对不起,如果我的编码很糟糕,或者如果我正在做的事情有更好的解决方案,我已经编码那么久了。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com