Java实战之贪吃蛇小游戏(源码+注释)

网友投稿 220 2022-10-27


Java实战之贪吃蛇小游戏(源码+注释)

一、工程文件

二、Main.java

package com.company;

import javax.swing.*;

public class Main {

public static void main(String[] args) {

//创建窗体对象

JFrame frame = new JFrame();

//创建窗体参数()

frame.setBounds(10,10,900,720);

//设置不允许更改大小

//frame.setResizable(false);

//设置关闭方式

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//添加主题逻辑框架

frame.add(new Mpanel());

//设置窗体可见

frame.setVisible(true);

}

}

三、Mpanel.java

package com.company;

import javax.imageio.ImageIO;

import javax.sound.sampled.*;

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.io.BufferedInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Random;

//基本套路,继承JPanel,实现KeyListener, ActionListener接口

public class Mpanel extends JPanel implements KeyListener, ActionListener {

//定义所需要的图片元素

//标题

ImageIcon title;

//蛇的身体部位

ImageIcon body;

//蛇向上方向的头

ImageIcon up;

//蛇向下方向的头

ImageIcon down;

//蛇向左方向的头

ImageIcon left;

//蛇向右方向的头

ImageIcon right;

//食物元素

ImageIcon food;

//定义初始长度

int len = 3;

//定义初始分数

int score = 0;

//存放蛇位置坐标的数组

int[] snakex = new int[750];

int[] snakey = new int[750];

//定义方向

String fx = "R";

//定义游戏是否开始

Boolean isStart = false;

//定义游戏是否失败

Boolean isFailed = false;

//定义游戏时钟,在此可以设置蛇移动速度,默认100ms

Timer timer = new Timer(1onEaGZclNT00,this);

//定义食物的坐标

int foodx;

int foody;

//引入随机数,用于生成食物的随机位置

Random random = new Random();

//定义背景音乐

Clip bgm;

//构造方法

public Mpanel(){

//加载图片元素

loadImages();

//初始化数据

initSnake();

//设置聚焦

this.setFocusable(true);

//设置键盘监听

this.addKeyListener(this);

//开始计时

timer.start();

//加载背景音乐

loadBGM();

}

//设置绘图元素

public void paintComponent(Graphics g){

//调用父类方法

super.paintComponent(g);

//设置背景颜色为白色

this.setBackground(Color.white);

//设置标题元素位置

title.paintIcon(this,g,25,11);

//设置白色背景填充位置

g.fillRect(25,75,850,600);

//设置画笔颜色为白色

g.setColor(Color.white);

//设置长度显示

g.drawString("Len: " + len,750,35);

//设置分数显示

g.drawString("Score: " + score,750,50);

//根据方向调用相应的蛇头元素

if(fx == "R"){

right.paintIcon(this,g,snakex[0],snakey[0]);

}

else if(fx == "L"){

left.paintIcon(this,g,snakex[0],snakey[0]);

}

else if(fx == "U"){

up.paintIcon(this,g,snakex[0],snakey[0]);

}

else if(fx == "D"){

down.paintIcon(this,g,snakex[0],snakey[0]);

}

for(int i=1;i

body.paintIcon(this,g,snakex[i],snakey[i]);

}

//调用食物元素

food.paintIcon(this,g,foodx,foody);

//游戏开始的处理

if(isStart == false){

//设置画笔颜色

g.setColor(Color.white);

//设置字体

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

//设置具体文字

g.drawString("Press Space To Start",250,300);

}

//游戏失败的处理

if(isFailed){

//设置画笔颜色

g.setColor(Color.red);

//设置字体

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

//设置具体文字

g.drawString("Failed: Press Space To Start",250,300);

}

}

//初始化数据

public void initSnake(){

len = 3;

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

//设置初始值

fx = "R";

score = 0;

}

//接口要求的实现方法

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

//获取键盘监听

int keyCode = e.getKeyCode();

//空格

if(keyCode == KeyEvent.VK_SPACE){

//如果失败则重置信息

if(isFailed){

isFailed = !isFailed;

//重新开始

initSnake();

}

//设置开始

else {

isStart = !isStart;

}

//判断开始后循环播放背景音乐

if(isStart){

bgm.loop(Clip.LOOP_CONTINUOUSLY);

}

//未开始和暂停则不播放背景音乐

else {

bgm.stop();

}

//重新绘图

repaint();

}

//右键处理并设置不能回头

else if(keyCode == KeyEvent.VK_LEFT && fx != "R"){

fx = "L";

}

//左键

else if(keyCode == KeyEvent.VK_RIGHT && fx != "L"){

fx = "R";

}

//上键

else if(keyCode == KeyEvent.VK_UP && fx != "D"){

fx = "U";

}

//下键

else if(keyCode == KeyEvent.VK_DOWN && fx != "U"){

fx = "D";

}

}

