1.团队成员介绍及任务分配
何汐(组长)
- 深受NetBeans折磨发誓再也不用了
- 背景音乐线程
- 开局模式
- 界面美化设计
- GUI(主菜单及游戏页面)
李永会(组员)
- 在文件流里面险些淹死
- 登录&&注册
- 排行榜
- GUI(登录及排行榜)
汪雨(组员)
- 哪里需要哪里搬
- 读取进度
- 后退一步
- 排行榜数据处理
2.项目git地址
https://gitee.com/h201821123068
3.git提交记录
3.项目功能架构图与主要功能流程图
项目功能架构
主要功能流程图
4.项目UML图
5.项目运行截图
注册用户
登录失败
继续游戏
新游戏
返回主菜单
关闭游戏
帮助&&排行榜
6.项目关键代码
1.登录界面设计
- 建立一个板块jp插入背景图
JPanel构建背景图需要重构new JPanel - 分别将用户名和输入框、密码和输入框、按钮存为一个面板
- 利用GridLayout对于上述三个面板进行布局
- 其他窗口的界面设计均采用NetBeans自动生成
public void window() {
JLabel label1 = new JLabel("L O G I N");
label1.setFont(new Font("Snap ITC", 0, 47));
label1.setBounds(200, 10, 100, 10);
label1.setForeground(Color.darkGray);
JPanel jp1 = new JPanel();
ImageIcon bg = new ImageIcon("/image/444.png") ;
bg.setImage(bg.getImage().getScaledInstance(900, 600, Image.SCALE_DEFAULT));
JPanel jp = new JPanel(){
@Override
protected void paintComponent(Graphics g) {
ImageIcon icon = new ImageIcon("images/444.png");
Image img = icon.getImage();
g.drawImage(img, 0, 0, 400, 350, icon.getImageObserver());
}
}
;
jp.setBorder(new EmptyBorder(10, 10, 10,10));
jp.setBackground(null);
jp.setOpaque(false);
ImageIcon im=new ImageIcon();
JLabel jl1 = new JLabel("账号");
jl1.setFont(new Font("微软雅黑", 0, 14));
jl1.setOpaque(false);
jl1.setIcon(bg);
jtfNumber = new JTextField(15);
jp1.add(jl1);
jp1.add(jtfNumber);
jp1.setOpaque(false);
JPanel jp2 = new JPanel();
JLabel jl2 = new JLabel("密码");
jl2.setFont(new Font("微软雅黑", 0, 14));
jpf = new JPasswordField(15);
jp2.add(jl2);
jp2.add(jpf);
jl2.setOpaque(false);
jp2.setOpaque(false);
JPanel jp3 = new JPanel();
JLabel jl3 = new JLabel("姓名");
jl3.setFont(new Font("微软雅黑", 0, 14));
jtfName = new JTextField(15);
jp3.add(jl3);
jp3.add(jtfName);
jl3.setOpaque(false);
jp3.setOpaque(false);
JPanel jps = new JPanel();
jps.setBackground(null);
jps.setOpaque(false);
Dimension preferredSize = new Dimension(80,40);
jbLogin = new JButton("注册");
jbLogin.setFont(new Font("微软雅黑", 0, 14));
jbLogin.setPreferredSize(preferredSize);
jbLogin.addActionListener(this);//给按钮添加响应
jbRegister = new JButton("登录");
jbLogin.setFont(new Font("微软雅黑", 0, 14));
jbRegister.setPreferredSize(preferredSize);
jbRegister.addActionListener(this);//给按钮添加响应
jps.add(jbLogin);
jps.add(jbRegister);
jp.setBackground(null);
jl1.setBackground(null);
JPanel jpc = new JPanel(new GridLayout(4, 1));// 4行1列布局
jpc.setBackground(null);
jpc.setOpaque(false);
jpc.add(jp1);
jpc.add(jp2);
jpc.add(jp3);
jpc.add(jps);
jp.add(label1);
jp.add(jpc);
add(jp);
setTitle("登录窗口");//窗口标题
setSize(400, 350);// 窗口大小
setLocationRelativeTo(null);// 窗口居中
}
2.排行榜
创建Player类,定义name、number、mark三个属性,用户游戏得分的文件存取格式也是这三个属性,一行一行地读取装有用户游戏得分的文件,用split()方法将读取出来的一行数据分装成数组,将这个数组赋值给Player类型的数组,调用Arrays.sort()方法将数组按升序排序,用这个排好序的数组去创建排行榜的界面,排行榜至多显示前五名
public Player[] readChart(int k) throws IOException {
final String PATH = "ABC.txt";//指定文件的路径
File file = new File(PATH);
int lines = 0;
try {
FileInputStream fos = new FileInputStream(file);
InputStreamReader osw = new InputStreamReader(fos);
BufferedReader bw = new BufferedReader(osw);// 使用缓冲区数据流封装输入流
LineNumberReader lineNumberReader = new LineNumberReader(bw);//获取文件行数,即玩家人数
lineNumberReader.skip(Integer.MAX_VALUE);
lines = lineNumberReader.getLineNumber() + 1;//从0开始计数,所以这里算行数的时候需要+1
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int i = 0;
Player factor[] = new Player[lines];//创建玩家类
try {
if (!file.exists()) {//判断文件是否存在,不存在就创建一个文件
file.createNewFile();
}
FileReader fr = new FileReader(file); // 创建文件输入流(读取)
BufferedReader br = new BufferedReader(fr); // 使用缓冲区数据流封装输入流
String str = "";
while ((str = br.readLine()) != null) {
try {
String[] data = str.split(" ");
int a = Integer.parseInt(data[2]);
factor[i]=new Player(data[0],data[1],a);//传入name、number、mark
i++;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界");
}
}
Arrays.sort(factor);//根据分数从高到低排序
}catch(NullPointerException e) {
e.printStackTrace();
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(k==0)
windoow(factor);
return factor;
}
7.代码静态扫描
修改后
8.尚待改进或者新的想法
尚待改进
1.NetBeans的默认代码只支持JLabel和JButton设置背景图片,定制相关的代码之后,还是不能对于面板甚至整个窗体设置背景图片,NetBeans设计页面和eclipse自己写页面差别也蛮大的,所以最后只是设置了背景颜色;
2.时间紧任务重,只是构造了游戏的背景音乐,没有来的及设计游戏移动音效;
3.团队协作上,任务分配上有冲突有重复,效率不高;
4.代码规范上,采用插件之后发现有很多以前不会注意到的小细节,例如注释的格式是/**注释*/,有些地方需要标明@author;
5.在GUI设计上,由于对一些复杂组件不是特别了解,只是采用JPanel一些小组件,还有很多更简单方便的组件没有去设计;
新的想法
1.将2048小游戏转变成安卓手机小游戏,这个开始有设想过,但是后面百度查资料的时候发现真的还挺难的,这个还是得慢慢来;
2.加入方块移动的音效;
3.在经典玩法之外设计出速度模式;
4.增加签到功能获取钻石,以钻石获取后退一步或者开启特殊关卡的机会;
5.增设双人对战模式;
6.将数字方块转换成abcd字母或者其他具有递进性的元素;![]