UI視頻地址:https://pan.baidu.com/s/1Lv-FIDN4rfea41MYvaKYoAhtml
陳鈺蕙(本做業):http://www.javashuo.com/article/p-kkwmkcqc-bb.html前端
鄭雅芳:http://www.javashuo.com/article/p-nfnedhjr-bo.htmljava
Github地址: https://github.com/YvonneLhy/ThirteenWatergit
陳鈺蕙:負責前端和美工github
鄭雅芳:負責後端和美工web
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 60 | 50 |
Estimate | 估計這個任務須要多少時間 | 60 | 50 |
Development | 開發 | 3600 | 4500 |
Analysis | 需求分析 (包括學習新技術) | 420 | 540 |
Design Spec | 生成設計文檔 | 60 | 60 |
Design Review | 設計複審 | 30 | 40 |
Coding Standard | 代碼規範 (爲目前的開發制定合適的規範) | 30 | 20 |
Design | 具體設計 | 360 | 400 |
Coding | 具體編碼 | 1440 | 2000 |
Code Review | 代碼複審 | 60 | 90 |
Test | 測試(自我測試,修改代碼,提交修改) | 1200 | 1350 |
Reporting | 報告 | 140 | 180 |
Test Report | 測試報告 | 60 | 80 |
Size Measurement | 計算工做量 | 20 | 20 |
Postmortem & Process Improvement Plan | 過後總結, 並提出過程改進計劃 | 60 | 80 |
合計 | 3800 | 4730 |
參考博客: https://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html算法
主要是http的get和post請求,有嘗試過用Apache Jakarta Common下的子項目HttpClient(spring
參考博客: https://blog.csdn.net/wangpeng047/article/details/19624529json
),可是感受不太能理解,並且須要添加新的依賴有點麻煩的樣子(?),用傳統JDK自帶的URLConnection比較看得懂的樣子。就選擇了第一篇參考博客提供的方法。
在下定決心搞懂Connection後,被憨憨嘲諷了:)
永福提供的提供的接口能夠直接複製使用,只是須要添加一些依賴包,詳細可見參考博客:https://blog.csdn.net/bigbigsman/article/details/90707669後端
參考代碼: https://github.com/WangYunZYJ/PokerProvider
一開始沒有什麼頭緒,開會的時候問了一下其餘人,說GitHub上有開源碼,就去找了一下,這個參考代碼包括了發牌系統,加上對JAVA不太熟悉,就研究了好久。最後以其中的包AlgorithmByBai爲基礎,進行修改和編碼。
代碼組織和內部實現設計類圖以下
前端部分:
算法部分:
創建了Card和Choice對象,用於存儲牌和三墩,同時創建array對象,記錄有一、二、三、4張同花色牌型和同大小牌型的狀況,便於算法分析整理。主要實現算法的類是Player,流程圖以下所示
//xmind畫流程圖好像有點醜……
前端部分:
//POST new Thread(new Runnable() { @Override public void run() { try { URL url = new URL("https://api.shisanshui.rtxux.xyz/auth/login"); // 2. 建立HttpURLConnection對象 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 3. 設置請求參數等 // 請求方式 connection.setRequestMethod("POST"); // 超時時間 connection.setConnectTimeout(30000); connection.setReadTimeout(30000); // 設置是否輸出 connection.setDoOutput(true); // 設置是否讀入 connection.setDoInput(true); // 設置是否使用緩存 connection.setUseCaches(false); // 設置此 HttpURLConnection 實例是否應該自動執行 HTTP 重定向 connection.setInstanceFollowRedirects(true); // 設置使用標準編碼格式編碼 connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");//json格式 // 鏈接 connection.connect(); // 4. 處理輸入輸出 // 寫入參數到請求中 //Content-Type:application/json;charset=UTF-8 對應json格式參數數據 String params = "{" + "\"username\":\"" + login_name.getText() + "\"" + "," + "\"password\":\"" + login_password.getText() + "\"" + "}"; OutputStream out = connection.getOutputStream(); out.write(params.getBytes()); out.flush(); out.close(); // 從鏈接中讀取響應信息 String msg = ""; int code = connection.getResponseCode(); if (code == 200) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = reader.readLine()) != null) { msg += line + "\n"; } Log.d("BaoFuPay", "Result:" + msg); reader.close(); } // 5. 斷開鏈接 connection.disconnect(); } }).start();
//GET public void HistoryByGet() { new Thread(new Runnable() { @Override public void run() { try { //get請求的url URL url=new URL( "https://api.shisanshui.rtxux.xyz/history"+ "?player_id=" + user_id + "&limit=100&page=10"); //TODO: HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置請求方式,請求超時信息 conn.setRequestMethod("GET"); conn.setReadTimeout(30000); conn.setConnectTimeout(30000); conn.setRequestProperty("X-Auth-Token", token); //開啓鏈接 conn.connect(); InputStream inputStream=null; BufferedReader reader=null; //若是應答碼爲200的時候,表示成功的請求帶了,這裏的HttpURLConnection.HTTP_OK就是200 if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //得到鏈接的輸入流 inputStream=conn.getInputStream(); //轉換成一個增強型的buffered流 reader=new BufferedReader(new InputStreamReader(inputStream)); //把讀到的內容賦值給result String result = reader.readLine(); // msg = result; Message msg = new Message(); Bundle data = new Bundle(); //將獲取到的String裝載到msg中 data.putString("value", result); msg.setData(data); msg.what = 1; //發消息到主線程 handler.sendMessage(msg); } //關閉流和鏈接 reader.close(); inputStream.close(); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { Bundle data = msg.getData(); String val = data.getString("value"); //設置UI Gson gson = new Gson(); // 將 json 轉化 成 List泛型 java.lang.reflect.Type type = new TypeToken<History>() {}.getType(); final History history = gson.fromJson(val, type); // hisList = gson.fromJson(val, new TypeToken<List<History>>() {}.getType()); HistoryAdapter adapter = new HistoryAdapter(HistoryActivity.this,R.layout.history_item,history.data); ListView listView = findViewById(R.id.history_list_view); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { History.His his = history.data.get(position); Intent intent = new Intent(HistoryActivity.this,DetailActivity.class); intent.putExtra("id",his.id); startActivity(intent); } }); Log.i("msg", "請求結果:" + val); } else if (msg.what ==0) { Toast.makeText(getApplicationContext(),"請求資源不成功",Toast.LENGTH_LONG).show(); } } };
算法部分:
for(int i=0;i<handCard.size();i++) { if((i+1)<handCard.size()&&handCard.get(i).rank==handCard.get(i+1).rank) if((i+2)<handCard.size()&&handCard.get(i).rank==handCard.get(i+2).rank) if((i+3)<handCard.size()&&handCard.get(i).rank==handCard.get(i+3).rank) //四張相同的牌 { arr.ranknum4.addAll(handCard.subList(i,i+4)); i+=3; } else //三張相同的牌 { arr.ranknum3.addAll(handCard.subList(i,i+3)); i+=2; } else //兩張相同的牌 { arr.ranknum2.addAll(handCard.subList(i,i+2)); i+=1; } else //沒有相同的牌 { arr.ranknum1.add(handCard.get(i)); } } for(int i=0;i<handCard.size();i++) { switch(handCard.get(i).type) { case 1:arr.typenum1.add(handCard.get(i));break; case 2:arr.typenum2.add(handCard.get(i));break; case 3:arr.typenum3.add(handCard.get(i));break; case 4:arr.typenum4.add(handCard.get(i));break; } } }
上面所示代碼十分簡單,但經過統計到手十三張牌的花色、大小相同的張數的狀況(我不知道這樣有沒有描述清楚,大概就是,ranknum1存儲的是僅一張這樣大小的牌的數量),大大簡化了後面算法過程當中判斷特殊牌型和一部分普通牌型的算法,減小了冗餘代碼,提升程序效率。如判斷特殊牌型三分天下代碼以下圖所示:
if(arr.ranknum4.size()==12) //三分天下 { choice=tochoice(handCard); choice.headType="sanfentianxia"; return; }
前端部分:
原本直接在主線程裏接了接口,運行後發現會出現些問題,因而將接口放在子線程裏。可是又發現了一個問題,子線程中無法直接設置界面資源,通過參考了一些博客的解決方法,最後藉助Handler處理異步消息,實現子線程中得到的參數對界面的設置.
算法部分:
普通牌型的選擇思路還存在許多冗餘的代碼能夠進行簡化
撲朔迷離的接口和間歇性抽風的Android Studio(手動再見),當事人表示很是後悔,改bug的時間都夠學web了吧இAஇ
api調用:沒有接觸過api調用,一臉懵逼,百度以後,大概就是實例代碼看不懂,理論知識學不會(;´༎ຶД༎ຶ`)
算法實現:一開始的疑問,暴力模擬(大概就是最死板的那樣打的意思)會超時嗎。後來,你告訴我怎麼直接打,被各類狀況逼瘋இAஇ
雅芳說:
值得學習的地方:「今天也是很喜歡陳鈺蕙的一天啊」,陳鈺蕙真的很討喜啊,一點點進步就不會絕不吝嗇她的誇獎,偶爾暴躁的話也能夠很快被她安撫好。我就喜歡這種一言不合就誇個人脾氣賊好的遇到問題會一塊兒討論的小姐姐q(≧▽≦q)
須要改進的地方:若是我是拖延症,那陳鈺蕙就是拖延癌了吧,還伴隨着沒有課就不出門的死宅屬性。
鈺蕙說:
值得學習的地方:寶藏女孩鄭雅芳!一塊兒作事情就是發現她越多隱藏技能的過程,美工超棒,獲取、學習信息也賊快,害,抱雅芳學姐大腿太舒服了!
須要改進的地方:就是咱們倆的拖延症吧哈哈哈
第N周 | 新增代碼(行) | 累計代碼(行) | 本週學習耗時(小時) | 累計學習耗時(小時) | 重要成長 |
---|---|---|---|---|---|
1 | 0 | 0 | 7.6 | 7.6 | |
2 | 200 | 200 | 22 | 29.6 | 討論如何實現算法,對JAVA進一步學習。決定用安卓進行開發 |
3 | 1920 | 1920 | 21 | 50.6 | 學習和研究GitHub開源碼,開始用idea實現後端算法 |
4 | 2293 | 2293 | 28 | 78.6 | 完善算法,實現交互,接口調試 |
(我真的有看清楚第二行是累計代碼,沒有累計的緣由是每次都重寫了QAQ)