//接口要求的实现方法

@Override

public void keyReleased(KeyEvent e) {

}

//事件监听

@Override

public void actionPerformed(ActionEvent e) {

//开始且没有失败的情况

if(isStart && !isFailed){

//循环移动蛇身

for(int i=len-1;i>0;i--){

snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

//向右移动并判断是否撞墙,撞墙则失败

if(fx == "R"){

snakex[0]=snakex[0]+25;

if(snakex[0]>825)isFailed=true;

}

//向左移动并判断是否撞墙,撞墙则失败

else if(fx == "L"){

snakex[0]=snakex[0]-25;

if(snakex[0]<50)isFailed=true;

}

//向上移动并判断是否撞墙,撞墙则失败

else if(fx http://== "U"){

snakey[0]=snakey[0]-25;

if(snakey[0]<100)isFailed=true;

}

//向下移动并判断是否撞墙,撞墙则失败

else if(fx == "D"){

snakey[0]=snakey[0]+25;

if(snakey[0]>625)isFailed=true;

}

//吃到食物的判断

if(snakex[0]==foodx&&snakey[0]==foody){

//身体加长,分加多,并且随机生成新食物

len++;

score += 10;

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

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

}

//撞到自身的处理

for(int i=1;i

if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){

isFailed = true;

}

}

//重新绘图

repaint();

}

//事件刷新

timer.start();

}

//加载背景音乐

public void loadBGM(){

try {

//从类所在文件引入

bgm = AudioSystem.getClip();

InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav");

AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is));

bgm.open(ais);

//bgm.loop(Clip.LOOP_CONTINUOUSLY);

}

//相应的异常处理

catch (LineUnavailableException e) {

e.printStackTrace();

}

catch (UnsupportedAudioFileException e) {

e.printStackTrace();

}

catch (IOException e) {

e.printStackTrace();

}

}

//加载图片

public void loadImages(){

InputStream is;

try {

//依次添加响应元素

is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg");

title = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png");

body = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png");

up = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png");

down = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png");

left = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png");

right = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png");

food = new ImageIcon(ImageIO.read(is));

} catch (IOException e) {

e.printStackTrace();

}

}

}

四、效果

body.paintIcon(this,g,snakex[i],snakey[i]);

}

//调用食物元素

food.paintIcon(this,g,foodx,foody);

//游戏开始的处理

if(isStart == false){

//设置画笔颜色

g.setColor(Color.white);

//设置字体

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

//设置具体文字

g.drawString("Press Space To Start",250,300);

}

//游戏失败的处理

if(isFailed){

//设置画笔颜色

g.setColor(Color.red);

//设置字体

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

//设置具体文字

g.drawString("Failed: Press Space To Start",250,300);

}

}

//初始化数据

public void initSnake(){

len = 3;

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

//设置初始值

fx = "R";

score = 0;

}

//接口要求的实现方法

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

//获取键盘监听

int keyCode = e.getKeyCode();

//空格

