朱慶章負責前端、接口部分,以及博客撰寫部分
陳夢雪負責算法部分,以及博客的撰寫前端
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 |
隨便貼三個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
關鍵部分的算法就是各類牌型的判斷,要判斷牌型,首先要對這五張/三張牌進行排序、統計花色和數字
接下來就是判斷牌型了github
for i in range (1,5): if flower[i] == 5: if shunzi_5(temp_third[0].num)
for i in range(0,5): if number[temp_third[i].num] == 4
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
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:
for i in range(2,15): if number[16-i] == 2
散牌
若是以上牌型都沒有判斷出來,就是散牌啦ajax
在搜索出後墩中,能夠預先判斷一下後墩的等級,由於後墩的等級最少也要兩個對子以上,這樣就能排除掉一部分的狀況了算法
速成flaskjson
須要改進的地方
我倆都是拖延症殺手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速成 |