Java基础版贪吃蛇

博客地址: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);
}

7.项目源码

gitee: https://gitee.com/tao-yuhan/java-snake.git

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boboj1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值