结对编程作业

分工情况:

姓名 博客 GitHub项目地址 分工
刘佳润 博客链接 github链接 原型设计,测试代码
沈明镇 博客链接 github链接(release) 编写代码,编写博客

原型设计

此次结对作业的设计说明

我们使用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原型设计的方法

评价你的队友。

值得学习的地方

  • 学习认真,态度非常积极,有耐心

需要改进的地方

  • 希望更多学习代码,码不停。

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
posted @ 2020-10-19 21:46  侈谈  阅读(158)  评论(0编辑  收藏  举报