本次的結對編程項目在假期前就公佈了需求,也讓咱們此次的假期非常充實,感受本次結對與搭檔合做很愉快也收穫頗多,接下來具體講下對咱們組本次結對編程項目的一些收穫與總結,主要分爲後端我的項目複用,前端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) 溝通很重要:此次編程感觸頗深,老師以前上課講敏捷開發要求項目組內部天天都要彙報溝通,咱們組此次作的仍是比較不錯的,天天感受都在線上交流,尤爲是先後端對接時兩我的單獨抽了一天一塊兒在綜合樓拼了起來,不過也有教訓,在假期最後一天,因爲線上交流歧義,致使兩我的的項目版本出現了一些誤差,不過很快修復了過來。