上一章已经说明了单顺的实现方法,双顺、三不带顺牌型实现方法与单牌基本类似。改动的地方除了上一章说的枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面,还有length设置的变化,因为双顺的length是count的1/2,三顺是1/3。

下面给出完整代码:

//对连类型else if (clsGameSituation.uctNowCardGroup.cgType == cgDOUBLE_LINE){//剪枝:如果能出去最后一手牌直接出CardGroupData SurCardGroupData = ins_SurCardsType(clsHandCardData.value_aHandCardList);if (SurCardGroupData.cgType != cgERROR){if (SurCardGroupData.cgType == cgDOUBLE_LINE&&SurCardGroupData.nMaxCard>clsGameSituation.uctNowCardGroup.nMaxCard&&SurCardGroupData.nCount == clsGameSituation.uctNowCardGroup.nCount){Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);return;}else if (SurCardGroupData.cgType == cgBOMB_CARD || SurCardGroupData.cgType == cgKING_CARD){Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);return;}}//暂存最佳的价值HandCardValue BestHandCardValue = get_HandCardValue(clsHandCardData);//我们认为不出牌的话会让对手一个轮次,即加一轮(权值减少7)便于后续的对比参考。BestHandCardValue.NeedRound += 1;//暂存最佳的牌号int BestMaxCard = 0;//是否出牌的标志bool PutCards = false;//验证顺子的标志int prov = 0;//顺子起点int start_i = 0;//顺子终点int end_i = 0;//顺子长度int length = clsGameSituation.uctNowCardGroup.nCount/2;//2与王不参与顺子,从当前已打出的顺子最小牌值+1开始遍历for (int i = clsGameSituation.uctNowCardGroup.nMaxCard - length + 2; i < 15; i++){if (clsHandCardData.value_aHandCardList[i] > 1){prov++;}else{prov = 0;}if (prov >= length){end_i = i;start_i = i - length + 1;for (int j = start_i; j <= end_i; j++){clsHandCardData.value_aHandCardList[j] -=2;}clsHandCardData.nHandCardCount -= clsGameSituation.uctNowCardGroup.nCount;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);for (int j = start_i; j <= end_i; j++){clsHandCardData.value_aHandCardList[j] +=2;}clsHandCardData.nHandCardCount += clsGameSituation.uctNowCardGroup.nCount;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))){BestHandCardValue = tmpHandCardValue;BestMaxCard = end_i;PutCards = true;}}}if (PutCards){for (int j = start_i; j <= end_i; j++){clsHandCardData.value_nPutCardList.push_back(j);clsHandCardData.value_nPutCardList.push_back(j);}clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgDOUBLE_LINE, BestMaxCard, clsGameSituation.uctNowCardGroup.nCount);return;}//-------------------------------------------炸弹-------------------------------------------for (int i = 3; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] == 4){//尝试打出炸弹,估算剩余手牌价值,因为炸弹可以参与顺子,不能因为影响顺子而任意出炸clsHandCardData.value_aHandCardList[i] -= 4;clsHandCardData.nHandCardCount -= 4;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);clsHandCardData.value_aHandCardList[i] += 4;clsHandCardData.nHandCardCount += 4;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))//如果剩余手牌价值为正,证明出去的几率很大, 那么可以用炸获得先手|| tmpHandCardValue.SumValue > 0){BestHandCardValue = tmpHandCardValue;BestMaxCard = i;PutCards = true;}}}if (PutCards){clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgBOMB_CARD, BestMaxCard, 4);return;}//王炸if (clsHandCardData.value_aHandCardList[17] > 0 && clsHandCardData.value_aHandCardList[16] > 0){//如果剩余手牌价值为正,证明出去的几率很大,那么可以用炸获得先手,王炸20分if (BestHandCardValue.SumValue > 20){clsHandCardData.value_nPutCardList.push_back(17);clsHandCardData.value_nPutCardList.push_back(16);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);return;}}//管不上clsHandCardData.uctPutCardType = get_GroupData(cgZERO, 0, 0);return;}//三连类型else if (clsGameSituation.uctNowCardGroup.cgType == cgTHREE_LINE){//剪枝:如果能出去最后一手牌直接出CardGroupData SurCardGroupData = ins_SurCardsType(clsHandCardData.value_aHandCardList);if (SurCardGroupData.cgType != cgERROR){if (SurCardGroupData.cgType == cgTHREE_LINE&&SurCardGroupData.nMaxCard>clsGameSituation.uctNowCardGroup.nMaxCard&&SurCardGroupData.nCount == clsGameSituation.uctNowCardGroup.nCount){Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);return;}else if (SurCardGroupData.cgType == cgBOMB_CARD || SurCardGroupData.cgType == cgKING_CARD){Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);return;}}//暂存最佳的价值HandCardValue BestHandCardValue = get_HandCardValue(clsHandCardData);//我们认为不出牌的话会让对手一个轮次,即加一轮(权值减少7)便于后续的对比参考。BestHandCardValue.NeedRound += 1;//暂存最佳的牌号int BestMaxCard = 0;//是否出牌的标志bool PutCards = false;//验证顺子的标志int prov = 0;//顺子起点int start_i = 0;//顺子终点int end_i = 0;//顺子长度int length = clsGameSituation.uctNowCardGroup.nCount / 3;//2与王不参与顺子,从当前已打出的顺子最小牌值+1开始遍历for (int i = clsGameSituation.uctNowCardGroup.nMaxCard - length + 2; i < 15; i++){if (clsHandCardData.value_aHandCardList[i] > 2){prov++;}else{prov = 0;}if (prov >= length){end_i = i;start_i = i - length + 1;for (int j = start_i; j <= end_i; j++){clsHandCardData.value_aHandCardList[j] -= 3;}clsHandCardData.nHandCardCount -= clsGameSituation.uctNowCardGroup.nCount;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);for (int j = start_i; j <= end_i; j++){clsHandCardData.value_aHandCardList[j] += 3;}clsHandCardData.nHandCardCount += clsGameSituation.uctNowCardGroup.nCount;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))){BestHandCardValue = tmpHandCardValue;BestMaxCard = end_i;PutCards = true;}}}if (PutCards){for (int j = start_i; j <= end_i; j++){clsHandCardData.value_nPutCardList.push_back(j);clsHandCardData.value_nPutCardList.push_back(j);clsHandCardData.value_nPutCardList.push_back(j);}clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgTHREE_LINE, BestMaxCard, clsGameSituation.uctNowCardGroup.nCount);return;}//-------------------------------------------炸弹-------------------------------------------for (int i = 3; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] == 4){//尝试打出炸弹,估算剩余手牌价值,因为炸弹可以参与顺子,不能因为影响顺子而任意出炸clsHandCardData.value_aHandCardList[i] -= 4;clsHandCardData.nHandCardCount -= 4;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);clsHandCardData.value_aHandCardList[i] += 4;clsHandCardData.nHandCardCount += 4;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))//如果剩余手牌价值为正,证明出去的几率很大, 那么可以用炸获得先手|| tmpHandCardValue.SumValue > 0){BestHandCardValue = tmpHandCardValue;BestMaxCard = i;PutCards = true;}}}if (PutCards){clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgBOMB_CARD, BestMaxCard, 4);return;}//王炸if (clsHandCardData.value_aHandCardList[17] > 0 && clsHandCardData.value_aHandCardList[16] > 0){//如果剩余手牌价值为正,证明出去的几率很大,那么可以用炸获得先手,王炸20分if (BestHandCardValue.SumValue > 20){clsHandCardData.value_nPutCardList.push_back(17);clsHandCardData.value_nPutCardList.push_back(16);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);return;}}//管不上clsHandCardData.uctPutCardType = get_GroupData(cgZERO, 0, 0);return;}

