第二次結對編程做業

1. 地址

本次博客連接
結對同窗博客連接
github項目地址html

2. 分工

童景霖:完成AI的實現
黃永福:完成UI的實現python

3. PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
· Planning · 計劃 30 20
· Estimate · 估計這個任務須要多少時間 20 20
· Development · 開發 240 300
· Analysis · 需求分析 (包括學習新技術) 200 600
· Design Spec · 生成設計文檔 30 30
· Design Review · 設計複審 20 20
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 10 10
· Design · 具體設計 60 80
· Coding · 具體編碼 200 240
· Code Review · 代碼複審 30 30
· Test · 測試(自我測試,修改代碼,提交修改) 30 40
· Reporting · 報告 40 60
· Test Repor · 測試報告 20 15
· Size Measurement · 計算工做量 20 25
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 20 20
· 合計 970 1510

4. 解題思路描述與設計實現說明

網絡接口的使用

  • 採用API文檔中「註冊與綁定」裏的代碼樣例實現註冊和綁定,其餘功能也基本相似,將函數中的參數進行修改便可
  • 將API返回的數據格式轉換,利用json.load()轉換成字典對象,再對字典進行處理得到所須要的數據git

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

關鍵部分流程圖

5. 關鍵代碼解釋

代碼的關鍵部分

  • AI_Part:
def find_card(c_list):
    s1 = 0
    s0 = 0
    for x0 in itertools.combinations(c_list, 5):
        list1 = c_list.copy()
        x0 = list(x0)
        a = gets_core(x0, 5)
        if a < 20 :
            continue
        for y0 in x0:
            list1.remove(y0)

        for x1 in itertools.combinations(list1, 5):
            list2 = list1.copy()
            x1 = list(x1)
            for y1 in x1:
                list2.remove(y1)
            x2 = list2

            b = gets_core(x1,5)
            c = gets_core(x2,3)

            if (a >= b) and (b >= c):
                s1 = a + 1.5*b + 2*c
                if s1 > s0:
                    s0 = s1
                    global card
                    card.clear()
                    # 3 x2
                    str2 = get_str(x2,3)
                    # 5 x1
                    str1 = get_str(x1,5)
                    # 5 x0
                    str0 = get_str(x0,5)
                    card.append(str2)
                    card.append(str1)
                    card.append(str0)
  • 利用itertools迭代器的combinations函數從13張牌中抽取5張做爲後墩,判斷後墩牌型,若爲散牌則直接跳過;再從剩下的8張牌中抽取5張作爲中墩,判斷中墩牌型,若比後墩大,則直接跳過,從新搜索中墩;剩下的3張牌爲前墩。
    將各類牌型賦予必定的分數值,將前中後墩的牌型分數相加獲得總分,總分最高的牌即爲最終牌型,並返回。github

  • UI_Part:
