第二次结对编程作业
1、结对同学地址:https://www.cnblogs.com/fzu-031702148/
UI视频地址:https://v.youku.com/v_show/id_XNDQwODg4NTcwNA==.html?spm=a2h3j.8428770.3416059.1
本作业博客链接:https://www.cnblogs.com/fzu-031702148/p/11675619.html
仓库地址https://github.com/vjudge0913/13Water/
2、具体分工
陈启昌:网页前端html、与服务器交互
刘华一:网页后端python、写博客
3、PSP表格
Planning | 计划 | 预计耗时 | 实际耗时 |
---|---|---|---|
Planning | 计划 | 15 | 30 |
Estimate | 估计这个任务需要多少时间 | 40 | 50 |
Development | 开发 | 500 | 850 |
Analysis | 需求分析 (包括学习新技术) | 120 | 230 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 15 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 70 | 60 |
Design | 具体设计 | 120 | 180 |
Coding | 具体编码 | 500 | 800 |
Code Review | 代码复审 | 50 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 30 | 30 |
Test Repor | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1710 | 2540 |
4、解题思路描述与设计实现说明
-
网络接口的使用
- 注册:post 数据到:https://api.shisanshui.rtxux.xyz,通过返回状态码判断是否注册成功,处理用户已存在
- 登录 post 数据到:https://api.shisanshui.rtxux.xyz,通过返回状态码判断是否登录成功,得到token存在localStorage;
- 排行榜:get json:https://api.shisanshui.rtxux.xyz/rank/rank.json 为了美观只显示了前五名
- 出牌 post 数据到https://api.shisanshui.rtxux.xyz/game/submit
- 开局 token放响应头 post 数据到https://api.shisanshui.rtxux.xyz/game/open
-
代码组织与内部实现设计
-
说明算法的关键与关键实现部分流程图
因为python运行效率低,遍历所有情况需要6s,所以采用c++生成所有排列情况,然后用json.loads载入 c++代码如下
int rec[20];
int cnt=0;
int pt()
{
vector<int> ve[5];
for(int i=1;i<=13;i++)ve[rec[i]].pb(i);
if(ve[1].size()==3&&ve[2].size()==5&&ve[3].size()==5)
{
cnt++;
cout<<'[';
for(int i=0;i<ve[3].size();i++)
{
cout<<ve[3][i];
if(i!=ve[3].size()-1)cout<<',';
}
cout<<']';
cout<<',';
cout<<endl;
}
}
int dfs(int deep,int col)
{
if(deep>13)
{
pt();return 0;
}
if(deep)rec[deep]=col;
if(deep<13)
for(int i=1;i<=3;i++)
dfs(deep+1,i);
else
dfs(deep+1,1);
}
int main()
{
freopen("1.txt","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout<<'[';
dfs(0,1);
cout<<']';
}
以上代码生成3 5 5 排列 ,保存为3.txt,51.txxt,52.txt
在python内,载入保存为list
然后各种各种特判,找出权值最大的方案返回
5、关键代码解释
后端使用flask框架接收前端信息代码如下:
from flask import Flask
from flask import request
from flask_cors import CORS
import json
app = Flask(__name__)
@app.route('/test')
def test():
global list_3,list_51,list_52,card_list,card_list_str
data = request.get_json()
card_str = data["card"]
card_list_str=card_str.split(' ')
init_card()
调用init_card()函数对卡牌信息进行预处理
map_color2i={"$":1,"&":2,"*":3,"#":4}
map_i2color={1:"$",2:"&",3:"*",4:"#"}
map_card2i={"A":14,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"10":10,"J":11,"Q":12,"K":13}
card_list.clear()
vector_color.clear()
vector_num.clear()
card_list.append((0,0))
for i in range(1,16):
vector_num.append([])
vector_color.append([])
print(card_list_str)
for i in card_list_str:
color=map_color2i[i[0]]
num=map_card2i[i[1]]
card_list.append((color,num))
vector_color[color].append(num)
vector_num[num].append(color)
for i in range(1,5):
vector_color[i].sort()
print(card_list)
将每一张牌信息保存为一个tuple 第一个值是花色1-4 第二个是数字2-14(A为14)
处理完后的信息如下:
6、性能分析和改进
改进思路:python跑得慢,c++跑得快,原来想用python实现前端和c++连起来,但有点麻烦,于是采用使用c++生成排列,
python生成排列用时3s,c++生成后保存为文件,python用loads载入只用300ms,快了10倍
然后尝试用postman测试需要运算2.56s
7、单元测试
测试用例:
&K $7 #8 #4 *10 &10 &9 *J #7 *K $8 $A $K
&5 #8 #7 #A *8 &3 &A &10 &4 &9 *J *4 &2
$4 *J &4 $A $J *4 &A $K &3 #3 #7 &5 &2
*9 $A #6 *2 &7 $8 #J $2 #Q #10 $9 &10 #4
*9 &A *4 $10 #8 #3 $5 $2 &5 $9 &10 #4 *K
&5 *J #4 *9 &Q &3 $Q #2 *5 *6 &A $8 $K
*K *9 #J $2 $9 &5 $8 &J &4 &8 $A *10 &7
*8 *K #4 &K $2 #Q $6 *Q $K &J *10 &5 $3
*K *A &Q &6 &K *4 $5 $7 #Q &A $6 #K #5
*9 &7 &K #5 #A $9 *7 $A *2 #3 &4 *J #9
测试输出:
{"card":["*2 *2 *3","*4 *4 *5 *5 *5","*6 *6 *A *A *A"]}
{"card":["#7 *8 #8","&A #A &4 *4 *J","&2 &3 &5 &9 &10"]}
{"card":["&3 #3 #7","*J $J $K &2 &5","&4 *4 $4 &A $A"]}
{"card":["*2 $2 $A","*9 $9 &7 $8 &10","#4 #6 #10 #J #Q"]}
{"card":["*4 #4 &A","&5 $5 #3 #8 *K","*9 $9 &10 $10 $2"]}
{"card":["*9 *J $K","&Q $Q &A *5 $8","#2 &3 #4 &5 *6"]}
{"card":["*9 $9 *10","#J *K $A $2 $8","&4 &5 &7 &8 &J"]}
{"card":["*8 *10 &J","$2 $3 #4 &5 $6","&K *K $K *Q #Q"]}
{"card":["&6 $6 $7","&Q #Q #5 $5 *4","&K *K #K &A *A"]}
{"card":["&4 #5 *J","&7 *7 &K *2 #3","*9 #9 $9 #A $A"]}
8、贴出Github的代码签入记录
9、遇到的代码模块异常或结对困难及解决方法
问题描述 | 做过哪些尝试 | 是否解决 | 有何收获 |
---|---|---|---|
ajax发post和get | 无数种 | 是 | 我太菜了 |
对接AI遭遇CORS | 导入包配置一下 | 暂无,已有思路 | https真香 |
设计原型前没有看好需求 | 重构了一部分 | 是 | 原型还是得好好整 |
github的使用:徽章?开源协议?持续集成?分支? | 996徽章?一个人开分支意义不大 | 否 | 我还是太菜了 |
10、评价你的队友
值得学习的地方:
华一很有项目经理的范,总是会主动提出要一起讨论、一起敲代码
需要改进的地方:
太强了 没有
学习进度条
第N周 | 新增代码 | 累计代码 | 本周学习 | 累计学习 | 重要成长 |
---|---|---|---|---|---|
第1周 | xxx | xx | 15h | 15h | mokcingBot |
第3周 | 1000(1.64MB无图片) | 1000(1.64MB无图片) | 20h | 35h | 前后端交互 |