目录
JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一)
JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三)
前言
此文章仅代表个人平时的学习知识分享,希望能帮助到大家,如果对大家有用给个点赞+加关注谢谢!(如果有问题请在评论区指出,我会给予回复)。
1. 任务描述
1.1 课程设计目的
本次课程设计是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践。主要目的包括但不限于:
(1)综合使用各种图形用户界面设计组件,实现常见的功能,熟悉这些组件的使用方法,如选择框,下拉列表框。
(2)掌握一个的界面布局管理技术。
(3)掌握通过互联网查找资料的能力。
1.2 课程设计内容和要求
根据以前小时候经常喜爱的小游戏贪吃蛇的游戏模式、游戏内容和游戏特色设计了本次的课程设计内容贪吃蛇游戏,因为本身也是一个比较简单的游戏,内容并不是非常的复杂,因此这次课程设计我们实现了贪吃蛇游戏的一些基本游戏内容:
1、设置了三种游戏难度(简单、困难和地狱)依据小蛇移动速度快慢实现。
2、设置了两种模式(穿墙模式和撞墙模式)依据是否设置边界条件实现。
3、设置游戏的吃到食物的个数计数和分数计数。
4、设置了游戏失败的判断(在撞墙模式下撞墙和蛇头碰到蛇的身体)。
5、设置了图片的读入使整个游戏界面更加美观、同时设置了背景音乐。
本程序设计就是依照这些内容构建了一款简单而充满童年回忆的小游戏贪吃蛇。
2. 系统分析与设计
2.1 系统总体结构
本系统共包括3个Java源文件。
类之间的关系如图1所示。
三、源代码
1、类Music
package snake;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
//创建Music类继承Thread线程类,实现游戏和音乐两个线程同时进行
public class Music extends Thread {
//音乐启动、暂停变量
private boolean stop=false;
//定义私有变量音乐文件名称变量
private String fileName;
//定义私有最终变量缓存区大小
private final int EXTERNAL_BUFFER_SIZE = 524288;
//重写构造方法并设置传入文件位置
public Music(String wavFile) {
//将传入音乐文件赋值给fileName
this.fileName = wavFile;
}
//控制音乐暂停
public void stopPlaying() {
stop=true;
}
//定义音乐运行方法run
public void run() {
//创建File对象soundFile,并打开音乐文件
File soundFile = new File(fileName);
//检查播放音乐的文件名是否存在
if (!soundFile.exists()) {
//如果不存在输出不存在音乐文件提示信息
System.err.println("Wave file not found:" + fileName);
return;
}
// 设置循环播放
while (stop==false) {
// 创建音频输入流对象
AudioInputStream audioInputStream = null;
// 调用try{}catch{}异常处理语句
try {
// 创建音频对象
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
//音频文件打开异常
} catch (UnsupportedAudioFileException e1) {
//打印异常,并显示调用信息
e1.printStackTrace();
return;
//输入/输出异常
} catch (IOException e1) {
//打印异常,并显示调用信息
e1.printStackTrace();
return;
}
// 设置音频格式
AudioFormat format = audioInputStream.getFormat();
// 定义源数据线
SourceDataLine auline = null;
//受数据行支持的音频格式创建源数据行对象,保存源数据线信息
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
// 调用try{}catch{}异常处理语句
try {
//获取源数据线
auline = (SourceDataLine) AudioSystem.getLine(info);
//打开音频格式
auline.open(format);
//数据行异常
} catch (LineUnavailableException e) {
//打印异常,并显示调用信息
e.printStackTrace();
return;
//通常异常类异常
} catch (Exception e) {
//打印异常,并显示调用信息
e.printStackTrace();
return;
}
//判断音频数据是否支持调控
if (auline.isControlSupported(FloatControl.Type.PAN)) {
//创建发言权控制对象pan,并请求服务获取资源(在交互协助环境中协调、控制并发使用共享资源)
FloatControl pan = (FloatControl) auline.getControl(FloatControl.Type.PAN);
}
//源数据线开始工作
auline.start();
//定义音频文件所含全部字长存储变量
int nBytesRead = 0;
//定义缓冲区大小
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
// 调用try{}catch{}异常处理语句
try {
//判断文件是否读取完毕
while (nBytesRead != -1) {
//获取音频文件所含全部字长并赋值
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
//重写入音频
auline.write(abData, 0, nBytesRead);
}
//输入/输出异常
} catch (IOException e) {
//打印异常,并显示调用信息
e.printStackTrace();
return;
} finally {
//将当前流中所有缓冲数据写入底层流,防止数据缺失
auline.drain();
//关闭源数据线
auline.close();
}
}
}
}
总结
第一部分主要设计主类,大家可以根据注释理解代码。