• 【软工实践】第二次结对编程作业


    传送门

    结对同学博客: https://www.cnblogs.com/shijinhai/p/11681105.html

    本作业博客: https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/8664

    GitHub项目地址: https://github.com/1061413241/13Water

    演示视频链接:https://pan.baidu.com/s/1zINm-QfCbvO7jWRL_0M5-Q 提取码: 882d

    具体分工

    史恩泽(我):

    • 设计并实现算法,优化算法
    • 调用网络接口
    • 代码组织与内部实现

    施金海:

    • 原型实现,重构部分贴图设计(根据需求)
    • 测试程序,进行性能分析并提出改进意见

    PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 50 60
    · Estimate · 估计这个任务需要多少时间 50 60
    Development 开发 2240 3560
    · Analysis · 需求分析 (包括学习新技术) 600 900
    · Design Spec · 生成设计文档 40 60
    · Design Review · 设计复审 30 50
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 40
    · Design · 具体设计 400 450
    · Coding · 具体编码 1000 1800
    · Code Review · 代码复审 20 60
    · Test · 测试(自我测试,修改代码,提交修改) 120 200
    Reporting 报告 100 105
    · Test Repor · 测试报告 30 30
    · Size Measurement · 计算工作量 10 20
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 55
    合计 2390 3725

    代码量分析

    第一次写这种代码量比较大的程序。显然,以前所使用的简单加法计算已经有些捉襟见肘了。进行系统的代码量统计显得尤为重要,统计代码行数主要使用以下两种正则表达式:

    统计包括空行、注释及符号:

    b*[^:b#/]+.*$
    

    统计不包括空行、注释、大括号等符号:

    ^(?!(s**))(?!(s*-->))(?!(s*<!--))(?!(s*
    ))(?!(s**/))(?!(s*/*))(?!(s*///))(?!(s*//))(?!(s*}))(?!(s*{))(?!(s(using))).*$
    

    分别用以上两种方法统计:

    可以看出差距还是挺大的,第二种正则基本上把项目扒了个精光。

    本次分析采用第一种统计方法,项目中的.Designer.cs代码基本上是操作控件自动生成的,所以不纳入统计。

    去除.Designer.cs代码后,还剩4470-2004=2466行,即为本项目的有效代码行数。

    解题思路描述与设计实现说明

    网络接口的使用:

    本项目主要用到Post和Get,将网络接口的调用封装成API_Helper,当按下界面中的按钮后调用对应的网络接口进行数据传输。

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

    一共采用了两种风格的窗体,登录和注册采用MetroForm,其他的采用CCSkinMain

    比较重要的类有两个:DealCardsUser,分别用于自动分牌和存放用户各类信息。

    其他的窗体则根据需要进行相应的调用与组织。

    算法关键与实现部分流程图:

    算法的关键在于DealCards的实现:要先将获取到的牌型转换成易于分析和处理的int型数值,之后获取所有自动牌型,根据牌型生成符合规则的最优解。

    关键代码解释

    /// <summary>
    /// 牌面从大到小排序
    /// </summary>
    public static void SortCard(List<int> cards)
    {
    	//牌面从大到小排序
    	cards.Sort((b, a) =>
    	{
    		int result = (a % 100) - (b % 100);
            if (result == 0)
            {
    			result = (a / 100) - (b / 100);
    		}
    		return result;
    	});
    }
    
    /// <summary>
    /// 牌面从小到大排序
    /// </summary>
    public static void SortCardMinToMax(List<int> cards)
    {
    	//牌面从小到大排序
    	cards.Sort((a, b) =>
    	{
    		int result = (a % 100) - (b % 100);
    		if (result == 0)
    		{
    		result = (b / 100) - (a / 100);
    		}
    		return result;
    	});
    }
    

    将牌面转换为数字后可以更方便的进行排序,因为在十三水中A最大,所以将A指定为14;

    扑克的四种花色分别对应100,200,300,400;

    /// 牌型对应如下:
    /// 1->$
    /// 2->&
    /// 3->*
    /// 4->#
    

    牌面对100取余即可得到对应的值,之后重载sort进行排序。

    性能分析与改进

    测试时分别进行了注册、登录、开启战局并出牌、查询排行榜、查询历史战局详情,得到性能报告情况如下:

    其中占用较大的是 Forms.Application.Run() Forms.MessageBox.show(),即窗体的加载与显示和提示窗的加载与弹出,这部分属于窗体加载难以优化。其他方法的调用都在可接受的范围内,代码的性能基本上符合要求。

    单元测试

    [TestMethod]
            public void SortCardMethod()
            {
                //2   3   4   5   6   7   8   9   10  J   Q   K   A
             //  102,103,104,105,106,107,108,109,110,111,112,113,114,(1代表花色的一种)
                List<int> testcard = new List<int>();
                List<int> rightcard = new List<int>();
                for (int i = 114; i >= 102; i--) //正确牌型
                    rightcard.Add(i);
                for (int i = 102; i <= 114; i++)//测试牌型
                    testcard.Add(i);
                /// <summary>
                /// sortcard功能:牌面从大到小排序
                /// </summary>
                DealCards.SortCard(testcard);//调用sortcard
                Assert.IsTrue(testcard.SequenceEqual(rightcard));//两个list相同返回true
     
            }
    

    展示的这部分单元测试是对SortCard方法进行测试,其功能是对牌从大到小排序。

    测试数据:102,103,104,105,106,107,108,109,110,111,112,113,114
    
    正确结果:114,113,112,111,110,109,108,107,106,105,104,103,102
    
    返回结果:114,113,112,111,110,109,108,107,106,105,104,103,102
    

    GitHub代码签入记录

    遇到的困难及解决方法

    问题描述:

    • 为了方便调用将用户手牌信息设置为static变量,并且使用LIst<>存放手牌,带来的问题是需要及时对List进行clear,否则之后无法对手牌进行更新;
    • 特殊情况的考虑:如玩家在牌局中出牌之前点击返回,如何处理当前牌局的进度。

    做过哪些尝试:

    • 完善submit方法,在提交手牌之后对List进行clear
    • 增加牌局进度判定机制,若玩家在牌局中途强制返回,则要清理手牌、停止牌局进度;
    • 让多个人运行程序,增大使用基数来检测程序bug

    是否解决:

    已解决。

    有何收获:

    实践才是检验真理的唯一标准,代码写得再好抵不过解决一个bug带来的舒畅和愉悦感。

    还有就是结对项目带来的好处,多一个人绝不是简单的1+1=2,相当于多了一种思路方向,解决bug的速度也会得到提升。

    评价队友

    值得学习的地方:

    做事认真,效率比较高;交给他的任务能尽快完成,听取我的意见。

    需要改进的地方:

    缺少主动学习的动力,得在旁边催着他,明明学得很快脑子也聪明,就是太懒。直接导致我被迫当了一次大腿,建议尽快安排我的奶茶

    学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 103 103 14 14 学会了十三水的玩法,对原型设计有了一定的基础;
    2 400 503 10 24 学习C# winform开发,完善具体设计思路;
    3 1313 1816 30 54 实现核心算法“自动分牌”;
    4 1153 2969 22 76 界面设计与代码实现,完成各窗体与接口的实现。

    UI展示

    主界面:

    对战界面:

    出牌界面:

    排行榜界面:

    历史战局界面:

  • 相关阅读:
    Grep案例(本地模式)
    Java环境变量 和 Hadoop环境变量 配置
    sudo设置
    Linux配置
    mysql安装(前提:Linux最小化安装)
    test
    Floyd算法【最短路1】
    HttpClient调用接口发送文件
    Spring boot 论坛项目实战_07
    Spring boot 论坛项目实战_06
  • 原文地址:https://www.cnblogs.com/azeLibertas/p/11677514.html
Copyright © 2020-2023  润新知