Java课程设计——2048小游戏(红红火火恍恍惚惚还很困)

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字母或者其他具有递进性的元素;![]

posted @ 2020-01-09 16:46  何汐  阅读(1149)  评论(0编辑  收藏  举报