结对编程作业
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,对已有代码完善改进 |
未来提升:
将主程序升级成为一个带有开始界面、规则介绍、往次得分的程序(我们已经设计好了原型,见下)




浙公网安备 33010602011771号