接下来我们讲三带一的算法,其实也很简单,无非就是在确定了三牌之后再通过循环枚举出能够返回最佳权值的顺出去的那张牌。

三带一单:

     //暂存最佳的价值HandCardValue BestHandCardValue = get_HandCardValue(clsHandCardData);//我们认为不出牌的话会让对手一个轮次,即加一轮(权值减少7)便于后续的对比参考。BestHandCardValue.NeedRound += 1;//暂存最佳的牌号int BestMaxCard = 0;//顺带出去的牌int tmp_1 = 0;//是否出牌的标志bool PutCards = false;//三带一for (int i = clsGameSituation.uctNowCardGroup.nMaxCard + 1; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] >2){for (int j = 3; j < 18; j++){//选出一张以上的牌且不是选择三张的那个牌if (clsHandCardData.value_aHandCardList[j] > 0 && j != i){clsHandCardData.value_aHandCardList[i] -= 3;clsHandCardData.value_aHandCardList[j] -= 1;clsHandCardData.nHandCardCount -= 4;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);clsHandCardData.value_aHandCardList[i] += 3;clsHandCardData.value_aHandCardList[j] += 1;clsHandCardData.nHandCardCount += 4;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))){BestHandCardValue = tmpHandCardValue;BestMaxCard = i;tmp_1 = j;PutCards = true;}}}}}if (PutCards){clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(tmp_1);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgTHREE_TAKE_ONE, BestMaxCard, 4);return;}

