GameStart:一个开始游戏的类,有一个窗体JFrame
GameStart extends JFrame
import javax.swing.*; public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame("snake"); frame.setBounds(10,10,900,720); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.add(new GamePanel()); frame.setVisible(true); } }
GamePanel:一个画板类,用于画所需图形等,实现了事件监听器,按键监听器
按钮监听器用于控制蛇的左右上下移动
事件监听器是用于计时器上,让蛇运动起来 Timer(100,this)
构造器
初始化方法 Initial
按钮监听器方法
事件监听器方法
package com.xan.snake; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; public class GamePanel extends JPanel implements KeyListener, ActionListener { int[] snakeX = new int[600]; int[] snakeY = new int[600]; int length; String fx; boolean isStart = false; Timer timer = new Timer(100, this); //定时器 int foodx ; int foody; Random random = new Random(); //记录分数 int scores ; //失败标志 boolean isFail = false; public GamePanel() { init(); this.setFocusable(true); this.addKeyListener(this); timer.start(); } public void init() { length = 3; scores =0; fx = "R"; snakeX[0] = 100;snakeY[0] = 100; snakeX[1] = 75;snakeY[1] = 100; snakeX[2] = 50;snakeY[2] = 100; foodx = 25 + 25 * random.nextInt(34); foody = 75 + 25 * random.nextInt(24); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //清屏 this.setBackground(Color.WHITE); // Data.header.paintIcon(this, g, 25, 11); g.fillRect(25, 75, 850, 600); //游戏区域 //画食物 Data.food.paintIcon(this,g,foodx,foody); //画蛇头 if (fx.equals("U")) { Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("D")) { Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("L")) { Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("R")) { Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); } //画分数和长度 g.setColor(Color.BLUE); g.setFont(new Font("微软雅黑", Font.BOLD, 20)); g.drawString("分数:"+ scores, 650, 25); g.drawString("长度:"+ length, 650, 45); g.setFont(new Font("微软雅黑", Font.BOLD, 50)); g.drawString("贪吃蛇",350,50); if (isStart == false) { g.setColor(Color.RED); g.setFont(new Font("微软雅黑", Font.BOLD, 49)); g.drawString("按下空格游戏开始", 300, 300); } if (isFail == true) { g.setColor(Color.RED); g.setFont(new Font("微软雅黑", Font.BOLD, 50)); g.drawString("游戏失败,按下空格重新开始", 200, 300); } //画蛇尾 for (int i = 1; i < length; i++) { Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); } } @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_SPACE) { //按下空格的时候 一、重新开始游戏 二、暂停/开始游戏 if(isFail){ isFail = false; init(); }else { isStart = !isStart; } repaint(); }else if (keyCode == KeyEvent.VK_UP){ fx = "U"; }else if (keyCode == KeyEvent.VK_DOWN){ fx = "D"; }else if (keyCode == KeyEvent.VK_LEFT){ fx = "L"; }else if (keyCode == KeyEvent.VK_RIGHT){ fx = "R"; } } @Override public void actionPerformed(ActionEvent e) { //事件的监听器,用于小蛇的移动 if (isStart && !isFail) { //如果开始了,让小蛇一直移动 for (int i = length - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i-1] ; } //头部移动 if(fx.equals("R")){ snakeX[0] += 25; if (snakeX[0]>850){ snakeX[0] = 25;} }else if (fx.equals("L")){ snakeX[0] -= 25; if (snakeX[0]<25){snakeX[0] = 850; } }else if (fx.equals("D")){ snakeY[0] += 25; if (snakeY[0]>650){ snakeY[0] = 75; } }else if(fx.equals("U")){ snakeY[0] -= 25; if (snakeY[0]<75){ snakeY[0] = 650; } } if(foodx == snakeX[0] && foody ==snakeY[0]){ length++; scores += 10; foodx = 25 + 25*random.nextInt(34); foody = 75 + 25*random.nextInt(24); } for (int i = 1; i < length; i++) { if (snakeX[0]== snakeX[i] && snakeY[0] ==snakeY[i]){ isFail = true; } } repaint(); } timer.start(); } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }
Data:用于存放数据,url
package com.xan.snake; import javax.swing.*; import java.awt.*; import java.net.URL; public class Data { //图片 public static URL headerURL = Data.class.getResource("/static/header.png"); public static ImageIcon header = new ImageIcon(headerURL); public static URL bodyURL = Data.class.getResource("/static/body.png"); public static ImageIcon body = new ImageIcon(bodyURL); public static URL downURL = Data.class.getResource("/static/down.png"); public static ImageIcon down = new ImageIcon(downURL); public static URL foodURL = Data.class.getResource("/static/food.png"); public static ImageIcon food = new ImageIcon(foodURL); public static URL leftURL = Data.class.getResource("/static/left.png"); public static ImageIcon left = new ImageIcon(leftURL); public static URL rightURL = Data.class.getResource("/static/right.png"); public static ImageIcon right = new ImageIcon(rightURL); public static URL upURL = Data.class.getResource("/static/up.png"); public static ImageIcon up = new ImageIcon(upURL); }