第二次結對編程做業

1、結對狀況

陳夢雪
夢雪GitHub
朱慶章GitHubhtml

2、分工狀況

朱慶章負責前端、接口部分,以及博客撰寫部分
陳夢雪負責算法部分,以及博客的撰寫前端

3、PSP表格

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

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

一、網絡接口的使用

隨便貼三個js函數您就看明白了python

var token=localStorage.getItem("token");
        //拿牌
function start(){   
    $.ajax({
            url: "http://api.revth.com/game/open",
            beforeSend: function(xhr) 
            {
                xhr.setRequestHeader("X-Auth-Token",token);
            },
            type: "post",
            success: function (data) 
            {
                console.log(data);
                console.log(token);
                localStorage.setItem("cards",data.data.card);
                localStorage.setItem("game_id",data.data.id);//戰局ID
                solution();
            },
            error: function (res) {
                alert("沒法進入遊戲");
                window.location.href = '遊戲大廳.html';
            }
        });
};
        //算牌
function solution()
{
            var cards=localStorage.getItem("cards");
            alert("得到卡片:"+cards);
            console.log(JSON.stringify({
                "card":cards
            }));
    $.ajax({
            url: "http://127.0.0.1:8090/getcards", //算法
            data:{"card":cards},
            header:{
             "Content-Type": "application/x-www-form-urlencoded",
                    },
            type: "post",
            success: function (data) {
                var cardstring=data.card.toString();        
                localStorage.setItem("cardSolution",cardstring);
                
                //獲取結果完畢
                document.getElementById('player4').value ="Card: \n"+cardstring;
            },
            error: function (res) {
                alert("自動打牌錯誤");
                window.location.href = '遊戲大廳.html';
            }
    
        });
};
        //發牌
function postcard(){
    
    var id=localStorage.getItem("game_id");
    //localStorage.setItem("detailid1",id);
    var card2=localStorage.getItem("cardSolution");
    var card3=card2.split(/[ ,]+/);
    var card4=new Array(3);
    card4[0]=card3[0]+' '+card3[1]+' '+card3[2];
    card4[1]=card3[3]+' '+card3[4]+' '+card3[5]+' '+card3[6]+' '+card3[7];
    card4[2]=card3[8]+' '+card3[9]+' '+card3[10]+' '+card3[11]+' '+card3[12];
    console.log(card4);
    id =Number(id);
    $.ajax({
            url: "http://api.revth.com/game/submit",
            contentType:"application/json",
            data:JSON.stringify({
                "id":id,
                "card":card4
            }),
            beforeSend: function(xhr) {
                xhr.setRequestHeader("X-Auth-Token",token);
            },
            type: "post",
            success: function (data) {
                console.log(token);
                console.log(data);
                console.log(data.data.msg);
                alert("成功出牌");
                window.location.href = '遊戲大廳.html';
            },
            error: function (res) {
                alert("出牌失敗");
                window.location.href = '遊戲大廳.html';
            }
        });
    
}

二、代碼組織與內部實現設計

三、算法的關鍵與關鍵實現部分流程圖


整個算法最重要的就是權值的設置,主要是看勝率來設置吧
其實一開始的想法是先不分墩,直接按牌型等級去搜索出五張優先分配給後墩,而後再繼續搜索,這樣雖然會快不少,可是就跟斗地主裏面的機器人託管同樣笨
後來就用遍歷賦權值的方法暴力搜索,這種雖然慢,可是有點智能的味道git

5、關鍵代碼解釋

關鍵部分的算法就是各類牌型的判斷,要判斷牌型,首先要對這五張/三張牌進行排序、統計花色和數字
接下來就是判斷牌型了github

  • 同花順
    首先是要判斷同一花色,而後在判斷順子
for i in range (1,5):
    if flower[i] == 5:
        if shunzi_5(temp_third[0].num)
  • 炸彈:
    只要判斷數字桶裏面是否有4個數字就好了
for i in range(0,5):
        
        if number[temp_third[i].num] == 4
  • 葫蘆:
    只要判斷數字桶裏有隻有2和3
for i in range(0,5):
         
         if number[temp_third[i].num] == 3:
             
             for j in range(0,5):
                 
                 if number[temp_third[4-j].num] == 2
  • 同花:
    參考同花順
  • 順子:
    參考同花順,判斷五條順子的函數是:
def shunzi_5(x):
    
    for i in range (x,x+5):
        
        if number[x] <1:
            
            return 0
            
    return 1
  • 三條:
    由於三條是三張同樣的牌帶兩張不一樣的牌,因爲以前已經判斷過葫蘆了,因此此次若是桶裏面有三張同樣的,那就必定是三條了
for i in range(0,5):
        
        if number[temp_third[i].num] == 3
  • 連續兩對:
    因爲個人五張牌已經按照從小到大的順序了,因此若是第i個桶是2且第i+1個桶也是2,那就是連續兩對
for i in range(0,4):
        
        if number[temp_third[i].num]==2 and number[temp_third[i].num+1]==2
  • 普通兩對:
    兩次循環遍歷判斷就行了~
for i in range(2,15):
        
        if number[i]==2:
            
            for j in range(i,15):
                
                if number[j] == 2:
  • 一對:
    桶裏有個2啦
for i in range(2,15):
        
        if number[16-i] == 2
  • 散牌
    若是以上牌型都沒有判斷出來,就是散牌啦ajax

    6、性能分析與改進

  • 特殊牌型
    一開始花了挺多時間去研究特殊牌型怎麼判斷,當我好不容易寫了幾百行判斷特殊牌型的算法後猛然發現,我就算不知道這是特殊牌型,而後我按普通牌型出牌服務器也能判斷出個人是特殊牌型(這個應該算是題目的bug??)
  • 在搜索出後墩中,能夠預先判斷一下後墩的等級,由於後墩的等級最少也要兩個對子以上,這樣就能排除掉一部分的狀況了算法

    7、單元測試

    8、Github代碼簽入記錄

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

1.問題描述

  • 其實個人js不太得行,可是對比C++和JAVA仍是以爲python好上手一點
  • 個人flask不得行

2.作過哪些嘗試

  • 百度一下,谷歌一下

3.是否解決

  • 解決

4.有何收穫

  • 瞭解了網絡接口的使用,對服務器與用戶端的交互理解更加深入
  • 速成flaskjson

    10、評價你的隊友

  • 值得學習的地方
    美麗善良溫柔大方,學習能力強,效率高
  • 須要改進的地方
    我倆都是拖延症殺手flask

    學習進度條

    第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
    1 0 0 7 7 學了點js
    2 100 100 8 15 又學了點js
    3 200 300 8.5 23.5 界面設計啥的
    4 600 900 10 33.5 flask速成
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息