第二次结对编程作业
一、结对情况
二、分工情况
朱庆章负责前端、接口部分,以及博客撰写部分
陈梦雪负责算法部分,以及博客的撰写
三、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 |
四、解题思路描述与设计实现说明
1、网络接口的使用
随便贴三个js函数您就看明白了
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:
"+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';
}
});
}
2、代码组织与内部实现设计
我的代码就一个类呐
3、算法的关键与关键实现部分流程图
整个算法最重要的就是权值的设置,主要是看胜率来设置吧
其实一开始的想法是先不分墩,直接按牌型等级去搜索出五张优先分配给后墩,然后再继续搜索,这样虽然会快很多,但是就跟斗地主里面的机器人托管一样笨
后来就用遍历赋权值的方法暴力搜索,这种虽然慢,但是有点智能的味道
五、关键代码解释
关键部分的算法就是各种牌型的判断,要判断牌型,首先要对这五张/三张牌进行排序、统计花色和数字
接下来就是判断牌型了
- 同花顺
首先是要判断同一花色,然后在判断顺子
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
- 散牌
如果以上牌型都没有判断出来,就是散牌啦
六、性能分析与改进
- 特殊牌型
一开始花了挺多时间去研究特殊牌型怎么判断,当我好不容易写了几百行判断特殊牌型的算法后猛然发现,我就算不知道这是特殊牌型,然后我按普通牌型出牌服务器也能判断出我的是特殊牌型(这个应该算是题目的bug??) - 在搜索出后墩中,可以预先判断一下后墩的等级,因为后墩的等级最少也要两个对子以上,这样就能排除掉一部分的情况了
七、单元测试
-
测试后墩牌
-
测试中墩牌
八、Github代码签入记录
九、遇到的代码模块异常或结对困难及解决方法
1.问题描述
- 其实我的python不是特别会用,但是对比C++和JAVA还是觉得python好上手一点
- 出现只有后墩,前两墩都是空的bug
- 网络接口不懂不懂
- 一开始想的太简单了以为只要很多if判断就好啦,是我太年轻了orz
2.做过哪些尝试
- 大部分百度吧,当然也有参考一点别人的思路
- 慢慢找bug
3.是否解决
- 都解决
4.有何收获
- 了解了网络接口的使用,对服务器与用户端的交互理解更加深刻
- 对python的函数和性质有了更深的理解
十、评价你的队友
- 值得学习的地方
学习能力强吧,效率比较高 - 需要改进的地方
我俩都是拖延症杀手
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 7 | 7 | 学会了py吧 |
2 | 423 | 423 | 8 | 15 | 第一次用py编程 |
3 | 400 | 823 | 8.5 | 23.5 | 主要是界面设计,还有Linux |
4 | 980 | 1800 | 10 | 33.5 | py更熟练一点 |