class IndexDetail(QtWidgets.QDialog, history_detail.Ui_Dialog):
    def __init__(self, parent=None, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.setupUi(self)
        self.res = API.history(MainWindow.TokenMine, IndexHistory.pid)
        print(self.res['status'])
        if self.res['status'] == 0:
            self.res = self.res['data']
            self.res = self.res['detail']
            self.label_name.setText(str(self.res[0]['name']))
            self.label_score.setText(str(self.res[0]['score']))
            self.label_card.setText(str(self.res[0]['card']))
            self.label_name_2.setText(str(self.res[1]['name']))
            self.label_score_2.setText(str(self.res[1]['score']))
            self.label_card_2.setText(str(self.res[1]['card']))
            self.label_name_3.setText(str(self.res[2]['name']))
            self.label_score_3.setText(str(self.res[2]['score']))
            self.label_card_3.setText(str(self.res[2]['card']))
            self.label_name_4.setText(str(self.res[3]['name']))
            self.label_score_4.setText(str(self.res[3]['score']))
            self.label_card_4.setText(str(self.res[3]['card']))
        else:
            self.label_card.setText('status:'+str(self.res['status']))

    def back(self):
        self.close()
        w = IndexHistory(window)
        w.show()
  • 戰局列表界面利用接口函數獲取該局PID記錄爲類成員,在詳情界面使用戰局列表類成員PID來調用接口獲取詳情,並顯示在GUI上,(如遇對局未完成等狀況,顯示返回的Status)

6. 性能分析與改進

性能分析圖


程序中消耗最大的函數

改進思路

  • 程序中消耗最大的函數是利用itertools迭代器,使用組合數列出13張牌能組成的全部牌型,再經過對每種狀況的牌型進行評分,將分數最高的牌型輸出。從13張牌中抽取5張,再從剩下的8張拍中抽取5張,最後剩下3張牌,這樣組成牌的前、中、後墩。因爲十三張牌能組成的牌型過多致使花費的時間很長。
  • 因爲每一個人有13張牌,因此後墩一定不多是散排(若是是散排則爲一條龍),所以能夠對後墩前進行判斷,若是是散牌則能夠直接跳過,考慮下一種狀況;一樣的也能夠對中墩進行判斷,若是中墩大於後墩,則跳過這種狀況,但此時應保持後墩不變,改變中墩。其餘的改進思路暫時還沒想到。

7. 單元測試

def getnum(a):
    return a.num


def tonghuashu(dun_b):
    lista = []
    listb = []
    listc = []
    listd = []

#分類
    for s in dun_b:
        if s.color == "#":
            lista.append(s)
        elif s.color == "$":
            listb.append(s)
        elif s.color == "&":
            listc.append(s)
        elif s.color == "*":
            listd.append(s)
#排序
    lista.sort(key=getnum)
    listb.sort(key=getnum)
    listc.sort(key=getnum)
    listd.sort(key=getnum)

    if len(lista) == 5:
        liste = lista
    elif len(listb) == 5:
        liste = listb
    elif len(listc) == 5:
        liste = listc
    elif len(listd) == 5:
        liste = listd
    else:
        liste = []


    l = len(liste)
    i = 1

    if l == 5:
        flag = True
        while i < l:
            if liste[i].num != liste[i-1].num+1:
                flag = False
                break
            i = i+1
    else:
        flag =False

    if flag is True:
        return liste[0].num
    else:
        return 0

a = tonghuashu(list)
print(a)
  • 這是測試傳入的中墩或者後墩是否爲同花順的代碼
  • 傳入的牌事先通過處理以類的形式存放於列表s中,先將他們根據不一樣的花色進行分類,若某一種花色的數量達到5,再將其按牌的大小進行排序,檢查是不是連續的牌型,是則爲同花順。json

    8. GitHub代碼簽入記錄

9. 遇到的代碼模塊異常或結對困難及解決方法

問題描述

  • AI_Part:
    • 不會使用api
    • 不懂得如何製做UI界面
    • 數據類型直接的轉換總是弄亂,對於一些函數的返回值類型不熟悉
    • 使用迭代器模塊時一直出現錯亂
  • UI_Part:
    • QTDesigner網上教程資源過少(多爲C++教程或者代碼實現教程)
    • .ui->.py 須要藉助Pyuic工具,而我下的最新版的anaconda找不到Pyuic.exe的路徑
    • 右鍵.ui文件使用Pyuic進行.ui->.py時 點錯成主模塊即個人UI.py形成了整個UI.py代碼丟失
    • 調用顯示繼承來的窗口發生跳出api

      作過的嘗試

  • AI_Part:
    • 百度查找相關資料以及到視頻網站查找相應的教學視頻
    • 詢問同窗
    • 不斷測試,增長了不少測試點尋找問題
  • UI.Part:
    • 百度精確檢索Pyqt5該關鍵詞項
    • 尋找原生的python文件裏帶該工具
    • 發現有歷史記錄這個工具英語水平太低未及時發現,經大佬提醒
    • 發現繼承來的窗口未定義自定義槽函數,一經調用,立馬跳出!網絡

      是否解決

  • AI_Part:
  • UI_Part:
    • app

      收穫

  • AI_Part:
    • 對API的使用更加熟練了
    • 能更加熟練的使用python,對python的瞭解也更多了
    • 學習使用了python的itertools模塊和time模塊
    • 簡單掌握了pyqt5的使用,能用pyqt5作出一些簡單的程序界面
  • UI_Part:
    • 熟悉API的使用,並可以根據所給的接口寫模塊
    • 對python自帶的工具欄更加熟悉
    • 對python附加工具更加熟悉
    • 對Pyqt5及QtDesigner熟練應用,並初步認識使用QtCreator
    • 對GUI的Init有必定了解

10. 評價隊友

值得學習的地方

  • 有耐心
  • 學習能力強

須要改進的地方

  • 效率有待提升

11. 學習進度條

第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
6 0 0 8 8 學習並能簡單使用墨刀、ps等軟件
7 800 800 12 20 學習python
8 1200 2000 12 32 學習python和pyqt5
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息