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

  • 相关阅读:
    微软软件下载
    FTP主动连接与被动连接
    Linux下grep显示前后几行信息
    cacti 安装过程中“ERROR: 您的MySQL TimeZone 数据库未被填充. 请在继续之前填入此数据库.”
    Cacti安装详细步骤
    Linux 踢掉其他终端用户
    迁移设备存储报的错误及解决方式
    sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)
    Nginx日志按日期切割详解(按天切割)
    git pull冲突:commit your changes or stash them before you can merge.
  • 原文地址:https://www.cnblogs.com/victory0917/p/12172209.html
Copyright © 2020-2023  润新知