Java+JFrame实现贪吃蛇小游戏

网友投稿 271 2022-07-26


分享一个java贪吃蛇小游戏,主要用到的是Java的JFrame,适合初学者。

首先创建一个合适大小的窗口,我这里是900*720

package com.lzijin;

/*

@Auther: lzijin

* @Date: 2021/11/5 - 11 - 05 - 22:06

* @Description: com.lzijin

* @version: 16.0

*/

import javax.swing.JFrame;

public class Start {

public static void main(String[] args) {

// 创建对象、标题

JFrame frame = new JFrame("贪吃蛇小游戏");

// 设置位置、大小

frame.setBounds(510, 130, 900, 720);

// 设置窗口大小不可改变

frame.setResizable(false);

// 设置关闭按钮

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗口

frame.setVisible(true);

}

}

创建好之后大概就是这个样子:

现在我们导入一些素材,辐条,食物,还有蛇的头,身体等素材。

package com.lzijin;

/*

@Auther: lzijin

* @Date: 2021/11/5 - 11 - 05 - 22:08

* @Description: com.lzijin

* @version: 16.0

*/

import javax.swing.*;

import java.util.Objects;

public class Data {

// 获取头部素材

public static ImageIcon header = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/header.png")));

//获取头部素材

public static ImageIcon up = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/up.png")));

public static ImageIcon down = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/down.png")));

public static ImageIcon left = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/left.png")));

public static ImageIcon right = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/right.png")));

// 获取身体素材

public static ImageIcon body_up = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodyup.png")));

public static ImageIcon body_right = new ImageIcon(Objects.requireNonNull(Data.class.getResourhttp://ce("/statics/bodyright.png")));

public static ImageIcon body_down = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodydown.png")));

public static ImageIcon body_left = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodyleft.png")));

// 获取食物素材

public static ImageIcon candy = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/candy.png")));

public static ImageIcon drumsticks = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/drumsticks.png")));

public static ImageIcon hamburger = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/hamburger.png")));

public static ImageIcon twm = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/twm.png")));

}

素材如下:

头、身体、食物都是:25+25像素

横幅:850*50像素

自己可以去PS里面做几张

现在我们来创建一个画板,把蛇画到画板上,还要让他动起来。

这里面涉及到的东西稍微有点多,创建一个画笔的方法,把图片素材转换为ImageIcon然后画到相应的位置,蛇向右移动一次就是所有身体的X坐标加一,向下移就是Y坐标加一,其他相同。随机函数生成两个随机数,其坐标就是食物的位置。蛇头的X坐标和Y坐标与食物的X坐标Y坐标重合就说明已经吃到食物。蛇头越过边界,或者蛇头与某一个身体的坐标重合,都判定蛇死亡。

package com.lzijin;

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 length;// 长度

int[] snakeX = new int[600];

int[] snakeY = new int[500];

String fx;

boolean isStart = false;

Timer timer = new Timer(100, this);

int foodX;

int foodY;

Random random = new Random();

boolean isFail = false;

int score;

Random random_food =new Random();

int food;

// 构造器

public GamePanel() {

init();

this.setFocusable(true);

this.addKeyListener(this);

timer.start();

}

/*

* 数据的初始化

*/

public void init() {

// 蛇的默认长度

length = 3;

snakeX[0] = 100;

snakeY[0] = 100;

// 蛇的第一个身体

snakeX[1] = 75;

snakeY[1] = 100;

// 蛇的第二个身体

snakeX[2] = 50;

snakeY[2] = 100;

// 默认方向

fx = "R";

foodX = 25 + 25 * random.nextInt(34);

foodY = 75 + 25 * random.nextInt(24);

score = 0;

}

protected void paintComponent(Graphics g) {

super.paintComponent(g);// 清屏

this.setBackground(Color.white);// 背景色

Data.header.paintIcon(this, g, 25, 11);// 标题栏位置

g.setColor(Color.cyan);

//画背景图片

g.fillRect(25, 75, 850, 600);// 游戏区域

// 静态蛇 // 初始化头的方向,位置

switch (fx) {

case "R" -> Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);

case "L" -> Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);

case "U" -> Data.up.paintIcon(this, g, snakeX[0], snhttp://akeY[0]);

case "D" -> Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);

}

// 默认身体

for (int i = 1; i < length; i++) {

switch (fx) {

case "R" -> Data.body_right.paintIcon(this, g, snakeX[i], snakeY[i]);

case "L" -> Data.body_left.paintIcon(this, g, snakeX[i], snakeY[i]);

case "U" -> Data.body_up.paintIcon(this, g, snakeX[i], snakeY[i]);

case "D" -> Data.body_down.paintIcon(this, g, snakeX[i], snakeY[i]);

}

}

// 画积分

g.setColor(Color.BLUE);

g.setFont(new Font("微软雅黑", Font.BOLD, 18));

g.drawString("长度:" + length, 750, 33);

g.drawString("分数:" + score, 750, 52);

// 画食物

switch (food) {

case 1 -> Data.candy.paintIcon(this, g, foodX, foodY);

case 2 -> Data.drumsticks.paintIcon(this, g, foodX, foodY);

case 3 -> Data.hamburger.paintIcon(this, g, foodX, foodY);

default -> Data.twm.paintIcon(this, g, foodX, foodY);

}

// 提示是否开始

if (!isStart) {

// 设置颜色

g.setColor(Color.white);

// 设置字体

g.setFont(new Font("楷体", Font.BOLD, 40));

// 设置内容

g.drawString("按下空格请小姐姐吃糖", 250, 300);

}

if (isFail) {

// 设置颜色

g.setColor(Color.RED);

// 设置字体

g.setFont(new Font("微软雅黑", Font.BOLD, 40));

// 设置内容

g.drawString("哎呀,小姐姐没了!", 300, 300);

}

}

