1.博客链接
2.具体分工
刘御帆:
·UI界面开发 · 图片收集
·音乐收集 ·ps
·UI和后端代码连接
许宏健:
·出牌代码 ·网络接口通信
·服务器数据解析 ·代码上传
·博客撰写
3.psp表格
PSP4.1 |
Personal Software |
预估耗时(min) |
实际耗时(min) |
Planning |
计划 |
40 |
50 |
Estimate |
估计这个任务需要多少时间 |
10 |
10 |
Development |
开发 |
1800 |
2400 |
Analysis |
需求分析 |
800 |
1200 |
Design Spec |
生成设计文档 |
60 |
40 |
Design Review |
设计复审 |
30 |
20 |
Coding Standard |
代码规范 |
30 |
20 |
Design |
具体设计 |
80 |
100 |
Coding |
具体编码 |
1500 |
1500 |
Code Review |
代码复审 |
600 |
650 |
Test |
测试 |
120 |
300 |
Reporting |
报告 |
70 |
70 |
Test Report |
测试报告 |
20 |
20 |
Size Measurement |
计算工作量 |
10 |
10 |
Postmortem
& Process |
事后总结 |
30 |
30 |
合计 |
5160 |
6360 |
4.解题思路描述与设计实现说明
4.1网络接口的使用
本次作业使用了maven项目管理方法,通过配置pom,获得到Unirest-java包。Unirest是一种轻量级的Http客户端库,能仅仅使用几行代码就能实现Http中get和post请求,大大减少了使用者的时间成本。下面是网络接口http中get请求实现的代码示例:
String response=Unirest.get("http://api.revth.com/history") .header("X-Auth-Token", token) .queryString("player_id",player_id) .queryString("limit",limit) .queryString("page",page) .asString() .getBody();
4.2代码组织与内部实现设计(类图)
本次做也大部分使用类与类之间的关联关系,较少使用泛华关系(继承),类图如下。
4.3算法的关键与关键实现部分流程图
出牌算法思路:出牌算法采用贪心算法思想,不考虑整体的最优解,只找出局部最优解,即先寻找是否能组成特殊牌型,在验正是够存在普通牌型中的同花顺,如果不存在逐级往下寻找,存在则优先满足后墩,再满足中墩,最后满足前墩
5.关键代码解释
①出牌算法
下面是代码展示的是从服务器得到牌之后将字符串转化为易处理的数据:
boolean findsantonhuashun(int a[][]) { int i,j,k,x; int flag1=0,flag2=0; for(i=0;i<4;i++) { x=0; for(j=1;j<=13;j++) { if(j==13)k=0; else k=j; if(a[i][k]==1) x++; if((a[i][k]==0 || j==13) && x==3) flag1++; else if((a[i][k]==0 || j==13) && x==5) flag2++; else if((a[i][k]==0 || j==13) && x==8) { flag1++; flag2++; } else if((a[i][k]==0 || j==13) && x==10) flag1+=2; else if((a[i][k]==0 || j==13) && x!=0)return false; } } if(flag1==1 && flag2==2)return true; else return false; }
②UI界面
UI界面有难度的的地方在于代码量大,还有切换页面上较为困难,最后我们选择通过制作弹窗的方式,下面代码展示的是登录按钮事件处理;
public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String usrname = textField.getText(); String passwd = String.valueOf(passwordField.getPassword()); StartLogin login = new StartLogin(); login.login.setUsername(usrname); login.login.setPassword(passwd); if(login.startLogin()) { try { new Game(); dispose(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (JavaLayerException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { JOptionPane.showMessageDialog(null, login.re, "密码或用户名错误", JOptionPane.ERROR_MESSAGE); } }
6.性能分析与改进
性能消耗最大的是在string类上,这个无法改变。
7.单元测试
在java中自带的junit4进行单元测试,测试对象为Getrand,测试Http请求是否会出错。
代码:
package com.xuxuxu.fujianthirteen; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import kong.unirest.HttpResponse; import kong.unirest.JsonNode; import kong.unirest.Unirest; public class GetRandTest { @Test public void test() { List<Rand> rand=new ArrayList<>(); HttpResponse<JsonNode> response=Unirest.get("http://api.revth.com/rank") .asJson(); String r=response.getBody().toString(); // System.out.println(r); Gson gson=new Gson(); List<Rand> list2 = gson.fromJson(r, new TypeToken<List<Rand>>(){}.getType()); for(int i=0;i<list2.size();i++) { rand.add(list2.get(i)); System.out.println("play_id: "+rand.get(i).player_id); System.out.println("score: "+rand.get(i).score); System.out.println("name: "+rand.get(i).name); System.out.println("=============="); } } }
8.贴出Github的代码签入记录
9.遇到的代码模块异常或结对困难及解决方法
9.1问题描述
·不知道怎么使用http请求
·json复杂数据转换
9.2做过哪些尝试
·通过百度发现很多人推荐使用unirest-java这种包使用起来较为简单,但是需要用到maven项目管理方法才能正常使用,最后我通过询问java老师最终学会了如何使用maven。
·json解析我最终选择了gson这个jar包,在网上查找大量的例子和代码,最终学会了如何使用gson
9.3是否解决
两个问题都解决了
9.4有何收获
解决上述两个问题的过程中顺便学习了如何使用maven来进行项目管理,而maven是在线协作的项目中不可或缺的一部分。在解决json解析的问题中我熟练的掌握了如何使用gson解析json数据。
10.评价队友
许宏健:虽然我们两个的编程技术都不怎么好,但是在这次的组队过程中,队友每次编程过程中遇到的问题能及时和我沟通协商,一起商量出解决的办法,从这些行为中可以看出,我的队友是一个能够虚心学习的人,而且在碰到困难是不轻言放弃的人。
刘御帆:本次作业我的队友许宏健主要承担前段页面设计部分同时也承担了部分的后端。对于我能力上的不足队友毫无怨言积极辅导我完成我应该负责的部分,是本次结对作业的主力。
11.学习进度条
第N周 |
新增代码(行) |
本周学习耗时(小时) |
累计学习耗时(小时) |
1 |
400 |
9 |
9 |
2 |
1300 |
26 |
35 |