三带一对:

for (int i = clsGameSituation.uctNowCardGroup.nMaxCard + 1; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] >2){for (int j = 3; j < 16; j++){//选出一张以上的牌且不是选择三张的那个牌if (clsHandCardData.value_aHandCardList[j] > 1 && j != i){clsHandCardData.value_aHandCardList[i] -= 3;clsHandCardData.value_aHandCardList[j] -= 2;clsHandCardData.nHandCardCount -= 5;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);clsHandCardData.value_aHandCardList[i] += 3;clsHandCardData.value_aHandCardList[j] += 2;clsHandCardData.nHandCardCount += 5;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))){BestHandCardValue = tmpHandCardValue;BestMaxCard = i;tmp_1 = j;PutCards = true;}}}}}if (PutCards){clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(BestMaxCard);clsHandCardData.value_nPutCardList.push_back(tmp_1);clsHandCardData.value_nPutCardList.push_back(tmp_1);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgTHREE_TAKE_TWO, BestMaxCard, 5);return;}

这里我们需要注意的是,因为i和j我们是放在一起减的,所以要保证i和j不能相等。即if (clsHandCardData.value_aHandCardList[j] > 1 && j != i)

四带二与其类似,无非就是再多一个循环。

四带二单:

for (int i = clsGameSituation.uctNowCardGroup.nMaxCard + 1; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] == 4){for (int j = 3; j < 18; j++){//先选出一张以上的牌且不是选择四张的那个牌if (clsHandCardData.value_aHandCardList[j] > 0 && j != i){//再选出一张以上的牌且不是选择四张的那个牌且不是第一次选的两张内个牌(策略里四带二不允许带一对,还不如炸)for (int k = j + 1; k < 18; k++){if (clsHandCardData.value_aHandCardList[k] > 0 && k != i){clsHandCardData.value_aHandCardList[i] -= 4;clsHandCardData.value_aHandCardList[j] -= 1;clsHandCardData.value_aHandCardList[k] -= 1;clsHandCardData.nHandCardCount -= 6;HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);clsHandCardData.value_aHandCardList[i] += 4;clsHandCardData.value_aHandCardList[j] += 1;clsHandCardData.value_aHandCardList[k] += 1;clsHandCardData.nHandCardCount += 6;//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) <= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7))){BestHandCardValue = tmpHandCardValue;BestMaxCard = i;tmp_1 = j;tmp_2 = k;PutCards = true;}}}}}}}

四带二单的情况时k时从j+1开始算的,因为我们出牌的策略不允许四带二单带出去一个对,这样还不如直接炸了划算。若此处想修改的话,一定要注意判断i j k不能相等。

或者可以参考下一章处理飞机的方法,内个相对安全一些。

四带二的算法一样,都是修改枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount这几处。

不过毕竟四带二这种牌型可以拆分出炸弹,所以我在选择四带二出牌前加入了一层判定:

/*本策略对于这种牌型有炸必炸,四带二相比炸弹来说会多带出两手牌,即最多提高14权值的价值若当前手牌价值大于14,即认为我们能炸即炸,不必考虑四带二的收益,就是这么任性。*/if (BestHandCardValue.SumValue > 14){//炸弹——这里直接炸,不考虑拆分后果。因为信仰。for (int i = 3; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] == 4){clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgBOMB_CARD, i, 4);return;}}//王炸if (clsHandCardData.value_aHandCardList[17] > 0 && clsHandCardData.value_aHandCardList[16] > 0){clsHandCardData.value_nPutCardList.push_back(17);clsHandCardData.value_nPutCardList.push_back(16);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);return;}}

以及最后管不上出炸判断中,直接炸出。

//这里是在拍权值较小的情况,且没有选择出良好的四带二牌型,那么也要炸,因为信仰。for (int i = 3; i < 16; i++){if (clsHandCardData.value_aHandCardList[i] == 4){clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.value_nPutCardList.push_back(i);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgBOMB_CARD, i, 4);return;}}//王炸if (clsHandCardData.value_aHandCardList[17] > 0 && clsHandCardData.value_aHandCardList[16] > 0){clsHandCardData.value_nPutCardList.push_back(17);clsHandCardData.value_nPutCardList.push_back(16);clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);return;}

这个纯属个人信仰了,我觉得当对手打出四带二这种牌型,我有炸无论如何都是要炸的。

也就是对于四带二这种牌型我的出牌策略是:先看自己的手牌实力如何,如果较好直接炸。如果不太好,那么再看看以四带二形式管出后实力如何,如果较好,可以四带二管上,如果还是不太好,那么也是要炸,输就输了!!

本章我们把三带一、四带二牌型讲完了,下一章我们再完善剩余的飞机、炸弹牌型,也就是被动出牌最后的一部分了。所以~

敬请关注下一章:斗地主AI算法——第十一章の被动出牌(5)

斗地主AI算法——第十章の被动出牌(4)相关推荐

  1. 斗地主AI算法——第九章の被动出牌(3)

    上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码. 对牌.三不带牌型实现方法与单牌基本类似.改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时 ...

  2. 斗地主AI算法——第八章の被动出牌(2)

    上一章我们已经搭好了被动出牌的基本架子,本章我们主要说明一下被动出牌算法的基本步骤. 我把出牌逻辑分为四个阶段,也就是策略的优先级.分别是:[直接打光手牌]→[同类型牌压制]→[炸弹王炸压制]→[不出 ...

  3. 斗地主AI算法实现 一(拆牌)

    源代码下载                    ps: 前面已经写了几篇地主游戏的基本算法实现,今天来讲讲单机地主中最重要的,也是开发中最难得AI算法实现.在此声明,本博文只适合像我一样的菜鸟阅读, ...

  4. 斗地主AI算法——第七章の被动出牌(1)

    哎,之前扯了那么多蛋,终于讲出牌了! 本章开始讲被动出牌的逻辑算法.首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型. 在第二章数据结构里我们定义过,游戏全局类里面有一个存放当 ...

  5. 斗地主AI算法——第十四章の主动出牌(3)

    上一章已经排除了飞机.三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌.对牌.三牌以及单顺.双顺.三顺了. 首先说单牌.对牌.三牌.其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型 ...

  6. 斗地主AI算法——第十二章の主动出牌(1)

    本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来. 首先清空出牌序列 clsHandCardData.ClearPutCardList(); 主动出牌的策略按照优先级大体可 ...

  7. 斗地主AI算法——第十一章の被动出牌(5)

    本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型.只剩下飞机和炸弹了. 飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度. 根据上一章的算法,我们可以大概想到,若是带出 ...

  8. 斗地主AI算法——第十三章の主动出牌(2)

    上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带.飞机等牌型. 首先定义一些基本变量: //暂存最佳的价值HandCardValue BestHandCardValue;BestHa ...

  9. 斗地主AI算法——第六章の牌型判断

    本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType /* 检查剩余的牌是否只是一手牌是: 返回手牌类型数据 不是:返回错误类型(cgERROR) */ CardGroup ...

最新文章

  1. 动态匹配路由的基本用法||路由组件传递参数
  2. SpringBoot+AntV实现饼状图中的花瓣图
  3. MQTT再学习 -- 漫谈MQTT协议
  4. Windows 10系统下 MySql 5.7 my.ini 位置
  5. 轮到苹果追赶国产厂商了?苹果新专利曝光iPhone将使用屏幕指纹解锁
  6. ma5200g启用mpls l2***故障处理一则
  7. day08.4-samba共享网盘服务
  8. python生成字符画_通过python将图片生成字符画
  9. WPF简单实用方法(持续更新)
  10. fragment--总结
  11. 服务器的ftp数据库信息,服务器ftp及数据库账号
  12. dede织梦CMS采集过滤规则
  13. python 爬取链家二手房信息
  14. MSP430 F5529 单片机 串口 万年历 电子时钟 数字时钟 Digital clock
  15. 前端Table用JS导出Excel数字自动变成科学计数法问题
  16. rdmsr获取Intel CPU温度
  17. 怎样用计算机编码出文字,计算机汉字编码主要有哪些方式
  18. ubuntu java 7_在Ubuntu上安装Java 7
  19. Notepad 追加字符
  20. 2022中国老博会/老龄用品展/智慧养老展/北京老年产业展

热门文章

  1. 一起学习C语言:初步进入编程世界(三)
  2. windows mobile 服务自动停止_打印服务print Splooer自动停止怎么办?
  3. python代码少的作品_世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?...
  4. c语言sort函数_C语言经典面试题目及答案详解(二)
  5. k8s初始化集群后kubectl get nodes错误
  6. 如何在JS判断是否为IE浏览器
  7. python 遍历数组根据规律拆分,python 实现以相同规律打乱多组数据
  8. eof在c语言中表示什么_日语中的鍵为什么既能表示“钥匙”也能表示“锁”?...
  9. layui复选框:被js操作checked切换并显示状态(含案例、代码)
  10. csdn2020年度博客之星 - 直播间(恭喜圆满结束)