第二次结对编程作业
结对成员:
031702615李镇平
031702618王泽鸿
分工
李镇平负责ui的制作,我则负责ai的制作。
psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 400 | 500 |
·Estimate | 估计这个任务需要多少时间 | 400 | 500 |
Development | 开发 | 5950 | 9480 |
·Analysis | 需求分析 (包括学习新技术) | 4000 | 5000 |
·Design Spec | 生成设计文档 | 100 | 200 |
·Design Review | 设计复审 | 100 | 200 |
·Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 50 | 80 |
·Design | 具体设计 | 500 | 800 |
·Coding | 具体编码 | 1000 | 3000 |
·Code Review | 代码复审 | 100 | 100 |
·Test | 测试(自我测试,修改代码,提交修改) | 100 | 100 |
Reporting | 报告 | 150 | 300 |
·Test Repor | 测试报告 | 50 | 100 |
·Size Measurement | 计算工作量 | 50 | 50 |
·Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 50 | 100 |
合计 | 6500 | 10280 |
解题思路描述与设计实现说明
网络接口的使用
(见李镇平博客)
代码组织与内部实现设计
ui:
login.html
register.html
result.html
rank.html
found.html
battle.html
record.html
然后这些页面通过javascript
连接起来
ai:首先,按牌面数字大小排序。2,3,4,,,A。其次,比较花色。黑 > 红 > 梅 方。牌型共有:乌龙,对子,三条,两对,葫 芦,炸弹,同花,顺子,同花顺,共九种。大小依次递增。从 “方片2,梅花2,红桃2,黑桃2,方片3,,,,黑桃A” 分别赋值为 : 0,1,2,3,,,51。
然后,设计判断各各牌型的函数,参数是数组,返回值为包含该牌型的所有组合,设计判断在该组合下于剩下的牌组中(此组合已经从牌组中删去)选择牌型最最好的函数,设计从牌组中删去组合的函数。
最后,主函数调用生成三组墩牌。
说明算法的关键与关键实现部分流程图
算法最关键的算法就是上述ai提到的第二部分的函数。
流程图如下:
我认为重要的/有价值的代码片段
ui:
$.ajax({
type:"POST",
url: https://api.shisanshui.rtxux.xyz/auth/login",
dataType:"json",
data:JSON.stringify(login_data),
contentType: "application/json;charset-UTF-8",
success:function(result){
console.log(result);//打印服务端返回的数据
if(result.status0){
token=result.data.token;
localStorage.setItem('token',result.data.token);//将token的值存入本地缓存中
localStorage.setItem('user_id',result.data.user_id);//将user_id的值存入本地缓存中
console.log(window.localStorage);
alert("登录成功");
window.location.href="./result.html";
}
},
error:function(res){
alert("账号/密码错误,请重新登录!");
}
});
这个用到了javascript里的ajax,因为我没啥基础,所以这次写UI摸索得我头发瞬间掉满地,连续熬了几个通宵(总之柯老板要把我失去的所有头发都还给我),这里面用到的是localStorage
这东西,他就是一个本地存储,用它来存Responses里的user_id,token,就可以解决页面跳转之后找不到数据的问题了。
ai:判断如何取组合函数肯定是最要的!函数通过two函数来对该组合进行估值,然后该函数通过估值对各各组合进行选取。(贪心算法)
function onechoose(needcut,cards){
jiacards=cards;
if(needcut.length1 ||needcut==0)
{
return needcut;
}
var max=-1;
for(var i=0 ;i<needcut.length;i++){
if(max <two( cut( needcut[i],jiacards)) ){
var maxone=i;
max=two( cut( needcut[i],jiacards))
}
}
return needcut[maxone];}
性能分析与改进
我使用的语言是js,所以直接使用了谷歌浏览器上面的性能分析。可见了三个函数的耗时最高占用总时间比例最多,分别是classilycards对牌分类的函数,one,two两个对组合价值的评估函数。我尝试降低三个函数在循环里的次数,结果如下:
单元测试
1.
2.
3.
贴出Github的代码签入记录
遇到的代码模块异常或结对困难及解决方法(8分)
问题描述(2分)
算法的问题就在如何不使用完全的贪心算法,比如一个葫芦应该带一个比较小的对子比较合适。
做过哪些尝试(2分)
尝试给返回的组合排个序,这样找起来能解决一部分问题。
是否解决(2分)
并未完全解决,解决的小部分的贪心的问题,应该还存在同样的问题。
有何收获(2分)
熬夜了两个晚上做出来了算法,虽然不是很完美但是觉得很有成就感。
评价你的队友
值得学习的地方
比我还能熬,值得我学习。
需要改进的地方
希望他可以很快的找出错误在哪里,他犯了太多傻错误了,比如改错函数(为啥我都改了还是输出错误?这样的)
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
6 | 1000 | 3000 | 150 | 350 | 了解了如何使用js |
7 | 1000 | 4000 | 120 | 370 | 进一步熟悉了js |