@Override

public void keyTyped(KeyEvent e) {

// 敲击

}

/*

* 取按下的键

*/

@Override

public void keyPressed(KeyEvent e) {

int KeyCode = e.getKeyCode();

if (KeyCode == KeyEvent.VK_SPACE) {

if (isFail) {

isFail = false;

init();// 重新初始化游戏

} else {// 暂停游戏

isStart = !isStart;

}

repaint();

}

// 控制键盘走向

if (KeyCode == KeyEvent.VK_LEFT) {

if (!fx.equals("R"))

fx = "L";

} else if (KeyCode == KeyEvent.VK_RIGHT) {

if (!fx.equals("L"))

fx = "R";

} else if (KeyCode == KeyEvent.VK_UP) {

if (!fx.equals("D"))

fx = "U";

} else if (KeyCode == KeyEvent.VK_DOWN) {

if (!fx.equals("U"))

fx = "D";

}

}

@Override

public void keyReleased(KeyEvent e) {

// 释放

}

/*

* 定时器,时间监听 蛇的移动 吃食物 失败判断 页面刷新

*/

@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];

}

// 头部移动

switch (fx) {

case "R" -> {

snakeX[0] = snakeX[0] + 25;

if (snakeX[0] > 850) {// 边界判断

isFail = true;

//snakeX[0] = 25;

}

}

case "L" -> {

snakeX[0] = snakeX[0] - 25;

if (snakeX[0] < 25) {// 边界判断

isFail = true;

//snakeX[0] = 850;

}

}

case "U" -> {

snakeY[0] = snakeY[0] - 25;

if (snakeY[0] < 75) {// 边界判断

isFail = true;

//snakeY[0] = 650;

}

}

case "D" -> {

snakeY[0] = snakeY[0] + 25;

if (snakeY[0] > 650) {// 边界判断

isFail = true;

//snakeY[0] = 75;

}

}

}

// 吃食物

if (snakeX[0] == foodX && snakeY[0] == foodY) {

length++;

score += 10;

// 重新生成食物

foodX = 25 + 25 * random.nextInt(34);

foodY = 75 + 25 * random.nextInt(24);

food=1+random_food.nexthttp://Int(4);

}

// 结束判断

for (int i = 1; i < length; i++) {

if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {

isFail = true;

break;

}

}

// 刷新页面

repaint();

}

timer.start();

}

}

别忘添加素材图片:

最后将画板添加到窗口当中

现在我们的贪吃蛇就做好了


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot Validation快速实现数据校验的示例代码
下一篇:java实现飞机大战小游戏
相关文章

 发表评论

暂时没有评论,来抢沙发吧~