• 第二次结对编程作业


    第二次结对编程作业

    UI运行视频链接(百度网盘在线观看)

    链接:https://pan.baidu.com/s/1G-4BhSAFWGRckekRBQCwZQ

    一、结对博客信息:

    二、具体分工

    • 前端:陈天恒,用unity设计十三水界面和交互
    • 后端:张火标,负责算法设计

    三、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 50 70
    Estimate 估计这个任务需要多少时间 1025 1160
    Development 开发 0
    Analysis 需求分析(包括学习新技术) 50 70
    Design Spec 生成设计文档 45 40
    Design Review 设计复审 5 10
    Coding Standard 代码规范(为开发制定合适的规范) 0 0
    Design 具体设计 700 800
    Coding 具体编码 0 0
    Code Review 代码复审 0 0
    Test 测试(自我测试,修改,提交修改) 0 0
    Reporting 报告 150 140
    Test Report 测试报告 0 0
    Size Measurement 计算工作量 5 0
    Postmortem & Process Improvement Plan 事后总结并提出过程改进计划 20 30
    合计 1025 1160

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

    1.网络接口的使用

    后端(张火标):
    登入
    img
    开局
    img
    出牌
    img

    前端(陈天恒):采用的是JavaScript的jQuery进行网络请求,在登陆的时候把token和user_id存入本地,其它的要调用token时再从本地取出,要调用token的地方有历史战绩和历史战绩详情和开始游戏界面。

    • 注册接口
      img
    • 登陆接口
      img
    • 注销接口
      img
    • 历史战绩接口
      img

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

    作用 思路
    Main 负责调配多个类,以及进行网络请求。 主类进行调配网络请求,获得牌,然后通过juedge_best类来的得到最有的牌
    juedge_best 负责将得到的牌组合出最好的组合 本质上属于遍历每一种可能的组合,然后通过自己制定的规则,来判断哪一个组合的赢面最大。
    API(接口) 关于网络请求的多种不同类型的请求的接口 里面写了注册,登陆,开启战局,出牌的请求方式。
    Login 是发送登陆网络请求的请求体 一个请求体的类,有一个int和一个String
    Login_return 是网络请求的返回体(登陆) 得到String status,data{int id,String token}
    open_retrun 是返回开启战局之后,得到的返回体,有牌的详细情况 也是一个实体类
    Submit 发送牌的网络请求 一个实体类。
    Submit_return 网络请求的返回体的类。用来观察要不要 一个实体类,有牌局是否合理的信息

    3.说明算法的关键与关键实现部分流程图

    • 算法部分
      img

    五、关键代码解释

    重要的/有价值的代码片段

    • 排序函数(张火标):
    def paixu(list):
        temp=[]
        length=len(list)
        for i in range(length):
            if list[i][1] == 'A':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == 'K':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == 'Q':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == 'J':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '1':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '9':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '8':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '7':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '6':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '5':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '4':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '3':
                temp.append(list[i])
        for i in range(length):
            if list[i][1] == '2':
                temp.append(list[i])
        return temp
    
    • 黑桃函数(张火标)其他颜色也是类似
    def heitao(mypai):
        "黑桃列表"
        heitaolist=[]
        for i in range(len(mypai)):
            if mypai[i][0]=='$':
                heitaolist.append(mypai[i])
        return heitaolist
    
    • 读取文件算法(陈天恒)读取py算法文件
    public void RunPythonScript(string sArgName, string args = "")
        {
            Process p = new Process();
            //python脚本的路径
            string path = @"D:	hirdteen" + sArgName;
            string sArguments = path;
            sArguments += " " + StaticCard._card;//传递参数
            p.StartInfo.FileName = @"C:UsersYpython.exe";
            //p.StartInfo.FileName = @"D:Program FilesPython35python.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.Arguments = sArguments;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.BeginOutputReadLine();
            p.OutputDataReceived += new DataReceivedEventHandler(Out_RecvData);
            p.WaitForExit();
        }
    
        public void Out_RecvData(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                StaticCard.cardfixall = e.Data;
                card = e.Data.Split(' ');
                UnityEngine.Debug.Log(card[0]);
                //StaticCard.into_fixcard();
            }
            else
            {
                UnityEngine.Debug.Log("结束");
            }
        }
    
    • 获取函数(陈天恒):

      • 排行榜核心:
      IEnumerator ListGet()
        {
            UnityWebRequest webRequest = new UnityWebRequest("http://api.revth.com/rank", "GET");
            webRequest.downloadHandler = new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isDone)
            {
                string result = webRequest.downloadHandler.text;
                results = JsonMapper.ToObject(result);
                Debug.Log(results[0]);
                nummax = results.Count;
                ListFix();
            }
            else
            {
                Debug.Log("Http 请求失败");
                Debug.Log(webRequest.error);
            }
        }
      
      • 战绩详情
      IEnumerator BattleGet(int pageint)
        {
            JsonData data = new JsonData();
            data["player_id"] = PlayerPrefs.GetInt("player_id");
            data["limit"] = 5;
            data["page"] = pageint;
            string js1 = data.ToJson();
            //string js1=""player_id":" + PlayerPrefs.GetInt("player_id") + "," + ""limit": " + 5 + "," + ""page": " + pageint;
            Debug.Log(js1);
            byte[] postBytes = Encoding.UTF8.GetBytes(js1);
            //byte[] postBytes = Encoding.Convert.FromBase64String(js1);
            //UnityWebRequest webRequest = new UnityWebRequest("http://api.revth.com/history", "GET");
            UnityWebRequest webRequest = new UnityWebRequest("http://api.revth.com/history?player_id="+ PlayerPrefs.GetInt("player_id")+ "&limit=" + 5 + "&page="+ pageint, "GET");
            webRequest.uploadHandler = new UploadHandlerRaw(postBytes);
            webRequest.SetRequestHeader("X-Auth-Token", PlayerPrefs.GetString("X-Auth-Token"));
            webRequest.downloadHandler = new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isDone)
            {
                string result = webRequest.downloadHandler.text;
                Debug.Log(result);
                BattleResults = JsonMapper.ToObject(result);
                if(BattleResults["status"].ToString()=="0")
                {
                    Debug.Log(BattleResults["data"].Count);
                    BattleNummax = BattleResults["data"].Count;
                    BattleFix();
                }
                else
                {
                    GameObject.Find("Canvas/tip").GetComponent<Text>().text = "未授权";
                }
            }
            else
            {
                Debug.Log("Http 请求失败");
                Debug.Log(webRequest.error);
            }
        }
      

      六、性能分析与改进

      1.改进的思路

    • 消耗最大的函数是网络请求所消耗的,这个有点难改进。

    • 算法开始的时候考虑不是很周全,比如连队就没考虑到。

    • 然后对于一些特殊情况,可以先提前判断,可以减少消耗。

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

      img

    七、单元测试

    • 先进行本地测试:
      img
    • 进行网络登陆测试:
      img
    • 进行开启战局测试:
      img
      img
    • 出牌测试:
      img
      img

    八、Github的代码签入记录

    • 前端可执行文件的签入(陈天恒)

    • 后端算法代码签入(张火标)
      img

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

    张火标(后端)

    1.

    问题描述:在排序时卡主了,输出一直为空
    做过哪些尝试:查找一下我是否对python语句的误解,再看看程序有没有问题
    解决方法:换了一种想法,比较通俗一点的做法。成功。
    有何收获: 对于解决问题更有信心了

    2.

    问题描述:对于python并不熟悉,接口方面没接触过
    做过哪些尝试:自己查找网络资源,向同学请教
    是否解决:解决了
    有何收获: 笨鸟真的要先飞才行

    陈天恒(前端)

    1.

    问题描述:C#对api的获取真的很麻烦,比py和java麻烦的多,看了好多unity说明文档才会
    做过哪些尝试:不断地中断函数,参数类型的输入和转换,看资料
    是否解决:是
    有何收获:多学了知识点,就是C#对api的获取

    2.

    问题描述:C#对json格式的转换真的恶心,要转半天,而且很多转换函数也没有
    做过哪些尝试:要自己去网上找导入json库,妈的还要自己找半天
    是否解决:成功解决
    有何收获:找到了一个很好用的json库

    十、评价你的队友

    张火标对陈天恒

    • 值得学习的地方
      • 对一个问题能够一直探寻,直到解决为止。
      • 还有值得学习的地方就是,对于一个新的知识能够一直坚持的看下去,一直去吸收这一方面的内容,是让我觉得自己不足的地方,非常值得我去学习。
    • 需要改进的地方
      • 应该尽可能地不要通宵,少熬夜。

    陈天恒对张火标

    • 值得学习的地方
      • 从国庆就开始打代码,较早开始准备,而我比较迟才开始学习前端,我应该向他学习早点开始准备。他不断完善代码,坚持不懈,从开始学习到现在花了两周左右,有困难就继续努力,这种精神很值得我学习。
    • 需要改进的地方
      • 算法可能不够复用性不够好,下次可以改进一下

    十一、学习进度条

    • 后端(张火标)
    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 6 6 上手Axure RP,了解原型设计
    2 600 600 15 21 写算法
    3 200 800 8 29 学习网络接口的使用
    • 前端(陈天恒)
    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 6 6 上手Axure RP,了解原型设计
    2 0 0 20 26 看视频学习HTML+CSS+JS
    3 1170 1170 50 76 写前端的网站和交互,学会接口的使用
  • 相关阅读:
    【ccf线上赛普及组 2020】
    【小总结】2020.3.6
    DP优化
    noip2012day2
    noip2012day1
    3.28真题
    数据结构总结
    noi online 普及组
    小总结
    20200229模拟赛
  • 原文地址:https://www.cnblogs.com/xzytxdy/p/11749735.html
Copyright © 2020-2023  润新知