结对编程作业
github地址:https://github.com/wyhsomecat/031804131-031804129
2.1原型设计
设计思路:
开始游戏,将页面分为3个部分上半区绘制重新开始按钮,显示步数并据此给出得分,右上角退出游戏。下半区左边是原图片的小图预览,右边是游戏界面,玩家通过点击图块实现移动拼图。
原型设计
mockplus
讨论图片
遇到的困难及解决方法
- 之前对于原型设计没有接触过所以不知道怎么做,后来选择了一款比较容易上手的原型设计工具mockplus,设计页面时走极简风。
- 对网页项目的前后端没有充分了解,以至于在开发完一个基于tkinker库的独立python程序后发现没有办法直接“连接”到web端,忍痛放弃
- 在开赛前一天发现对题目有理解性错误(操作指空格移动,不是指其他图片向空格移动),被迫连夜修改代码,并导致AI留下小缺憾
2.2 ai与原型设计实现
代码实现思路
a.网络接口问题采用request库构建函数实现POST,使用POSTman工具实现GET
b.单机版:从库内直接随机读取图片,调整大小并切割后载入基于tkinker库的主界面
c.赛事比拼:解码并分割图片后比较切割图片与库内图片的异同,获得图片对应序列后送交AI分析
说明算法的关键与关键实现部分流程图
图片华容道问题,从本质上讲是八数码问题的Python实现。我们采用A算法和A*算法,这是一种可容纳最优的启发式搜索算法 。构造最接近目标的真实代价,使A*算法拟合这一函数。
贴出你认为重要的/有价值的代码片段,并解释
a.获取赛题图片对应序列
# 创建字符串piclist,用来存储测试图像对应的位置序列 piclist = '' # 创建两个元组,对应切割图像中的纯黑或纯白方块,备用 tup1 = (255, 255, 255) tup2 = (0, 0, 0) #设置一个boolean变量判断是否有纯黑方块 blackblock = False for i in range(9): #读取切割测试图像后的小方块 img = Image.open("aitest" + str(i) + ".jpg") imgstr = "aitest" + str(i) + ".jpg" clrs = img.getcolors()#img.getcolors方法会返回数个列表,每个列表里包含图像内某种颜色的像素点数量和RGB向量,分别以元组的方式储存于列表中 if (len(clrs) != 1):#如果长度不为1,即不只返回了一个列表,即图像方块内有超过一种颜色(非纯黑或纯白) file_names = [] #调用已经切割好的本地图片库 for parent, dirnames, filenames in os.walk(os.getcwd()+'/charspec'): # 三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字 file_names = filenames for k in range(315): #比较切割后的测试图像和本地图片库 if (image_contrast(imgstr, os.getcwd()+'/charspec/' + file_names[k]) == 0): tempfn = file_names[k] if (len(tempfn) > 8):#根据图片名称长度进行分类 #获取picname,即测试图像对应本地图像的名称,如A _(2) picname = tempfn[0:6] #print(tempfn[0:6]) num = int(tempfn[6]) + 1 #由于图片库内切割图片都是按顺序排列的(从0到8),获得其名称后缀就是获得了切割图片在原图片内对应的位置 piclist = piclist + str(num) # print(piclist) else: # print(tempfn[0:2]) picname = tempfn[0:2] # print(tempfn[2]) num = int(tempfn[2]) + 1 piclist = piclist + str(num) k = k + 1 #如切割图像是纯白块,将其列表代号确定为0 elif (clrs[0][1] == tup1): piclist = piclist + '0' #如切割图像是纯黑块,先将其列表代号表示为t elif (clrs[0][1] == tup2): piclist = piclist + 't' tmp = i blackblock = True # print('你这个黑块能把人烦死',tmp) i = i + 1
b.调整图片大小、格式
def changeJpgToPng(w, h, path): # 修改图像大小 image = Image.open(path) image = image.resize((w, h), Image.ANTIALIAS) # 将jpg转换为png png_name = str(path)[0:-len('.jpg')] + 'min.png' image.save(png_name) #print(png_name) return png_name
我们使用的函数不支持读取JPG,在尝试修改第三方库文件后,我们最终增加了这段代码
性能分析与改进,并描述你改进的思路
将A算法升级为A*算法,增加addOpen函数,用于将新的节点按照判定值(diff值)插入现有open表
展示性能分析图和程序中消耗最大的函数
贴出Github的代码签入记录,合理记录commit信息。
评价你的队友
ww嘤→somecat:非常优秀且有耐心
somecat→ww嘤:参与积极性高,有很有创新性的想法
结对作业的PSP和学习进度条
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
60 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
60 |
Development |
开发 |
900 |
1400 |
· Analysis |
· 需求分析 (包括学习新技术) |
150 |
460 |
· Design Spec |
· 生成设计文档 |
60 |
60 |
· Design Review |
· 设计复审 |
20 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
20 |
· Design |
· 具体设计 |
60 |
60 |
· Coding |
· 具体编码 |
100 |
300 |
· Code Review |
· 代码复审 |
20 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
20 |
Reporting |
报告 |
60 |
60 |
· Test Report |
· 测试报告 |
30 |
60 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
60 |
|
· 合计 |
1640 |
2180 |
第N周 |
新增代码(行) |
累计代码(行) |
累计学习耗时(小时) |
重要成长 |
第1周 |
192 |
195 |
28 |
图像的分割处理,游戏的响应 |
第2周 |
495 |
687 |
56 |
Python解决8数码问题,深度优先算法,A*算法, |
第3周 |
0 |
687 |
72 |
原型设计软件的使用,web前端学习(未使用) |
第4周 |
140 |
827 |
80 |
学习JSON,对已有代码完善改进 |
未来提升:
将主程序升级成为一个带有开始界面、规则介绍、往次得分的程序(我们已经设计好了原型,见下)