博客地址:java贪吃蛇
1.绘制静态窗口
StartGames.java
package com.tao.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
//1.绘制静态窗口
JFrame frame = new JFrame("贪吃蛇");
frame.setBounds(200,200,900,700);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口
frame.setVisible(true);
//2.面板
frame.add(new GamePanel());
}
}
2.绘制游戏面板
游戏面板中需要用到一些静态资源,通过Data.java来实现
GamePaneljava
import javax.swing.*;
import java.awt.*;
public class GamePanel extends JPanel {
//画板
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
this.setBackground(Color.BLACK);
//绘制头部的广告栏
Data.header.paintIcon(this,g,25,11);
//绘制游戏区域
g.fillRect(25,75,850,600);
}
}
Data.java
package com.tao.snake;
import javax.swing.*;
import java.net.URL;
//存放外部数据
public class Data {
//获取头部的图片路径
public static URL headreurl = Data.class.getResource("/statics/header.png");
//获取图片
public static ImageIcon header = new ImageIcon(headreurl);
//获取头部四个方向的资源
public static URL upUrl = Data.class.getResource("/statics/up.png");
public static URL downUrl = Data.class.getResource("/statics/down.png");
public static URL leftUrl = Data.class.getResource("/statics/left.png");
public static URL rightUrl = Data.class.getResource("/statics/right.png");
public static ImageIcon up = new ImageIcon(upUrl);
public static ImageIcon down = new ImageIcon(downUrl);
public static ImageIcon left = new ImageIcon(leftUrl);
public static ImageIcon right = new ImageIcon(rightUrl);
//身体资源
public static URL bodyUrl = Data.class.getResource("/statics/body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);
//食物资源
public static URL foodUrl = Data.class.getResource("/statics/food.png");
public static ImageIcon food = new ImageIcon(foodUrl);
}
3.画静态小蛇
定义蛇的坐标、方向以及长度
int lenth;//蛇的长度
int[] snakeX = new int[600];//蛇的坐标x
int[] snakeY = new int[500];
String fx;//蛇的方向R,L,U,D
public GamePanel() {
init();
}
//初始化
public void init() {
lenth = 3;
snakeX[0] = 100;snakeY[0] = 100;//蛇头坐标
snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标
snakeX[2] = 50;snakeY[2] = 100;//第一个身体的坐标
fx = "R";
}
绘制静态蛇
//画静态小蛇
if(fx.equals("R")) {
Data.right.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("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 {
return;
}
for (int i = 1; i < lenth; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
4.小蛇移动
4.1 开始前先判断游戏是否开始
//游戏提示:是否开始
if(!isStart) {
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("按下空格键开始游戏",300,300);
}
4.2 先让小蛇自己移动起来
蛇头坐标++,蛇身体左边则根据当前身体的坐标等于前一个身体的坐标
@Override
public void actionPerformed(ActionEvent e) {
if(isStart) {
//蛇身体移动
for (int i = lenth - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
//蛇头移动
snakeX[0] += 25;
//边界判断
if(snakeX[0] > 850) {
snakeX[0] = 25;
}
repaint();
}
timer.start();
}
4.3 小蛇上下左右移动
通过键盘按下的键来改变方向
//接收键盘的输入
@Override
public void keyPressed(KeyEvent e) {
//获取按下的键盘是哪个键
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if(keyCode == KeyEvent.VK_SPACE) {
isStart = !isStart;
repaint();//刷新页面
}
//键盘控制走向
//避免蛇往右走的时候能够往左走
if(keyCode == KeyEvent.VK_LEFT) {
if(fx.equals("R")) {
fx = "R";
}else {
fx = "L";
}
}else if(keyCode == KeyEvent.VK_RIGHT) {
if(fx.equals("L")) {
fx = "L";
}else {
fx = "R";
}
}else if(keyCode == KeyEvent.VK_UP) {
if(fx.equals("D")) {
fx = "D";
}else {
fx = "U";
}
}else if(keyCode == KeyEvent.VK_DOWN) {
if(fx.equals("U")) {
fx = "U";
}else {
fx = "D";
}
}
}
根据方向来改变蛇头的移动位置
@Override
public void actionPerformed(ActionEvent e) {
if(isStart) {
for (int i = lenth - 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] < 0) {
snakeX[0] = 850;
}
}else if(fx.equals("U")) {
snakeY[0] -= 25;
if(snakeY[0] < 75) {
snakeY[0] = 600;
}
}else if(fx.equals("D")) {
snakeY[0] += 25;
if(snakeY[0] > 700) {
snakeY[0] = 75;
}
}
repaint();
}
timer.start();
}
5.蛇吃食物
食物的随机生成
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
蛇吃到食物身体长度+1
if(snakeX[0] == foodx && snakeY[0] == foody) {
lenth ++;
//重新随机生成一个食物
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
}
6.积分显示
int score;
//初始化积分
public void init() {
score = 0;
}
//蛇吃到食物的时候积分增加
if(snakeX[0] == foodx && snakeY[0] == foody) {
lenth ++;
score += 20;
//重新随机生成一个食物
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
}