写在前面:本人是一个实实在在的Java新人。这个项目是我的一次大作业,由于是第一版本,所以目前的功能也只是基本实现。代码的实现是没有问题的,关于代码的优化的方向,还有一些目前的bug我也会在文章中说明,大家可以共同研究,共同进步的。
实现方式
设计了七个类,分别是Gamejilu类、Judge类、Main类、Running类、Shengli类、Start类、Video类。
对应的类的功能见下表:
类 | 实现的功能 |
---|---|
Main | 实现了初始化了一个Start类的对象 |
Start | 提供了游戏开局的功能选择菜单,包括开始游戏、游戏记录、退出游戏等选项 |
Running | 表示用户在Start类中点击“开始游戏”后进入的界面 |
Gamejilu | 表示用户在Start类中点击“游戏记录”后进入的界面 |
Video | 主要用于播放背景音乐 |
Judge | 该类中用于判断当前落下的棋子会不会造成胜利 |
Shengli | 用来实现胜利的界面和背景音效,并对游戏结果记录 |
系统流程图
各个类的UML图的关系
注:存在参考价值,但参考价值不大。
类的详细设计及实现
-
Main类
该类主要用于实现一个游戏类的初始化。
-
Start类
该类继承于JFrame,并添加了监视器窗口。在构造方法中,对游戏的界面做了调整,使该游戏在任何电脑上运行都处于中间位置,并固定1280*700的界面。对游戏的画面进行了调整,插入了背景图片置于底部,同时也添加了背景音乐,使用户的游戏体验感更强。加入“开始游戏”、“游戏记录”、“退出游戏”的三个功能的按钮,并对这三个按钮添加了监视器,在监视器中针对不同情况,生成不同的类来使游戏继续。
-
Running类
该类继承于JFrame,并添加了监视器窗口。在该类中首先对背景进行了绘制,添加了四子棋的背景图片,接着用6*7个JPanel作为每一个棋子,通过对界面的游戏棋局进行二维布局,来实现对棋子落下的这一操作。添加七个JButton按钮,对每一列按钮的落下进行监视。点击按钮的过程中,通过对按钮的被按下的次数进行判断,进而确定面板的颜色,对面板进行绘色并添加到界面中。并且在添加面板的过程中,对每一个落子进行判断,判断落下去该子之后,该子颜色的一方是否赢得胜利。实现了在胜利之后,所有按钮全部失灵。
-
Gamejilu类
该类继承于JFrame,并添加了监视器窗口。在游戏记录类里面,设计了一个新的窗口,窗口中JTextArea用来存放从文件中读取的内容。并在窗口中添加了一个JButton用于清除窗口上显示的内容和文件中存储的内容。
-
Video类
该类继承于Thread类,这个线程的目标是实现背景音乐的播放。主要是对于音乐文件读取并进行播放。
-
Judge类
该类主要实现对新加入的棋子进行线性探测。由num表示探测到棋子的总数,先进行左右探测,如果左右相同的数字num大于4,则生成该落子颜色的一方胜利的对象。如果num小于4,则num置零。同理,对左斜线上和右斜线上的相同颜色的棋子进行线性探测。右移四子棋的游戏规则,所以只需要对下方的棋子探测即可,新落下的棋子的上方是没有棋子的。
-
Shengli类
该类继承于JFrame,主要用于生成一个胜利的小窗口界面,在小窗口中显示游戏的胜利方,添加胜利的背景音效,并对游戏进行记录,得到游戏的结果,将游戏的结果存储到文本文件中。
主要代码实现
想了很久,主要讲什么,发现自己可以讲出来的很少,就挑几个自己觉得写的还可以、有代表性的列了出来,其实看注释就可以理解的差不多了,我在下面也注释了实现的过程。
- Video类的实现
public class Video extends Thread {
/**
* 创作者:渺辰
* 版权所属
*/
private String string;
private String str;
private File file;
private FileInputStream fi;
private Player player;
private BufferedInputStream bi;
Video(String string) {
this.string = string;
try {
str = this.getClass().getResource("").toURI().getPath();
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} // 找到绝对路径,需要注意中文路径存在问题
// System.out.println(str);
str = str.substring(1, str.length() - 13);// 裁剪得到想要的路径
str = str + "/src" + string;
file = new File(str);// 我的里面存在中文路径,得到绝对路径以后需要转化为utf-8编码
// System.out.println(str);
}
public void run() {
//找到要播放的文件的路径地址
if(this.string == null)
return;
try {
fi = new FileInputStream(file);
bi = new BufferedInputStream(fi);
player = new Player(bi);
while(true)
player.play();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
player