一、结对探索(4分)
1.1 队伍基本信息(1分)
结对编号:21;队伍名称:只因;
学号 | 姓名 | 作业博客链接 | 具体分工 |
---|---|---|---|
032002237 | 叶夏雨 | 原型设计,前端开发 | |
032002239 | 张陈玮 | 原型设计,UI设计,后端开发 |
1.2 描述结对的过程(1分)
近水楼台 先得舍友,就这么简单~
1.3 非摆拍的两人在讨论设计或结对编程过程的照片(2分)
二、原型设计(16分)
2.1 原型工具的选择(2分)
原型工具:墨刀
原因:Axure过于复杂,还是国产的好用,支持国产\ (•◡•) /
2.2 遇到的困难与解决办法(3分)
困难1: 刚开始不知道什么是原型设计,以为就是咔咔咔直接用前端直接设计界面,后来迷途知返,用了Axure和墨刀进行设计。
困难2:零基础入门墨刀,许多功能不知道怎么实现,于是查找大量资料,一步一步完成想要的功能。
困难3:一直找不到满意的图片素材,之后去视觉中国上一看,哎呦,就是你们了!
收获:进一步了解了原型设计的流程,掌握了墨刀的使用。
2.3 原型作品链接(5分)
2.4 原型界面图片展示(6分)
功能模块:游戏主页
可以点击进行双人对战,人机对战,并查看游戏规则。
双人对战 和 人机对战
双人对战下,两边都可以点击骰子进行游戏;
人机对战下,左边可以点击骰子游戏,右边由AI自动运行
功能模块 :游戏规则
介绍游戏的玩法规则,可通过上下翻页
三、编程实现(14分)
3.1 网络接口的使用(2分)
使用了java的httpservlet类接收前端的post请求,并返回骰子落点。
3.2 代码组织与内部实现设计(类图)(2分)
3.3 说明算法的关键与关键实现部分流程图(2分)
人机通过对场上形势的判断来决定相关模式,然后进行value的计算,比较value并得出落点。
3.4 贴出重要的/有价值的代码片段并解释(2分)
棋盘元素类:将int[3]进行包装提供了许多必要的函数,之后的代码编写带来的很多便利
public class ChessElement {
private int[] location = new int[6];
private int score;
private int left;
public ChessElement(int[] location) {// 初始化棋盘元素(location长度为3)
for (int i = 0; i < 3; i++) {
if (location[i] != 0) {
this.location[location[i] - 1]++;
}
}
init();
}
public ChessElement(int[] location, int dice, boolean isOpposite) {// 初始化棋盘元素,并在己方或对方放一个骰子(location长度为6)
this.location = location;
if (isOpposite) {
this.location[dice - 1] = 0;
} else {
this.location[dice - 1]++;
}
init();
}
public void setScore() {// 初始化得分
for (int i = 0; i < 6; i++) {
score += location[i] * location[i] * (i + 1);
}
}
public boolean isFull() {// 判断棋盘元素是否已经满了
int a = 0;
for (int i = 0; i < 6; i++) {
a += location[i];
}
if (a < 3) {
return false;
} else {
return true;
}
}
public int getScore() {// 获取该棋盘元素的当前得分
return score;
}
private void setLeft() {//获取剩余空位数量
for (int i = 0; i < 6; i++) {
left += location[i];
}
left = 9 - left;
}
public int getNewScore(int x) {// 填入x后该棋盘元素的得分
int result = 0;
int a[] = new int[6];
for (int i=0;i<6;i++) {
a[i]=location[i];
}
a[x - 1] = 0;
for (int i = 0; i < 6; i++) {
result += a[i] * a[i] * (i + 1);
}
return result;
}
public int getAddition(int x) {// 填入x后该棋盘元素的得分增量
return getNewScore(x) - score;
}
public int getDecrement(int x) {// 对面填入x后该棋盘元素的得分减量
int result = 0;
int a[] = new int[6];
for (int i=0;i<6;i++) {
a[i]=location[i];
}
a[x - 1] = 0;
for (int i = 0; i < 6; i++) {
result += a[i] * a[i] * (i + 1);
}
result = getScore() - result;
return result;
}
public int[] getLocation() {// 以一维数组形式输出棋盘元素
return location;
}
public int getLeft() {
return left;
}
private void init() {
setScore();
setLeft();
}
}
前后端交互函数
function senddata(){//向后端发送数据
dice=Math.floor((Math.random() * 10) + 1) % 6 + 1;
var data1 = "{";
var data2 = "{";
for (var i=0;i<9;i++){
data1 = data1 + "\"" + i +"\"" + ":" + leftchess[i];
data2 = data2 + "\"" + i +"\"" + ":" + rightchess[i];
if (i!=8){
data1 = data1 + ",";
data2 = data2 + ",";
}
}
data1 = data1 + "}";
data2 = data2 + "}";
$.ajax({
type: "post",
url: "http://localhost:8083/xyt/MyWebServlet",
data:
{
"data1": data1,
"data2": data2,
"dice": dice
},
cache: false,
dataType: "json",
success:
function(data){
var position = data;
if(position=="1"){
for(var i=0;i<3;i++){
if (rightchess[i]==0){
rightchess[i]=dice;
diceforscore=dice;
isright=0;
isleft=1;
dice=0;
updatescore(10+i);
break;
}
}
}
else if(position=="2"){
for(var i=3;i<6;i++){
if (rightchess[i]==0){
rightchess[i]=dice;
diceforscore=dice;
isright=0;
isleft=1;
dice=0;
updatescore(10+i);
break;
}
}
}
else{
for(var i=6;i<9;i++){
if (rightchess[i]==0){
rightchess[i]=dice;
diceforscore=dice;
isright=0;
isleft=1;
dice=0;
updatescore(10+i);
break;
}
}
}
}
})
}
3.5 性能分析与改进(2分)
WholeChess类内部的calculateValue方法,count的值在大于7后对结果几乎没有影响,但是却极大的影响代码运行速度,所以将count从10改为7。
3.6 单元测试(2分)
基本算分
public static void main(String[] args) {
int[][] a1 = { { 1, 0, 0}, { 2, 2, 2 }, { 0, 0, 0 } };
int[][] a2 = { { 6, 6, 0 }, { 5, 5, 0 }, { 1, 1, 0 } };
int dice = 1;
InterfaceToJs i = new InterfaceToJs(a1,a2,dice);
System.out.println(i.getPosition());
}
防止为了得分而自杀
public static void main(String[] args) {
int[][] a1 = { { 1, 1, 0}, { 2, 2, 2 }, { 2, 0, 0 } };
int[][] a2 = { { 6, 6, 6 }, { 5, 5, 5 }, { 6, 1, 0 } };
int dice = 1;
InterfaceToJs i = new InterfaceToJs(a1,a2,dice);
System.out.println(i.getPosition());
}
3.7 贴出GitHub的代码签入记录,合理记录commit信息(2分)
四、总结反思(11分)
4.1 本次任务的PSP表格(2分)
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 1800 | 2000 |
Development | 开发 | 1500 | 1800 |
· Analysis | · 需求分析 (包括学习新技术) | 1000 | 1200 |
· Design Spec | · 生成设计文档 | 120 | 120 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 60 | 50 |
· Coding | · 具体编码 | 600 | 700 |
· Code Review | · 代码复审 | 60 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 200 |
Reporting | 报告 | 60 | 60 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 5550 | 6350 |
4.2 学习进度条(每周追加)(2分)
叶:
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 150 | 150 | 8 | 8 | 熟悉html,css,完成了基本界面设计 |
2 | 300 | 450 | 8 | 16 | 学习js,完成了掷骰子,棋盘的功能 |
3 | 500 | 950 | 7 | 23 | 进一步掌握前端三件套,优化作品 |
张
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 15 | 15 | 了解了深度学习和Spring框架,虽然最后没用上 |
2 | 500 | 500 | 5 | 20 | 熟悉java语言httpservlet类 |
3 | 1000 | 1500 | 12 | 32 | 通过练习前后端交互,掌握了ajax用法 |
4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?(2分)
1.产品形态和原型设计的最终的成果还是符合预期的 。
2.软件开发还是和理想的有差距,比如想要实现的小程序上线等等都没有实现。
原因:时间上过于紧张,对自己的能力进行了错误的估计
4.4 评价你的队友(2分)
To张:
值得学习的地方:稳如老狗,学习能力强
需要改进的地方:时间管理需要加强,期待早日成为时间管理大师~
To叶:
值得学习的地方:努力学习,成为搭建网页小能手
需要改进的地方:遇到困难摆大烂
4.5 结对编程作业心得体会(3分)
叶:
- 零基础入门造火箭的体验,整个过程非常煎熬,因为这学期选修课选的太多,导致投入软工大作业的时间很难分配,于是只能不断压缩睡眠时间,还好队友给力,最终浑浑噩噩,勉勉强强完成了任务。
- 完成后的感受:天呐,我要好好睡一觉 zzzZZZ~
- 困难:因为一开始分工的时候就决定了要做前端,但是完全零基础,于是就紧锣密鼓地开始学习前端三件套。B站上搜集视频,然后倍速播放(看视频看到最后有点恶心的感觉呃呃呃…)。学习了一周后总算基本入门了前端,之后在B站上看到制作五子棋小游戏的视频,觉得大差不差,就跟着学,并用画布制作了棋盘,然后折腾了几天发现画布很难实现想要的功能,最后只能推翻重来用ul重新制作了棋盘,所以这一个简单的环节就浪费了许多时间(×_×)。
- 启发:再次深刻地意识到自己的不足,革命尚未成功,同志还需努力!
张:
- 作业难度:从未有过的体验,第一次尝试前后端分离的项目,收获十足
- 完成后的感受:spring框架很重要,需要尽快学习,然后就是好好放松一天
- 困难:变量的安全性欠考虑,类内的对象经常逸出。函数递归需要重新学习(卡了好久)。因为一开始想搞深度学习,所以投入的很多时间学习,结果最后还是没用上,浪费了不少时间。最后是使用的编程工具很大程度上决定了写代码的速度,idea在代码编写上确实比eclipse方便
- 启发:好好学习,提升自己的能力才是目前最重要的。