zoukankan      html  css  js  c++  java
  • 第二次结对编程作业

    一、结对情况

    朱庆章
    github

    二、分工情况

    朱庆章负责前端、接口部分,以及博客撰写部分
    陈梦雪负责算法部分,以及博客的撰写

    三、PSP表格

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

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

    1、网络接口的使用

    随便贴三个js函数您就看明白了

    var token=localStorage.getItem("token");
    		//拿牌
    function start(){	
    	$.ajax({
                url: "http://api.revth.com/game/open",
                beforeSend: function(xhr) 
    			{
                    xhr.setRequestHeader("X-Auth-Token",token);
                },
                type: "post",
                success: function (data) 
    			{
    				console.log(data);
    				console.log(token);
    				localStorage.setItem("cards",data.data.card);
    				localStorage.setItem("game_id",data.data.id);//战局ID
    				solution();
                },
    			error: function (res) {
    				alert("无法进入游戏");
    				window.location.href = '游戏大厅.html';
            	}
            });
    };
    		//算牌
    function solution()
    {
    			var cards=localStorage.getItem("cards");
    			alert("获得卡片:"+cards);
    			console.log(JSON.stringify({
    				"card":cards
    			}));
    	$.ajax({
                url: "http://127.0.0.1:8090/getcards", //算法
    			data:{"card":cards},
    			header:{
                 "Content-Type": "application/x-www-form-urlencoded",
               			},
                type: "post",
                success: function (data) {
    				var cardstring=data.card.toString();		
    				localStorage.setItem("cardSolution",cardstring);
    				
    				//获取结果完毕
    				document.getElementById('player4').value ="Card: 
    "+cardstring;
                },
    			error: function (res) {
    				alert("自动打牌错误");
    				window.location.href = '游戏大厅.html';
            	}
    	
            });
    };
    		//发牌
    function postcard(){
    	
    	var id=localStorage.getItem("game_id");
    	//localStorage.setItem("detailid1",id);
    	var card2=localStorage.getItem("cardSolution");
    	var card3=card2.split(/[ ,]+/);
    	var card4=new Array(3);
    	card4[0]=card3[0]+' '+card3[1]+' '+card3[2];
    	card4[1]=card3[3]+' '+card3[4]+' '+card3[5]+' '+card3[6]+' '+card3[7];
    	card4[2]=card3[8]+' '+card3[9]+' '+card3[10]+' '+card3[11]+' '+card3[12];
    	console.log(card4);
        id =Number(id);
    	$.ajax({
                url: "http://api.revth.com/game/submit",
    			contentType:"application/json",
    		    data:JSON.stringify({
    				"id":id,
    				"card":card4
    			}),
                beforeSend: function(xhr) {
                    xhr.setRequestHeader("X-Auth-Token",token);
                },
                type: "post",
                success: function (data) {
    				console.log(token);
    				console.log(data);
    				console.log(data.data.msg);
    				alert("成功出牌");
    				window.location.href = '游戏大厅.html';
                },
    			error: function (res) {
    				alert("出牌失败");
    				window.location.href = '游戏大厅.html';
            	}
            });
    	
    }
    

    2、代码组织与内部实现设计

    我的代码就一个类呐

    3、算法的关键与关键实现部分流程图


    整个算法最重要的就是权值的设置,主要是看胜率来设置吧
    其实一开始的想法是先不分墩,直接按牌型等级去搜索出五张优先分配给后墩,然后再继续搜索,这样虽然会快很多,但是就跟斗地主里面的机器人托管一样笨
    后来就用遍历赋权值的方法暴力搜索,这种虽然慢,但是有点智能的味道

    五、关键代码解释

    关键部分的算法就是各种牌型的判断,要判断牌型,首先要对这五张/三张牌进行排序、统计花色和数字
    接下来就是判断牌型了

    • 同花顺
      首先是要判断同一花色,然后在判断顺子
    for i in range (1,5):
        if flower[i] == 5:
            if shunzi_5(temp_third[0].num)
    
    • 炸弹:
      只要判断数字桶里面是否有4个数字就行了
    for i in range(0,5):
    		
    		if number[temp_third[i].num] == 4
    
    • 葫芦:
      只要判断数字桶里有只有2和3
    for i in range(0,5):
    		 
    		 if number[temp_third[i].num] == 3:
    			 
    			 for j in range(0,5):
    				 
    				 if number[temp_third[4-j].num] == 2
    
    • 同花:
      参考同花顺
    • 顺子:
      参考同花顺,判断五条顺子的函数是:
    def shunzi_5(x):
    	
    	for i in range (x,x+5):
    		
    		if number[x] <1:
    			
    			return 0
    			
    	return 1
    
    • 三条:
      因为三条是三张一样的牌带两张不同的牌,由于之前已经判断过葫芦了,所以这次如果桶里面有三张一样的,那就一定是三条了
    for i in range(0,5):
    		
    		if number[temp_third[i].num] == 3
    
    • 连续两对:
      由于我的五张牌已经按照从小到大的顺序了,所以如果第i个桶是2且第i+1个桶也是2,那就是连续两对
    for i in range(0,4):
    		
    		if number[temp_third[i].num]==2 and number[temp_third[i].num+1]==2
    
    • 普通两对:
      两次循环遍历判断就好了~
    for i in range(2,15):
    		
    		if number[i]==2:
    			
    			for j in range(i,15):
    				
    				if number[j] == 2:
    
    • 一对:
      桶里有个2啦
    for i in range(2,15):
    		
    		if number[16-i] == 2
    
    • 散牌
      如果以上牌型都没有判断出来,就是散牌啦

    六、性能分析与改进

    • 特殊牌型
      一开始花了挺多时间去研究特殊牌型怎么判断,当我好不容易写了几百行判断特殊牌型的算法后猛然发现,我就算不知道这是特殊牌型,然后我按普通牌型出牌服务器也能判断出我的是特殊牌型(这个应该算是题目的bug??)
    • 在搜索出后墩中,可以预先判断一下后墩的等级,因为后墩的等级最少也要两个对子以上,这样就能排除掉一部分的情况了

    七、单元测试

    • 测试后墩牌

    • 测试中墩牌

    八、Github代码签入记录

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

    1.问题描述

    • 其实我的python不是特别会用,但是对比C++和JAVA还是觉得python好上手一点
    • 出现只有后墩,前两墩都是空的bug
    • 网络接口不懂不懂
    • 一开始想的太简单了以为只要很多if判断就好啦,是我太年轻了orz

    2.做过哪些尝试

    • 大部分百度吧,当然也有参考一点别人的思路
    • 慢慢找bug

    3.是否解决

    • 都解决

    4.有何收获

    • 了解了网络接口的使用,对服务器与用户端的交互理解更加深刻
    • 对python的函数和性质有了更深的理解

    十、评价你的队友

    • 值得学习的地方
      学习能力强吧,效率比较高
    • 需要改进的地方
      我俩都是拖延症杀手

    学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 7 7 学会了py吧
    2 423 423 8 15 第一次用py编程
    3 400 823 8.5 23.5 主要是界面设计,还有Linux
    4 980 1800 10 33.5 py更熟练一点
  • 相关阅读:
    软键盘的监听
    获取视频播放时长
    安装hue及hadoop和hive整合
    Centos6.5使用yum安装mysql——快速上手必备(转载)
    Hadoop yarn任务调度策略介绍(转)
    CentOS下RPM方式安装MySQL5.6(转载)
    exists,in的区别-mysql
    CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解决方法
    SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权
    SpringMVC+Apache Shiro+JPA(hibernate)案例教学(三)给Shiro登录验证加上验证码
  • 原文地址:https://www.cnblogs.com/hard-to-say/p/11750079.html
Copyright © 2011-2022 走看看