结对编程作业
分工情况:
姓名 | 博客 | GitHub项目地址 | 分工 |
---|---|---|---|
刘佳润 | 博客链接 | github链接 | 原型设计,测试代码 |
沈明镇 | 博客链接 | github链接 | 编写代码,编写博客 |
原型设计
此次结对作业的设计说明
我们使用pythondiam开发出一个简易的图片华容道游戏,3*3的九宫格拼图,记录所用步数表示成绩
原型模型必须采用专用的原型模型设计工具实现:如Axure Rp、Balsamiq Mockup、Prototype Composer、GUI Design Studio、Adobe设计组件等等。在博文中说明你所采用的原型开发工具。(2分)
我们使用的是墨刀开发工具。
墨刀是一款在线原型设计与协同工具,借助墨刀,产品经理、设计师、开发、销售、运营及创业者等用户群体,能够搭建为产品原型,演示项目效果。墨刀同时也是协作平台,项目成员可以协作编辑、审阅 ,不管是产品想法展示,还是向客户收集产品反馈,向投资人进行Demo展示,或是在团队内部协作沟通、项目管理
描述结对的过程,提供非摆拍的两人在讨论、细化和使用专用原型模型工具时的结对照片。
遇到的困难及解决方法:
困难描述
图片缩放经常出现error
解决尝试
用python调整图片纵横比和大小,使其在窗口能正确显示
是否解决
是
有何收获
学习了PIL库的使用
代码实现思路:
本次的图片华容道问题,其实是一个传统的八数码问题,我们使用了A算法来解决
贴出你认为重要的/有价值的代码片段,并解释
A算法关键代码:
def __init__(self, startNode, endNode):
self.openList = []
self.closeList = []
self.startNode = startNode
self.endNode = endNode
self.currentNode = startNode
self.pathlist = []
self.step = 0
return;
def getMinFNode(self):
nodeTemp = self.openList[0]
for node in self.openList:
if node.g + node.h < nodeTemp.g + nodeTemp.h:
nodeTemp = node
return nodeTemp
def nodeInOpenlist(self, node):
for nodeTmp in self.openList:
if nodeTmp.array2d == node.array2d:
return True
return False
def nodeInCloselist(self, node):
for nodeTmp in self.closeList:
if nodeTmp.array2d == node.array2d:
return True
return False
def endNodeInOpenList(self):
for nodeTmp in self.openList:
if nodeTmp.array2d == self.endNode.array2d:
return True
return False
def getNodeFromOpenList(self, node):
for nodeTmp in self.openList:
if nodeTmp.array2d == node.array2d:
return nodeTmp
return None
def searchOneNode(self, node):
if self.nodeInCloselist(node):
return
gTemp = self.step
if self.nodeInOpenlist(node) == False:
node.setG(gTemp)
node.setH(self.endNode);
self.openList.append(node)
node.father = self.currentNode
else:
nodeTmp = self.getNodeFromOpenList(node)
if self.currentNode.g + gTemp < nodeTmp.g:
nodeTmp.g = self.currentNode.g + gTemp
nodeTmp.father = self.currentNode
return;
def searchNear(self):
flag = False
for x in range(0, 3):
for y in range(0, 3):
if self.currentNode.array2d[x][y] == 0:
flag = True
break;
if flag == True:
break;
self.step += 1
if x - 1 >= 0:
arrayTemp = move(copy.deepcopy(self.currentNode.array2d), x, y, x - 1, y)
self.searchOneNode(Node(arrayTemp));
if x + 1 < 3:
arrayTemp = move(copy.deepcopy(self.currentNode.array2d), x, y, x + 1, y)
self.searchOneNode(Node(arrayTemp));
if y - 1 >= 0:
arrayTemp = move(copy.deepcopy(self.currentNode.array2d), x, y, x, y - 1)
self.searchOneNode(Node(arrayTemp));
if y + 1 < 3:
arrayTemp = move(copy.deepcopy(self.currentNode.array2d), x, y, x, y + 1)
self.searchOneNode(Node(arrayTemp));
return;
1,将初始节点装入OPEN表
2,如果OPEN表为空,则失败,退出;否则,取出OPEN表中第一个节点,加入到CLOSE表中。
3,如果节点是目标节点,则成功,退出。
4,如果节点可扩展,将节点的扩展节点加入到OPEN表中,将OPEN表按照估价函数由小到大排列;否则跳转第2步。
描述你改进的思路
八数码问题的一个状态实际上是0~9的一个排列,对于任意给定的初始状态和目标,不一定有解,也就是说从初始状态不一定能到达目标状态。因为排列有奇排列和偶排列两类,从奇排列不能转化成偶排列或相反。
如果一个数字0~8的随机排列871526340,用F(X)表示数字X前面比它小的数的个数,全部数字的F(X)之和为Y=∑(F(X)),如果Y为奇数则称原数字的排列是奇排列,如果Y为偶数则称原数字的排列是偶排列。
例如871526340这个排列的
Y=0+0+0+1+1+3+2+3+0=10
10是偶数,所以他偶排列。871625340
Y=0+0+0+1+1+2+2+3+0=9
9是奇数,所以他奇排列。
因此,可以在运行程序前检查初始状态和目标状态的窘是否相同,相同则问题可解,应当能搜索到路径。否则无解。
遇到的代码模块异常或结对困难及解决方法。
问题描述
- 一开始没有考虑图片的编码问题
- 图片分割时不能正确分割不规则图形
- 图片不能正确识别
解决尝试
- 通过在开始时对图片初始化解决图片编码问题
- 对图片进行分割
是否解决
是
有何收获
学习了很多图片处理的方法(面向csdn),也学习了很多pygame库的使用,和ui原型设计的方法
评价你的队友。
值得学习的地方 态度积极,处理bug经验丰富,有耐心
需要改进的地方 希望更多学习前端css知识
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
Estimate | 估计这个任务需要多少时间 | 60 | 90 |
Development | 开发 | 2290 | 2360 |
Analysis | 需求分析 (包括学习新技术) | 450 | 500 |
Design Spec | 生成设计文档 | 200 | 200 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 40 | 40 |
Design | 具体设计 | 120 | 180 |
Coding | 具体编码 | 1000 | 900 |
Code Review | 代码复审 | 120 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 300 | 360 |
Reporting | 报告 | 180 | 150 |
Test Repor | 测试报告 | 90 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 2530 | 2600 |
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 668 | 668 | 5 | 5 | 了解了八数码问题的几种解法,了解Pygame模块的特性 |
2 | 944 | 1612 | 27 | 32 | 使用Pygame制作了基本的游戏界面,熟练了Python语言的特性 |
3 | 443 | 2055 | 23 | 55 | 修改BFS算法为A算法,完成了游戏的基本功能 |
4 | 0 | 2055 | 9 | 64 | 修复了游戏的一些BUG |