【问题标题】:Snake Game Java Gui [closed]Snake Game Java Gui [关闭]
【发布时间】: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


【解决方案1】:

首先要做的事:您的 GUI 应该与您的游戏逻辑分开。

基本上,您需要一个或多个类来封装游戏状态。这个 GameState 类有一个函数,它返回一个要绘制的圆列表,以及另一个接受输入的函数。 GUI 类处理设置面板和执行绘制请求。然后事情变得非常简单。要使一个点消失,只需将其从列表中删除即可。要检查两个物体是否发生碰撞,请比较它们的位置。

实际上,不久前我自己用 Java 制作了一个 Snake 游戏。这是我的课程列表。请记住,这只是一个建议:您需要更多或更少的课程,具体取决于个人喜好和游戏的复杂性。

  • GameInstance - 保存游戏逻辑
  • GameWindow - gui 部分
  • MainLoop - 设置事件循环
  • Snake - 保存关于 蛇
  • Pnt2 - 一个二维点,具有加法逻辑, 减法、距离测试等

显然,这只是一种做事方式,但这是我推荐的方法。

【讨论】:

  • 非常感谢,但在我的游戏中,我的蛇实际上是一个填充到框架中的矩形,我的点也是如此,所以问题是如何让它消失。我想如果蛇会触摸点我会将它涂成白色,但效果不是很好,如何以干净的方式从 jframe 中删除矩形?
  • 我刚刚清除了整个框架并重新绘制了每个刻度。这比尝试手动查找与上一帧的差异并仅绘制更改的部分要容易得多。
  • 很好,我会尽力让它发挥作用。再次感谢您
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多