if(keyCode == KeyEvent.VK_SPACE){

//如果失败则重置信息

if(isFailed){

isFailed = !isFailed;

//重新开始

initSnake();

}

//设置开始

else {

isStart = !isStart;

}

//判断开始后循环播放背景音乐

if(isStart){

bgm.loop(Clip.LOOP_CONTINUOUSLY);

}

//未开始和暂停则不播放背景音乐

else {

bgm.stop();

}

//重新绘图

repaint();

}

//右键处理并设置不能回头

else if(keyCode == KeyEvent.VK_LEFT && fx != "R"){

fx = "L";

}

//左键

else if(keyCode == KeyEvent.VK_RIGHT && fx != "L"){

fx = "R";

}

//上键

else if(keyCode == KeyEvent.VK_UP && fx != "D"){

fx = "U";

}

//下键

else if(keyCode == KeyEvent.VK_DOWN && fx != "U"){

fx = "D";

}

}

//接口要求的实现方法

@Override

public void keyReleased(KeyEvent e) {

}

//事件监听

@Override

public void actionPerformed(ActionEvent e) {

//开始且没有失败的情况

if(isStart && !isFailed){

//循环移动蛇身

for(int i=len-1;i>0;i--){

snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

//向右移动并判断是否撞墙,撞墙则失败

if(fx == "R"){

snakex[0]=snakex[0]+25;

if(snakex[0]>825)isFailed=true;

}

//向左移动并判断是否撞墙,撞墙则失败

else if(fx == "L"){

snakex[0]=snakex[0]-25;

if(snakex[0]<50)isFailed=true;

}

//向上移动并判断是否撞墙,撞墙则失败

else if(fx http://== "U"){

snakey[0]=snakey[0]-25;

if(snakey[0]<100)isFailed=true;

}

//向下移动并判断是否撞墙,撞墙则失败

else if(fx == "D"){

snakey[0]=snakey[0]+25;

if(snakey[0]>625)isFailed=true;

}

//吃到食物的判断

if(snakex[0]==foodx&&snakey[0]==foody){

//身体加长,分加多,并且随机生成新食物

len++;

score += 10;

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

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

}

//撞到自身的处理

for(int i=1;i

if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){

isFailed = true;

}

}

//重新绘图

repaint();

}

//事件刷新

timer.start();

}

//加载背景音乐

public void loadBGM(){

try {

//从类所在文件引入

bgm = AudioSystem.getClip();

InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav");

AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is));

bgm.open(ais);

//bgm.loop(Clip.LOOP_CONTINUOUSLY);

}

//相应的异常处理

catch (LineUnavailableException e) {

e.printStackTrace();

}

catch (UnsupportedAudioFileException e) {

e.printStackTrace();

}

catch (IOException e) {

e.printStackTrace();

}

}

//加载图片

public void loadImages(){

InputStream is;

try {

//依次添加响应元素

is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg");

title = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png");

body = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png");

up = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png");

down = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png");

left = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png");

right = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png");

food = new ImageIcon(ImageIO.read(is));

} catch (IOException e) {

e.printStackTrace();

}

}

}

四、效果

if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){

isFailed = true;

}

}

//重新绘图

repaint();

}

//事件刷新

timer.start();

}

//加载背景音乐

public void loadBGM(){

try {

//从类所在文件引入

bgm = AudioSystem.getClip();

InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav");

AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is));

bgm.open(ais);

//bgm.loop(Clip.LOOP_CONTINUOUSLY);

}

//相应的异常处理

catch (LineUnavailableException e) {

e.printStackTrace();

}

catch (UnsupportedAudioFileException e) {

e.printStackTrace();

}

catch (IOException e) {

e.printStackTrace();

}

}

//加载图片

public void loadImages(){

InputStream is;

try {

//依次添加响应元素

is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg");

title = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png");

body = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png");

up = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png");

down = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png");

left = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png");

right = new ImageIcon(ImageIO.read(is));

is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png");

food = new ImageIcon(ImageIO.read(is));

} catch (IOException e) {

e.printStackTrace();

}

}

}

四、效果


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

上一篇:NO5
下一篇:ansible主配文件解析
相关文章

 发表评论

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