本次的结对编程项目在假期前就公布了需求,也让咱们此次的假期非常充实,感受本次结对与搭档合做很愉快也收获颇多,接下来具体讲下对咱们组本次结对编程项目的一些收获与总结,主要分为后端我的项目复用,前端UI设计与结对编程经验收获三部分。前端
一,后端我的项目复用(队友部分)java
(1) 总体状况:咱们组两我的的我的项目都是使用C++写的,因此后端出题部分要重写,由于队友的程序复用度,可拓展性方面要比我好不少,因此这部分就由搭档负责翻译成java,在翻译过程当中搭档进一步进行了封装细化,把登录,注册,出题,答题等部分分解放到了后端包里不一样的java文件中。编程
(2) 查重部分:咱们组考虑到以前查重须要读入全部文件逐道题目进行遍历对比的方式成本太高,因此改成了使用哈希的方式,简单高效,避免了大量文件输入输出操做。附哈希查重部分代码。小程序
public static int toHash(String str) //字符串哈希函数,返回字符串生成哈希值 { int hashcode = 0; int length = str.length(); int letterValue = 0; for(int i = 0; i < length; i++) { letterValue += str.charAt(i); hashcode = letterValue % 301; } return hashcode; }
(3) 短信发送部分:听取了群里同窗的建议,再加上咱们组原本打算作一款小程序,就申请了公众号并关联了小程序,因此在申请第二个阿里云标签时比较顺利,固然后期发现小程序要上线须要服务器太贵了就放弃了(话说小程序书也借了,都开始码代码了简直哭死)。在具体实现上咱们组把发送短信验证码单独封装在了一个文件与阿里系统配置文件进行了隔离,附发送部分代码。后端
public int sendCode(String number) throws ClientException { Sms sms = new Sms(); code = (int)(new Random().nextDouble()*10000); sms.sendSms(code+"", number); return code; }
二,前端UI设计(由我负责)服务器
(1) 总体状况:总体项目实现上进行了分区,把全部前端程序全放在了一个包里,每一个页面均是一个java文件,避免了条理混乱与相互干扰。在整个过程当中收获不少,几天的时间里从对java几乎不会使用的小白到会基础UI界面设计再到实现背景图片,背景音乐,按键鼠标自定义形状,动态桌面等稍微高级点功能,后续我会再单独整理篇相应的博客来详细总结下(感兴趣的能够私我)。app
(2) UI背景:在花了点时间学会了按键,进度条等基础UI设计后,以为只使用这些设计UI实在是丑到爆炸,有种穿越到上个世纪的感受,因此进行了必定探索,花了一上午学习了如何给页面附上背景图片,而且本身写了个模板方便之后的复用,其实实现思路很简单,只须要加一个JLabel对象装背景图片,以后把它放到JFrame分层面板的最底层,并把JPanel设置为透明色就能够在JPanel上自由增长各类组件而不被背景遮挡,加上背景的一瞬间真的有种时代进步的感受,附对比效果图与代码。dom
import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Test extends JFrame { public Test() { setBak(); //调用背景方法 Container c = getContentPane(); //获取JFrame面板 JPanel jp = new JPanel(); //建立个JPanel jp.setOpaque(false); //把JPanel设置为透明 c.add(jp); setSize(540, 450); setVisible(true); } public void setBak(){ ((JPanel)this.getContentPane()).setOpaque(false); ImageIcon img = new ImageIcon("c://Sunset.jpg"); //添加图片 JLabel background = new JLabel(img);this.getLayeredPane().add (background, new Integer(Integer.MIN_VALUE)); background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight()); } public static void main(String[] args) { Test s = new Test(); s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
(3) 背景音乐:考虑到实际的app通常都带音乐并且支持自由开关暂停等因此和队友一块儿探索了如何实现,发现java中能够经过AudioClip类来实现音乐播放,循环等操做,AudioCLip主要的方法有:play()播放依次声音;loop()循环播放音乐;stop()中止播放,可是AudioClip对音乐格式要求至关严格(只支持.wav、.mid、AIFF等)。另外为了更加人性化,咱们在登陆界面与作题界面增长了设置音乐播放与暂停的选择按钮,最后附上播放音乐代码。ide
import java.applet.Applet; import java.applet.AudioClip; import java.io.File; import java.net.MalformedURLException; import java.net.URL; public class PlayMusic { private static URL url = null; private static AudioClip ac; public static void playMusic() { File f1 = new File("./project/Music/段鹏 - 雨后 (纯音乐).wav"); try { url = f1.toURL(); } catch (MalformedURLException e) { e.printStackTrace(); } ac = Applet.newAudioClip(url); ac.loop();//循环播放 } public static void Stop() { ac.stop(); } }
(4) 自定义按钮,鼠标标志等形状与样式:最后在实现播放暂停音乐时我以为放个普通按键在那里实在太丑了,想要提高点逼格,因此又上网查了下,果真发现原来按钮不只能够自定义形状,还能够是一副图片等等,还无心间发现原来连鼠标符号也能够自定义,之前一直以为java设计界面丑如今才发现是本身太菜只会基础UI设计,最后本身采用了图片的按键形式,只须要加一个ImageIcon对象附上本身要的按键图片,再将其传给JButton对象上就能够了,这里注意一点,在设置图片时由于按键很小,图片通常都会比按键大,因此直接设置会只显示图片一部分,可使用getScaledInstance()方法从新构造图片,再构造Icon对象传入JButton中便可,一样的在前面设置背景图片时也可使用这种方法(省的反复剪裁图片大小)。附自定义按钮代码与调节鼠标的相关连接。函数
JButton setMusic = new JButton(); setMusic.setBounds(260,90, 40, 30); ImageIcon ii = new ImageIcon("./project/背景配图/H]$12QL1MXH)RSXTU6AXHRK.png"); //根据按钮大小改变图片大小 Image temp = ii.getImage().getScaledInstance(setMusic.getWidth(), setMusic.getHeight(), ii.getImage().SCALE_DEFAULT); ii = new ImageIcon(temp); setMusic.setIcon(ii);
(5)一些小细节:一切为了客户体验,因此在显示题目页面增长了当前进度条以及一句励志的话语,在最后分数展现时会根据不一样分数段分别展现不一样界面与语言。
三,结对编程的经验收获:
(1) 分工很重要:此次结对感受前期分工比较合理因此后期就比较舒服,搭档的我的项目作得要比我好不少因此负责后端复用代码,而我就负责前端,这样也充分发挥了两人的长处,搭档对本身的代码更熟悉改起来也快,我也只须要专心前端。
(2) 沟通很重要:此次编程感触颇深,老师以前上课讲敏捷开发要求项目组内部天天都要汇报沟通,咱们组此次作的仍是比较不错的,天天感受都在线上交流,尤为是先后端对接时两我的单独抽了一天一块儿在综合楼拼了起来,不过也有教训,在假期最后一天,因为线上交流歧义,致使两我的的项目版本出现了一些误差,不过很快修复了过来。