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 | 前后端交互 |
来源:https://www.cnblogs.com/elis/p/11681033.html