2022软工K班结对编程任务
林佳昕 102192105
李慧祯 102192122
2022-10-02 18:48:08
github链接
https://github.com/Hi-Jane9/Mywork/tree/main/Pair%20programming
bilibili链接
https://www.bilibili.com/video/BV1eT411P7ZK/?vd_source=520f98048ceb29266ac9ccd91a4257e6
一、结对探索(4分)
1.1 队伍基本信息(1分)
结对编号:10 ;队伍名称:开摆队;
姓名 | 学号 | 博客链接 | 具体分工 |
---|---|---|---|
李慧祯 | 102192122 | https://blog.csdn.net/m0_62487883/ | 原型设计、前端界面实现、JS的交互 |
林佳昕 | 102192105 | https://bbs.csdn.net/topics/608592513 | 前端界面实现、JS的交互、博客编写 |
1.2 描述结对的过程(1分)
我们互相问组队,然后就组队了,然后我想了个队名。
1.3 非摆拍的两人在讨论设计或结对编程过程的照片(2分)
二、原型设计(16分)
2.1 原型工具的选择(2分)
Axure
PS
WPS图片
2.2 遇到的困难与解决办法(3分)
我们首先遇到就是最大的问题就是原型设计,不知道用哪种工具比较好,后来通过询问相关同学采用了axure来进行原型设计,并用前端交互实现骰子功能。
2.3 原型作品链接(5分)
作品链接:https://3528vc.axshare.com
2.4 原型界面图片展示(6分)
三、编程实现(14分)
3.1 网络接口的使用(2分)
无
3.2 代码组织与内部实现设计(类图)(2分)
3.3 说明算法的关键与关键实现部分流程图(2分)
AI算法没做不会做,使用代码逻辑实现AI策略
3.4 贴出重要的/有价值的代码片段并解释(2分)
//重置
reset() {
return this.values.fill(0),
this
}
//更新
update(t) {
const {
rowsPerGrid: e,
cellsPreRow: i
} = this.opt;
for (let l = 0; l < e; l++)
for (let e = 0; e < i; e++) this._set(l, this._colToBitIdx(e), t[l][e]);
return this
}
row(t, e = !1) {
return this.checkGridIndex(t),
this._row(this.values[t], e)
} *
rows() {
for (const t of this.values) yield [...this._row(t)]
} *
cells() {
for (const t of this.values) yield* this._row(t)
}
[
Symbol.iterator
]() {
return this.cells()
}
toString() {
return `${ this.name }:
[${ [...this.rows()].join(']\n[') }]
`
}
}
const ti = $e,
ei = (0, s.aZ)({
name: 'MenuComponent',
components: {},
setup() {
const t = (0, o.iH)('玩家A'),
e = (0, o.iH)('玩家B'),
i = (0, o.iH)(!1),
l = (0, o.iH)();
return {
blackName: t,
whiteName: e,
setting: i,
mode: l
}
},
methods: {
showSetting(t) {
this.mode = t,
this.setting = !0
},
cancelSetting() {
this.setting = !1,
this.mode = void 0,
this.blackName = '玩家A',
this.whiteName = '玩家B'
},
利用for循环实现数据更新
3.5 性能分析与改进(2分)
3.6 单元测试(2分)
//判断是否完成游戏后,返回主菜单还是再来一局
t.isOver ? ((0, s.wg)(), (0, s.iD)('div', V, [
z,
(0, s._)('div', Y, (0, R.zw)(null === (o = t.black) || void 0 === o ? void 0 : o.name) + ': ' + (0, R.zw)(null === (g = t.black) || void 0 === g ? void 0 : g.score) + '分 ', 1),
(0, s._)('div', T, [
(0, s._)('div', S, [
(0, s.Wm)(c, {
color: 'primary',
onClick: t.startAgain,
class: 'q-ma-md'
}, {
default:
(0, s.w5)((() => [(0, s.Uk)('再来一局')])),
_: 1
}, 8, [
'onClick'
]),
(0, s.Wm)(c, {
color: 'primary',
onClick: t.toMainPage,
class: 'q-ma-md'
}, {
default:
(0, s.w5)((() => [(0, s.Uk)('返回主菜单')])),
_: 1
}, 8, [
'onClick'
])
])
]),
(0, s._)('div', Q, (0, R.zw)(null === (w = t.white) || void 0 === w ? void 0 : w.name) + ': ' + (0, R.zw)(null === (y = t.white) || void 0 === y ? void 0 : y.score) + '分 ', 1)
])) : (0, s.kq)('', !0),
(0, s.Wm)(p, {
modelValue: t.chosingChanlleng,
'onUpdate:modelValue': e[2] || (e[2] = e => t.chosingChanlleng = e),
persistent: ''
}, {
default:
(0, s.w5)((() => [(0, s.Wm)(m, {
class: 'q-pa-lg'
}, {
default:
(0, s.w5)((() => [(0, s.Wm)(v, {
class: 'q-pa-xs'
}, {
default:
(0, s.w5)((() => {
var i,
l,
n,
o,
r;
return [(0, s._)('div', H, [
(0, s._)('strong', null, '请 ' + (0, R.zw)(null === (i = t.decideUser) || void 0 === i ? void 0 : i.name) + ' 选择先投掷骰子的玩家',
1)
]),
(0, s._)('div', F, [
(0, s.Wm)(u, {
class: 'q-mx-md',
modelValue: t.firstUserName,
'onUpdate:modelValue': e[0] || (e[0] = e => t.firstUserName = e),
val: null === (l = t.black) || void 0 === l ? void 0 : l.name,
label: null === (n = t.black) || void 0 === n ? void 0 : n.name
}, null, 8, [
'modelValue',
'val',
'label'
]),
(0, s.Wm)(u, {
class: 'q-mx-md',
modelValue: t.firstUserName,
'onUpdate:modelValue': e[1] || (e[1] = e => t.firstUserName = e),
val: null === (o = t.white) || void 0 === o ? void 0 : o.name,
label: null === (r = t.white) || void 0 === r ? void 0 : r.name
}, null, 8, [
'modelValue',
'val',
'label'
])
])
]
})),
_: 1
}),
(0, s.Wm)(h, {
class: 'row justify-center'
}, {
default:
(0, s.w5)((() => {
var e;
return [(0, s.Wm)(c, {
label: '确定',
onClick: t.startPlay,
color: 'primary',
disable: null === (e = t.decideUser) || void 0 === e ? void 0 : e.isBot
}, null, 8, [
'onClick',
'disable'
])]
})),
_: 1
})
])),
_: 1
})])),
_: 1
}, 8, [
'modelValue'
])
]
})),
_: 1
})
}
var J = i(346),
X = i.n(J),
K = i(4661),
$ = i.n(K),
tt = i(618),
et = i.n(tt);
在游戏结束阶段出现两个选项并且都能点
3.7 贴出GitHub的代码签入记录,合理记录commit信息(2分)
四、总结反思(11分)
4.1 本次任务的PSP表格(2分)
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 4000 | 3500 |
· Analysis | · 需求分析 (包括学习新技术) | 250 | 250 |
· Design Spec | · 生成设计文档 | 0 | 0 |
· Design Review | · 设计复审 | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 3000 | 2000 |
· Code Review | · 代码复审 | 0 | 0 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 30 | 30 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
· 合计 | 7480 | 6080 |
4.2 学习进度条(每周追加)(2分)
林佳昕
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 500 | 1000 | 120 | 120 | 学习了之前没接触过的HTML、CSS、JS以及原型设计的axure |
李慧祯
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 1500 | 2000 | 300 | 300 | 学习了之前没接触过的HTML、CSS、JS以及原型设计的axure |
4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?(2分)
我觉得三者之间没什么差距,根据最初的想法进行了原型设计,然后根据原型设计进行软件开发,最大的差距应该是软件开发的时候完善了一点功能吧。反正基本要求有了就行。别的组还有花里胡哨的音乐我们也没搞了。
图片(1)
4.4 评价你的队友(2分)
李慧祯
队友很优秀,就是有些时候想讨论具体功能实现的时候联系不上队友,给我急的。可能我要求太高,有些时候生气,不过最后合作还是挺 愉快的吧。
林佳昕
队友很给力,在前端编写,js交互方面花了不少时间,最后的效果也不错。
4.5 结对编程作业心得体会(3分)
李慧祯
最开始拿到题目无从下手,原型设计也没接触过,都想直接放弃了。后来随便下了个Axure试了试,发现还挺简单的,和visio差不多,接触下来觉得挺好玩的,居然用原型设计救恩那个实现简单的交互和摇骰子。最后写代码也基本上是根据原型设计来的。代码部分一开始想用java或者python实现的,然后两个都试了一天,发现还是得去学前端。JS、Html、csss上手起来也比较快,写起来遇到了很多问题,最后把他当成骰子消消乐就顺利多了。这次结对编程工作分配的不是很好,没有理解到结对编程的意义,以后需要好好交流沟通。
林佳昕
一开始看到“逍遥骰”这个小游戏,以为和前面一次做的爬虫差不多,可以一次性解决。实际经历过后,发现没有那么容易,每一个环节都需要分段实现,从原型设计用axure确定界面到使用前端交互的方法来逐步实现功能,才保证基本的功能。即使这样还是有很多未实现的功能,比如没有做局域对战。在之后的大作业实验中应该努力改进自己。