蛇游戏Java Gui

时间:2012-10-09 02:56:51

标签: java swing jpanel actionlistener keylistener

您好我最近开始开发一款蛇游戏。我处于起步阶段,我有一个移动的物体和一个点吃它,但我的主要问题是如何检查蛇是否“吃”了点,我怎么能让它消失?
任何帮助都将非常感激。

这是以下代码:

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);

      }

1 个答案:

答案 0 :(得分:5)

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

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

我实际上用Java做了一段Snake游戏。这是我的课程列表。请记住,这只是一个建议:根据个人喜好和游戏的复杂程度,您需要更多或更少的课程。

  • GameInstance - 持有游戏逻辑
  • GameWindow - gui部分
  • MainLoop - 设置事件循环
  • Snake - 掌握有关的信息 蛇
  • Pnt2 - 一个2d点,有加法逻辑, 减法,距离测试等

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