第二次結對編程做業

一、在文章開頭給出結對同窗的博客連接、本做業博客的連接、你所Fork的同名倉庫的Github項目地址(2分)

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

二、給出具體分工(2分)

陳鈺蕙:負責前端和美工github

鄭雅芳:負責後端和美工web

三、給出PSP表格(2分)

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

四、解題思路描述與設計實現說明(15分)

網絡接口的使用(3分)

參考博客: 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後端

代碼組織與內部實現設計(類圖)(6分)

參考代碼: https://github.com/WangYunZYJ/PokerProvider

一開始沒有什麼頭緒,開會的時候問了一下其餘人,說GitHub上有開源碼,就去找了一下,這個參考代碼包括了發牌系統,加上對JAVA不太熟悉,就研究了好久。最後以其中的包AlgorithmByBai爲基礎,進行修改和編碼。

代碼組織和內部實現設計類圖以下

前端部分:

算法部分:

說明算法的關鍵與關鍵實現部分流程圖(6分)

創建了Card和Choice對象,用於存儲牌和三墩,同時創建array對象,記錄有一、二、三、4張同花色牌型和同大小牌型的狀況,便於算法分析整理。主要實現算法的類是Player,流程圖以下所示

//xmind畫流程圖好像有點醜……

五、關鍵代碼解釋(3分)

貼出你認爲重要的/有價值的代碼片斷,並解釋(3分)

前端部分:

//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;
        }

六、性能分析與改進(6分)

描述你改進的思路(5分)

前端部分:

原本直接在主線程裏接了接口,運行後發現會出現些問題,因而將接口放在子線程裏。可是又發現了一個問題,子線程中無法直接設置界面資源,通過參考了一些博客的解決方法,最後藉助Handler處理異步消息,實現子線程中得到的參數對界面的設置.

算法部分:

普通牌型的選擇思路還存在許多冗餘的代碼能夠進行簡化

展現性能分析圖和程序中消耗最大的函數(1分)

七、單元測試(5分)

展現出項目部分單元測試代碼,並說明測試的函數,構造測試數據的思路

八、遇到的代碼模塊異常或結對困難及解決方法(8分)

問題描述(2分)
  • 撲朔迷離的接口和間歇性抽風的Android Studio(手動再見),當事人表示很是後悔,改bug的時間都夠學web了吧இAஇ

  • api調用:沒有接觸過api調用,一臉懵逼,百度以後,大概就是實例代碼看不懂,理論知識學不會(;´༎ຶД༎ຶ`)

  • 算法實現:一開始的疑問,暴力模擬(大概就是最死板的那樣打的意思)會超時嗎。後來,你告訴我怎麼直接打,被各類狀況逼瘋இAஇ

作過哪些嘗試(2分)
  • 面向百度好像沒有什麼結果,後來開會閒聊纔想起來能夠去GitHub找開源碼。搜索十三水真的有項目,後來抱着求知的心(看不懂前面找的算法),還搜索了shisanshui、ThirteenWater,事實證實善用搜索引擎很重要。並且有的項目裏有shisanshui的字樣的代碼,命名和描述與十三水無關的,就能夠找到更多,跑題了(。
  • 雖然算法仍是隻知其一;不知其二,可是學習開源碼的過程當中收穫不少,學習了用Maven組織項目,入門了Spring框架,嘗試用springboot解決問題……(一點點感想:我發現比起跟着書本一步步的打代碼,這樣經過實踐項目的學習更會讓人有上癮的感受,就像解密同樣,一步步的學習。並且這樣的學習與實踐須要關聯度更大。算是學到一種新的學習方法吧。去找一些優秀的開源項目,而後把它從頭學到尾,能夠收穫不少。
是否解決(2分)
  • 算法大概就是實現到能夠正兒八經出牌,可是不保證勝利的程度,可是api調用仍是有問題,須要進一步解決。
有何收穫(2分)
  • 自我學習和探索的能力,接觸到了新的學習方法。
  • 從Android到Eclipse再到IDEA,一個合適的、用着順手的(、有問題都能百度獲得詳細教程的)IDE也是很重要的
  • 入門了Spring框架,進一步學習了Java

九、評價你的隊友(4分)

雅芳說:

值得學習的地方:「今天也是很喜歡陳鈺蕙的一天啊」,陳鈺蕙真的很討喜啊,一點點進步就不會絕不吝嗇她的誇獎,偶爾暴躁的話也能夠很快被她安撫好。我就喜歡這種一言不合就誇個人脾氣賊好的遇到問題會一塊兒討論的小姐姐q(≧▽≦q)

須要改進的地方:若是我是拖延症,那陳鈺蕙就是拖延癌了吧,還伴隨着沒有課就不出門的死宅屬性。

鈺蕙說:

值得學習的地方:寶藏女孩鄭雅芳!一塊兒作事情就是發現她越多隱藏技能的過程,美工超棒,獲取、學習信息也賊快,害,抱雅芳學姐大腿太舒服了!

須要改進的地方:就是咱們倆的拖延症吧哈哈哈

十、學習進度條(2分)

第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
1 0 0 7.6 7.6 最重要的固然是學會了十三水!學習了Axure,實現了原型設計
2 200 200 22 29.6 討論如何實現算法,對JAVA進一步學習。決定用安卓進行開發
3 1920 1920 21 50.6 學習和研究GitHub開源碼,開始用idea實現後端算法
4 2293 2293 28 78.6 完善算法,實現交互,接口調試

(我真的有看清楚第二行是累計代碼,沒有累計的緣由是每次都重寫了QAQ)

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息