结对编程作业

博客及GitHub地址

我的博客链接:

队友的博客链接:https://www.cnblogs.com/jinnian1120/p/13843396.html

Github项目地址:请指教

具体分工

A*算法搜索路径实现 图片裁剪 原型设计 原型设计实现 博客撰写 GitHub
梁瑾
吴奕含

原型设计

结对作业的设计说明

设计手稿

1.登录页面:刚开始的想法是做一个小程序,通过微信绑定号码登录

2.主页:小程序的主页包括返回功能、计时功能、开始按钮和九宫格

3.游戏进行:点击主页的开始按钮后跳转到游戏进行的页面

4.游戏结束:该页面显示本次成绩和往次最佳成绩,还包括“再来一局”的按钮

定稿

1.游戏界面:增加了统计步数的功能,对背景图等进行了更换,提升了美观性

原型模型设计工具

墨刀:一款在线办公协作平台,集原型设计,线上版sketch设计师工具、流程图、思维导图为一体

描述结对的过程,提供非摆拍的两人在讨论、细化和使用专用原型模型工具时的结对照片。

在这里

还有一张

遇到的困难及解决方法

困难描述

对于小程序的风格和色系难以抉择

解决尝试

检索各种小程序和小游戏的图片,并观察和对比这些界面的风格和色系

是否解决

解决了,最终选择了黑白灰这种风格,简约而高级~

有何收获

为下一步团队作业的小程序设计打下了基础,提升了自己的审美,增进了友谊~

AI与原型设计实现

代码实现思路:

A*算法

  • 把起点加入 open list 。

  • 重复如下过程:
    - 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。
    - 把这个节点移到 close list 。
    - 对于当前方格的 8 个相邻方格的每一个方格:
    * 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。
    * 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。
    * 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后你可能需要重新排序。
    - 停止,当你把终点加入到了 open list 中,此时路径已经找到了,或者查找终点失败,并且 open list 是空的,此时没有路径。

  • 保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是要寻找的路径。

网络接口的使用

python中接受和发送json数据真的非常方便!

def getpicture():
    url = "http://47.102.118.1:8089/api/problem?stuid=031802230"# 发送get请求
    r = requests.get(url)# 获取返回的json数据
    r = json.loads(r)
    return r

def sendpicture(thepath , theswap , theuuid) :
    url = "http://47.102.118.1:8089/api/answer"

    answer = {}
    answer["operations"] = thepath
    answer["swap"] = theswap
    print (theswap)
    if theswap[0] == theswap[1] and theswap[0] == 0 :
        answer["swap"] = []
    data = {}
    data["uuid"] = theuuid
    data["answer"] = answer
    #print(json.dumps(data) )
    res = requests.post(url = url , json = data )#发送post请求
    print(res.text)

代码组织与内部实现设计(类图)

### 算法关键
def A_start(step,a,b,start, end, distance_fn, generate_child_fn, time_limit=10):
    '''
    A*算法
    :param start: 起始状态
    :param end: 终止状态
    :param distance_fn: 距离函数,可以使用自定义的
    :param generate_child_fn: 产生孩子节点的函数
    :param time_limit: 时间限制,默认10秒
    :return: None
    '''
    OPEN = []
    root = State(0, 0, start, hash(str(BLOCK)), None)  # 根节点
    end_state = State(0, 0, end, hash(str(GOAL)), None)  # 最后的节点

    OPEN.append(root)
    heapq.heapify(OPEN)

    node_hash_set = set()  # 存储节点的哈希值
    node_hash_set.add(root.hash_value)
    #start_time = datetime.datetime.now()
    while len(OPEN) != 0:
        top = heapq.heappop(OPEN)
        if top == end_state:  # 结束后直接输出路径
            return print_path(top,step,a,b)
        # 产生孩子节点,孩子节点加入OPEN表
        generate_child_fn(cur_node=top, end_node=end_state, hash_set=node_hash_set,
                          open_table=OPEN, dis_fn=distance_fn)
        '''
        cur_time = datetime.datetime.now()
        # 超时处理
        if (cur_time - start_time).seconds > time_limit:
            print("Time running out, break !")
            print("Number of nodes:", SUM_NODE_NUM)
            return -1
        '''
    '''
    print("No road !")  # 没有路径
    '''
    return -1

性能分析与改进

描述你改进的思路

基本符合预期

展示性能分析图和程序中消耗最大的函数

时间方面

内存方面


单元测试

测试代码

import unittest
class MyTestCase(unittest.TestCase):
    def test_cut(self):
        image = Image.open('a.jpg')
        image_list = f_cut.cut_image(image)
        print("图片切割成功")
        index = 0
        for image in image_list:
            image.save(str(index) + '.png', 'PNG')
            index += 1
            print("第" + str(index) + "张图片保存成功")

    @staticmethod
    def test_checkPicture():
        for i in x.keys():
            if x[i] != '':
                ans = f_checkPicture.image_contrast(x['00.png'], x[i])
                print('样本:%s,误差率为:%.2f' % (i, ans))

    def test_eight(self):
        BLOCK = [[0, 5, 1], [9, 3, 6], [2, 4, 8]]
        f_eight.start(BLOCK, 8, 6, 3)  # step=2,a=2,b=3

if __name__ == '__main__':
    unittest.main()

测试结果

Github签入记录

遇到的代码模块异常或结对困难及解决方法

问题描述

  • 一开始给出的图片无解的情况没有考虑到
  • 不知道给出的强制交换编号是0开始还是1开始
  • 小程序审核困难,可能无法上线

解决尝试

  • 读入时开始自由交换
  • 问测试组
  • 小程序采用了体验版

是否解决

解决!

有何收获

感谢测试组!

评价你的队友

值得学习的地方

耐心细致,搞得定种种bug

需要改进的地方

缺乏创新能力

PSP表格

PSP2.1 Personal Software Process Stages 预计耗时(分钟) 实际耗时(分钟)
Planning 计划 60 120
· Estimate · 估计这个任务需要多少时间 60 120
Development 开发 2590 3270
· Analysis · 需求分析 (包括学习新技术) 500 550
· Design Spec · 生成设计文档 300 270
· Design Review · 设计复审 200 250
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 60 40
· Design · 具体设计 200 180
· Coding · 具体编码 1000 1200
· Code Review · 代码复审 30 60
· Test · 测试(自我测试,修改代码,提交修改) 300 720
Reporting 报告 210 120
· Test Repor · 测试报告 120 60
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 30
· 合计 2860 3510

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 115 115 3 3 学习了postman的使用方式,实现了在python中读取和提交json数据
2 45 160 4 7 学习了图片的切割和保存以及相关处理方法,并开始了解小程序的编写
3 638 798 14 21 学习了小程序的编写方式,并成功实现游戏主界面
4 503 1301 12 33 学习了python的性能测试方式,实现小程序保存历史记录、计时等多种功能
原文地址:https://www.cnblogs.com/molly-woo/p/13843336.html