【发布时间】:2012-09-29 07:47:27
【问题描述】:
你好我最近开始开发一个蛇游戏。我正处于开始阶段,我有一个移动的物体和一个可以吃的点,但我的主要问题是如何检查蛇是否“吃”了这个点,以及如何让它消失?
任何帮助将不胜感激。
下面是代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
import javax.swing.JPanel;
public class Gui extends JPanel implements ActionListener,KeyListener{
Random rnd= new Random();
int pointx=100 + (int)(Math.random() * ((400- 100) + 1));;
int pointy=100 + (int)(Math.random() * ((300 - 100) + 1));
private String text;
Timer tm = new Timer(5, this);
int x = 300, y = 178, velx = 0, vely = 0;
public Gui()
{
tm.start();
addKeyListener(this);
setFocusable(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.green);
g.fillRect(x, y, 35, 15);
g.setColor(Color.BLACK);
g.fillOval(pointx,pointy, 20,20);
}
public void keyPressed(KeyEvent e)
{
int c = e.getKeyCode();
if (c == KeyEvent.VK_LEFT)
{
velx = -1;
vely = 0;
}
if (c == KeyEvent.VK_UP)
{
velx = 0;
vely = -1;
}
if (c == KeyEvent.VK_RIGHT)
{
velx = 1;
vely = 0;
}
if (c == KeyEvent.VK_DOWN)
{
velx = 0;
vely = 1;
}
}
public void actionPerformed(ActionEvent e)
{
x += velx;
y += vely;
repaint();
borders(e);
}
public void borders(ActionEvent e) {
if (x < 0) {
velx = 0;
x = 0;
JOptionPane
.showMessageDialog(null, "you hit the borders you lost!");
System.exit(0);
}
if (x > 530) {
velx = 0;
x = 530;
JOptionPane
.showMessageDialog(null, "you hit the borders you lost!");
System.exit(0);
}
if (y < 0) {
velx = 0;
y = 0;
JOptionPane
.showMessageDialog(null, "you hit the borders you lost!");
System.exit(0);
}
if (y > 330) {
velx = 0;
y = 330;
JOptionPane
.showMessageDialog(null, "you hit the borders you lost!");
System.exit(0);
}
}
public static void main(String[] args)
{
JFrame frame = new JFrame("gui");
frame.add(new Gui());
frame.setVisible(true);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
【问题讨论】:
-
您需要保留对蛇的“头部”和“目标”的引用。如果头部和目标在同一点,那么它吃掉了它,一旦吃掉,你要么将“处理”重置到一个新位置,要么将其设置为
null,并允许下一个绘制周期更新图形。您将需要使用类似的技术来检测蛇是否撞到自己。 -
我读的很快,好像你读到了snake的x和y,为什么不把它们和点的x和y比较一下呢?如果它们相同,您就知道蛇正在经过该点。顺便说一句,你的代码有点混乱,我看不到你在哪里使用 pointx 和 pointy 来创建点......我认为你应该停下来重新考虑一下项目的结构。您可以创建一个代表蛇的“食物”的类“Point”。然后你需要一个由许多点组成的类 Snake,以及一个移动它的方法(取最后一个点并将其放在第一个点之后)等等..
标签: java swing jpanel actionlistener keylistener