结对编程作业
自己和队友的博客链接
Github项目地址
具体分工
学号 | 姓名 | 博客链接 | Github | 具体分工 |
---|---|---|---|---|
031802610 | 赖彪 | 博客链接 | Github | 原型设计80%,AI实现20% |
031802621 | 刘惟凝 | 博客链接 | Github | 原型设计20%,AI实现80% |
1.1 - 原型设计
[1.1.1]此次结对作业的设计说明:
游戏的开始界面:
点击设置再点击开始游戏即可进入图片选择界面。
选好图片后按确认按钮就可进入游戏界面,通过键盘上的wasd或者鼠标控制小白块的移动,实现图片的复原。点击再玩一次可以将九宫格恢复至初始状态。
如果将九宫格恢复至有序状态,则显示挑战成功。
界面上方显示步数和用时,挑战成功后结果会记录到排行榜中。
[1.1.2]原型模型设计工具:
Spyder
[1.1.3]描述结对的过程:
两个人都是一个小组里面的,队友有基础的Python编程能力,自己则是从0开始学习Python,两个人相关知识都比较薄弱,本着共同学习共同进步的原则组成了一队。
[1.1.4]遇到的困难及解决方法:
困难挺多的,主要是两个人最开始什么都不懂,每一个功能的实现都要查找大量资料或者寻求大佬的解答,虽然还有一些想做的东西没能做出来,但最终还是实现了基本的功能。这次作业相当于边做边学习新语言和它各种库的用法,Python对于初学者还是比较友好的,库、学习资料什么的也比较多,只能说只有亲自动手尝试了才能有进步吧,这也是这门课的目的了,实践中学习,很多东西书上是没有的,不过这次的AI实现也让我意识到了算法的重要性。
1.2 - AI与原型设计实现
[1.2.1]代码实现思路:
网络接口的使用:
python的requests库
代码组织与内部实现设计:
主要功能是用函数封装的,
贴出你认为重要的/有价值的代码片段,并解释:
#图片匹配函数,返回的result值越小,图片越相似,若resul=0,则两张图完全一样
from PIL import Image
import math
import operator
from functools import reduce
def image_contrast(img1,img2):
image1=Image.open(img1)
image2=Image.open(img2)
h1=image1.histogram()
h2=image2.histogram()
result=math.sqrt(reduce(operator.add,list(map(lambda a,b:(a-b)**2,h1,h2)))/len(h1))
return result
#通过键盘控制图片移动的函数,sq用于图片的绘制,sqqq用于胜利的判定
def keyboard(event):
global step,cv,mark_col,mark_row,operates
if event.keysym=="w" or event.keysym=="Up":
if mark_row!=0:
temp=sq[mark_row-1][mark_col]
sq[mark_row-1][mark_col]=sq[mark_row][mark_col]
sq[mark_row][mark_col]=temp
temp2=sqqq[3*(mark_row-1)+mark_col]
sqqq[3*(mark_row-1)+mark_col]=sqqq[3*(mark_row)+mark_col]
sqqq[3*(mark_row)+mark_col]=temp2
mark_row-=1
operates+="w"
step+=1
print(sqqq)
print(operates)
elif event.keysym=="a" or event.keysym=="Left":
if mark_col!=0:
temp=sq[mark_row][mark_col-1]
sq[mark_row][mark_col-1]=sq[mark_row][mark_col]
sq[mark_row][mark_col]=temp
temp2=sqqq[3*(mark_row)+mark_col-1]
sqqq[3*(mark_row)+mark_col-1]=sqqq[3*(mark_row)+mark_col]
sqqq[3*(mark_row)+mark_col]=temp2
mark_col-=1
operates+="a"
step+=1
print(sqqq)
print(operates)
elif event.keysym=="s" or event.keysym=="Down":
if mark_row!=2:
temp=sq[mark_row+1][mark_col]
sq[mark_row+1][mark_col]=sq[mark_row][mark_col]
sq[mark_row][mark_col]=temp
temp2=sqqq[3*(mark_row+1)+mark_col]
sqqq[3*(mark_row+1)+mark_col]=sqqq[3*(mark_row)+mark_col]
sqqq[3*(mark_row)+mark_col]=temp2
mark_row+=1
operates+="s"
step+=1
print(sqqq)
print(operates)
elif event.keysym=="d" or event.keysym=="Right":
if mark_col!=2:
temp=sq[mark_row][mark_col+1]
sq[mark_row][mark_col+1]=sq[mark_row][mark_col]
sq[mark_row][mark_col]=temp
temp2=sqqq[3*(mark_row)+mark_col+1]
sqqq[3*(mark_row)+mark_col+1]=sqqq[3*(mark_row)+mark_col]
sqqq[3*(mark_row)+mark_col]=temp2
mark_col+=1
operates+="d"
step+=1
print(sqqq)
print(operates)
label_step["text"]=str(step)
cv.delete('all')
draw_image(cv)
展示性能分析图和程序中消耗最大的函数:
游戏:
AI:
[1.2.2]贴出Github的代码签入记录,合理记录commit信息。
[1.2.3]遇到的代码模块异常或结对困难及解决方法。
结对过程中感觉就是交流的不够多,导致两个人合作没有达到1+1>2的效果,暂时没有好的解决办法,只能说还要将强沟通。
[1.2.4]评价你的队友。
值得学习的地方:
勤奋,善于学习。
需要改进的地方:
语言交流不足
[1.2.5]提供此次结对作业的PSP和学习进度条(每周追加)
PSP2.1 | Personal Software Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少 时间 |
30 | 30 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技 术) |
900 | 1380 |
· Design Spec | · 生成设计文档 | 20 | 40 |
· Design Review | · 设计复审 | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发 制定合适的规范) |
20 | 30 |
· Design | · 具体设计 | 200 | 230 |
· Coding | · 具体编码 | 600 | 750 |
· Code Review | · 代码复审 | 60 | 50 |
· Test | · 测试(自我测试,修改 代码,提交修改) |
100 | 120 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改 进计划 |
20 | 30 |
Total | 合计 | 1980 | 2725 |
第N周 | 新增代码 (行) |
累计代码 (行) |
本周学习耗时 (小时) |
累计学习耗时 (小时) |
重要成长 |
---|---|---|---|---|---|
1 | 68 | 68 | 7 | 7 | Python、Pillow |
2 | 89 | 157 | 5 | 12 | Request、GUI |
3 | 59 | 216 | 5 | 17 | Spyder |
4 | 72 | 288 | 6 | 23 | BFS相关 |