结对编程作业
博客及GitHub地址
我的博客链接:
队友的博客链接:https://www.cnblogs.com/jinnian1120/p/13843396.html
Github项目地址:请指教
具体分工
A*算法搜索路径实现 | 图片裁剪 | 原型设计 | 原型设计实现 | 博客撰写 | GitHub | |
---|---|---|---|---|---|---|
梁瑾 | √ | √ | √ | √ | ||
吴奕含 | √ | √ | √ | √ |
原型设计
结对作业的设计说明
设计手稿
1.登录页面:刚开始的想法是做一个小程序,通过微信绑定号码登录
2.主页:小程序的主页包括返回功能、计时功能、开始按钮和九宫格
3.游戏进行:点击主页的开始按钮后跳转到游戏进行的页面
4.游戏结束:该页面显示本次成绩和往次最佳成绩,还包括“再来一局”的按钮
![](https://img2020.cnblogs.com/blog/1950245/202010/1950245-20201019213525573-228504028.jpg)
![](https://img2020.cnblogs.com/blog/1950245/202010/1950245-20201019213541028-769317173.jpg)
定稿
1.游戏界面:增加了统计步数的功能,对背景图等进行了更换,提升了美观性
原型模型设计工具
墨刀:一款在线办公协作平台,集原型设计,线上版sketch设计师工具、流程图、思维导图为一体
描述结对的过程,提供非摆拍的两人在讨论、细化和使用专用原型模型工具时的结对照片。
遇到的困难及解决方法
困难描述
对于小程序的风格和色系难以抉择
解决尝试
检索各种小程序和小游戏的图片,并观察和对比这些界面的风格和色系
是否解决
解决了,最终选择了黑白灰这种风格,简约而高级~
有何收获
为下一步团队作业的小程序设计打下了基础,提升了自己的审美,增进了友谊~
AI与原型设计实现
代码实现思路:
A*算法:
-
把起点加入 open list 。
-
重复如下过程:
- 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。
- 把这个节点移到 close list 。
- 对于当前方格的 8 个相邻方格的每一个方格:
* 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。
* 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。
* 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后你可能需要重新排序。
- 停止,当你把终点加入到了 open list 中,此时路径已经找到了,或者查找终点失败,并且 open list 是空的,此时没有路径。 -
保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是要寻找的路径。
网络接口的使用
python中接受和发送json数据真的非常方便!
def getpicture():
url = "http://47.102.118.1:8089/api/problem?stuid=031802230"# 发送get请求
r = requests.get(url)# 获取返回的json数据
r = json.loads(r)
return r
def sendpicture(thepath , theswap , theuuid) :
url = "http://47.102.118.1:8089/api/answer"
answer = {}
answer["operations"] = thepath
answer["swap"] = theswap
print (theswap)
if theswap[0] == theswap[1] and theswap[0] == 0 :
answer["swap"] = []
data = {}
data["uuid"] = theuuid
data["answer"] = answer
#print(json.dumps(data) )
res = requests.post(url = url , json = data )#发送post请求
print(res.text)
代码组织与内部实现设计(类图)
![](https://img2020.cnblogs.com/blog/1950245/202010/1950245-20201019214045612-194739339.png)
![](https://img2020.cnblogs.com/blog/1950245/202010/1950245-20201019214054411-366919006.png)
def A_start(step,a,b,start, end, distance_fn, generate_child_fn, time_limit=10):
'''
A*算法
:param start: 起始状态
:param end: 终止状态
:param distance_fn: 距离函数,可以使用自定义的
:param generate_child_fn: 产生孩子节点的函数
:param time_limit: 时间限制,默认10秒
:return: None
'''
OPEN = []
root = State(0, 0, start, hash(str(BLOCK)), None) # 根节点
end_state = State(0, 0, end, hash(str(GOAL)), None) # 最后的节点
OPEN.append(root)
heapq.heapify(OPEN)
node_hash_set = set() # 存储节点的哈希值
node_hash_set.add(root.hash_value)
#start_time = datetime.datetime.now()
while len(OPEN) != 0:
top = heapq.heappop(OPEN)
if top == end_state: # 结束后直接输出路径
return print_path(top,step,a,b)
# 产生孩子节点,孩子节点加入OPEN表
generate_child_fn(cur_node=top, end_node=end_state, hash_set=node_hash_set,
open_table=OPEN, dis_fn=distance_fn)
'''
cur_time = datetime.datetime.now()
# 超时处理
if (cur_time - start_time).seconds > time_limit:
print("Time running out, break !")
print("Number of nodes:", SUM_NODE_NUM)
return -1
'''
'''
print("No road !") # 没有路径
'''
return -1
性能分析与改进
描述你改进的思路
基本符合预期
展示性能分析图和程序中消耗最大的函数
时间方面
内存方面
单元测试
测试代码
import unittest
class MyTestCase(unittest.TestCase):
def test_cut(self):
image = Image.open('a.jpg')
image_list = f_cut.cut_image(image)
print("图片切割成功")
index = 0
for image in image_list:
image.save(str(index) + '.png', 'PNG')
index += 1
print("第" + str(index) + "张图片保存成功")
@staticmethod
def test_checkPicture():
for i in x.keys():
if x[i] != '':
ans = f_checkPicture.image_contrast(x['00.png'], x[i])
print('样本:%s,误差率为:%.2f' % (i, ans))
def test_eight(self):
BLOCK = [[0, 5, 1], [9, 3, 6], [2, 4, 8]]
f_eight.start(BLOCK, 8, 6, 3) # step=2,a=2,b=3
if __name__ == '__main__':
unittest.main()
测试结果
Github签入记录
遇到的代码模块异常或结对困难及解决方法
问题描述
- 一开始给出的图片无解的情况没有考虑到
- 不知道给出的强制交换编号是0开始还是1开始
- 小程序审核困难,可能无法上线
解决尝试
- 读入时开始自由交换
- 问测试组
- 小程序采用了体验版
是否解决
解决!
有何收获
感谢测试组!
评价你的队友
值得学习的地方
耐心细致,搞得定种种bug
需要改进的地方
缺乏创新能力
PSP表格
PSP2.1 | Personal Software Process Stages | 预计耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 120 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 120 |
Development | 开发 | 2590 | 3270 |
· Analysis | · 需求分析 (包括学习新技术) | 500 | 550 |
· Design Spec | · 生成设计文档 | 300 | 270 |
· Design Review | · 设计复审 | 200 | 250 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 40 |
· Design | · 具体设计 | 200 | 180 |
· Coding | · 具体编码 | 1000 | 1200 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 720 |
Reporting | 报告 | 210 | 120 |
· Test Repor | · 测试报告 | 120 | 60 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 30 |
· 合计 | 2860 | 3510 |
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 115 | 115 | 3 | 3 | 学习了postman的使用方式,实现了在python中读取和提交json数据 |
2 | 45 | 160 | 4 | 7 | 学习了图片的切割和保存以及相关处理方法,并开始了解小程序的编写 |
3 | 638 | 798 | 14 | 21 | 学习了小程序的编写方式,并成功实现游戏主界面 |
4 | 503 | 1301 | 12 | 33 | 学习了python的性能测试方式,实现小程序保存历史记录、计时等多种功能 |