第二次结对编程作业

一、题目描述

题目:“福建赌王”之争

【题目背景】

    话说,自称“赌王”的老周与同样自称“赌王”的老刘在福州展开“赌王”名号的争夺。两人商议决定使用福建当地的一套纸牌游戏规则进行博弈,即“福建十三水”。约定三周后展开决战。老刘修习代码多年,希望开发一套自动化的出牌系统,具体游戏规则请上网查询或找福大柯老板,本次作业要求提交一份设计好的原型设计图。

WARNING:珍惜钱财,远离赌博(含AI赌博)。

二、相关的链接

我的Github地址 详情

结对同学的Github地址 详情

结对同学博客地址 详情

上次原型设计的博客链接 详情

iOS端运行视频地址 https://pan.baidu.com/s/1cxejhS91haSj3CTRmxMkPA

三、具体的分工

我在本次十三水作业中主要负责客户端(iOS)的编写,队友陈展鸿负责后端算法的实现。

注:由于iOS的特殊性,暂无法打包成二进制文件,若负责测评前端的同学没有运行iOS的工具,请联系我进行测评。

四、PSP表格

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

五、解题思路与设计实现说明

  • iOS端整体代码就是一坨屎,哥哥姐姐们喷得轻一点。
  • iOS端网络接口的使用:使用了Alamofire对后端算法的服务器跟福哥的评测服务器进行访问,SwiftyJSON对JSON数据进行解析处理。
  • iOS端网络请求的代码使用了单例模式,下面给出部分代码示例如下:
class HubRequest:NSObject{
    static let shared = HubRequest()
    open var HubData = HubDataModel()
    //登录请求接口
    func loginRequest(userName:String,passWord:String, _ completion: @escaping (HubDataModel) -> ()){
        let parms = [
        "username": userName,
        "password": passWord
        ]
        let header:HTTPHeaders = ["Content-Type":"application/json"]
        Alamofire.request("https://api.shisanshui.rtxux.xyz/auth/login", method: .post, parameters: parms, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in
            if response.result.isSuccess {
                if let jsons = response.result.value{
                let jsonDict = JSON(jsons)
                let jsonData = jsonDict["data"]
                guard jsonData.count > 0 else{
                        return
                    }
                    self.HubData.token = jsonData["token"].stringValue
                    self.HubData.userId = jsonData["user_id"].intValue
                }    
                completion(self.HubData)
                        } else {
                            NSLog("登录失败:\(response)")
                        }
        }
        
    }
//调用HubRequest单例发送登录请求
@IBAction func login(_ sender: Any) {
        NetWorkActivityIndicatorView.startAnimating()
        HubRequest.shared.loginRequest(userName: userText.text ?? "", passWord: passWord.text ?? "") { (HubData) in
            self.configureMenuView()
            self.NetWorkActivityIndicatorView.stopAnimating()
        }
    }
  • 后端算法的关键流程图

  • 后端算法内部类图

  • iOS端内部类图

六、关键代码的解释

    class AiPlayRequest: NSObject{
        //创建后端与对战平台的请求单例
        static let shared = AiPlayRequest()
        var sortedCard = SortedCardModel()
        //从后端拿到要出牌的顺序
        func getSortedCards(id: Int, card: String, _ completion: @escaping (SortedCardModel) -> ()){
            let parms = [
                "status":0,
                "id":id,
                "card":card
                ] as [String : Any]
            Alamofire.request("http://49.235.150.59:8080/thirteenWaterByCzh/getCards", method: .post, parameters: parms).responseJSON { (response) in
                if response.result.isSuccess{
                    NSLog(response)
                    if let jsons = response.result.value{
                        let jsonDict = JSON(jsons)
                        let cards = jsonDict["card"]
                        self.sortedCard.id = id
                        self.sortedCard.first = cards[0].stringValue
                        self.sortedCard.second = cards[1].stringValue
                        self.sortedCard.third = cards[2].stringValue
                    }
                    completion(self.sortedCard)
                }else{
                    NSLog("sorting cards error:\(response)")
                }
            }
        }  
         //向对战平台提交牌
        func submitRequest(id:Int){
            let header = [
                "Content-Type":"application/json",
                "X-Auth-Token":HubRequest.shared.HubData.token
            ]
            let parms = [
                "id":id,
                "card":[
                    sortedCard.first,
                    sortedCard.second,
                    sortedCard.third
                ]
                ] as [String : Any]
            Alamofire.request("https://api.shisanshui.rtxux.xyz/game/submit", method: .post, parameters: parms, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in
                if response.result.isSuccess{
                    NSLog("出牌成功 \(response)")
                }else{
                    NSLog("出牌失败 \(response)")
                }
            }
        }
    }

七、性能的分析与改进

可以看到主要进行出牌算法占据了绝大部分时间,小部分时间由io、依赖包函数调用占用。

  • 可以先直接判断是否为特殊牌型进而直接输出
  • 设置一定的权重阈值 达到即可输出
  • 不同的散排牌型放置不同的数组内

八、 单元测试

iOS前端的连接请求测试

  • 登录测试:
  • 开始战局测试:
  • 排行榜测试:
  • 历史战绩测试:
  • 历史战绩详情测试:

后端算法单元测试

九、 github迁入记录

十、遇到的代码模块异常:

  • 问题描述:因为给的工期较短,为了同学测评时能得到更好的效果,方便后期进行屏幕适配并且提高开发效率(好吧其实是我太懒了),此次iOS端开发过程中大量使用了xib来编写界面。但也因此踩了一些较为弱智的坑。印象比较深刻的是一次由于视图结构没有设计好导致点击tableView的时候所有cell都会消失,将其视为玄学debug挺久。
  • 做过哪些尝试:不论是重新使用xib写一次还是用纯代码再撸一遍都解决不了这个问题,后面意识到可能是自己设计的view结构产生了冲突,便重新改了一下逻辑结构。
  • 是否解决:已解决
  • 有何收获:emmmmm感觉自己越来越菜了

十一、 我的队友czh大佬牛逼的一批!后端都不用我掺合,直接后端算法部署到服务器之后把接口丢给我就完事了!不足的话算法能力还有待加强!

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 重要成长
第一周 0 0 5 学习原型设计(墨刀)的使用
第二周 0 0 20 学习iOS端开发的基本知识
第三周 3000 3000 50 进行iOS开发
第四周 2000 5000 20 进行iOS端逻辑优化
posted @ 2019-10-15 22:51  Jamwong  阅读(385)  评论(4编辑  收藏  举报