H5五分钟上手牛牛算法

废话不多说,直接上代码,如有问题,欢迎咨询

  /**
    * Game类
    * */
   function Cards(opt) {
       this.defaults = {
           'name': 'cow',
       };
       this.options = $.extend({}, this.defaults, opt);
   }
   Cards.prototype = {
       createCards : function (){
           var cards = [],
               cardType = [1, 2, 3, 4], //牌的花色,为了便于比较不同花色的大小,采用数值代替黑桃、红桃等文字
               cardPoint = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; //牌面值,J、Q、K分别为11,12,13,这里没有大小王
               cardPoint.forEach(function (p) { //两个forEach循环为每个花色创建一组牌,共四组,合计52张牌
               cardType.forEach(function (t) {
                   var card = {
                       cardType : t,
                       cardNum : p
                   };
                   cards.push(card)
               })
           });
           cards= this.disorder(cards);
           return cards;
       },
       disorder : function (cards){
           var temp,len = cards.length;
           for(var i = 0; i < len; i++){
               var r = Math.ceil(Math.random()*len);
               temp = cards[i];
               cards[i] = cards[r];
               cards[r] = temp;
           }
           return cards;
       }
   };


   var cardF= new Cards();
   //先跑20局,player1:赢家,player2:输家
   for(var i=0; i<20; i++){
       var player= cardF.createCards().notempty();
       console.log(player.length);
       var player1= player.splice(0,5);
       var player2= player.splice(0,5);
       console.log(comparedCards(player1, player2));
   }
   /**
    * 比牌
    * */
   function comparedCards(player1, player2){
       var cardsObj=new Object();
       var cards1= new Array(),
           cards2= new Array();
       for(var i=0; i<5; i++){
           cards1.push(player1[i].cardNum);
           cards2.push(player2[i].cardNum)
       }
       //console.log("cards1:"+cards1+" cards2"+cards2);
       //牌型获取
       var cards1Size= parseInt(getCardsNum(cards1)) ;
       var cards2Size= parseInt(getCardsNum(cards2)) ;
       console.log("cards1Size: "+cards1Size+" cards2Size: "+cards2Size);
       if(cards1Size > cards2Size){
           cardsObj.player1= player1;
           cardsObj.player2= player2;
       }else if(cards1Size < cards2Size){
           cardsObj.player1= player2;
           cardsObj.player2= player1;
       }else if(cards1Size === cards2Size){
           //按照花色大小排序
           player1.sort(cardsSort).sort(cardsSort2);
           player2.sort(cardsSort).sort(cardsSort2);

           if(player1[0].cardNum > player2[0].cardNum){
               cardsObj.player1= player1;
               cardsObj.player2= player2;
           }else if(player1[0].cardNum < player2[0].cardNum){
               cardsObj.player1= player2;
               cardsObj.player2= player1;
           }else if(player1[0].cardNum == player2[0].cardNum){
               if(player1[0].cardType > player2[0].cardType){
                   cardsObj.player1= player1;
                   cardsObj.player2= player2;
               }else if(player1[0].cardType < player2[0].cardType){
                   cardsObj.player1= player2;
                   cardsObj.player2= player1;
               }
           }

       }
       return cardsObj
   }

   /**
    * 牌型获取
    * 13:炸弹, 12:五小牛, 11:五花牛, 10:牛牛,1~9:牛几,0:无牛
    * */
   function getCardsNum(card5){
       //获得炸弹
       var count = 0, sameCardCount = 0;
       for(var i = 0; i<5; i++){
           for(var j = 0; j<5;j++){
               card5[i] == card5[j] ?  count++ : count
           }
           sameCardCount = Math.max(count,sameCardCount);
           count = 0;
       }
       if(sameCardCount >=4){
           return 13;
       }

       //获得五小牛
       var count1 = 0,
           sum=0;
       for(var i = 0; i<5; i++){
           card5[i]<5 ? count1++ : count1;
           sum+=card5[i];
       }
       //console.log(count+";"+sum)
       if(count1 == 5 && sum<10){
           return 12;//五小牛
       }

       //获得五花牛
       var count2 = 0;
       for(var i = 0; i<5; i++){
           card5[i] > 10 ? count2++ : count2
       }
       if(count2 ==5){
           return 11;   //五花牛
       }

       //牛几
       //大于10的转换成10
       for(var i = 0; i<5; i++){
           card5[i]= card5[i] > 10 ? 10 : card5[i]
       }
       for(var i = 0; i<3; i++){
           for(var j = i+1;j<4;j++){
               for(var k = j+1;k<5;k++){
                   if(sumFn([card5[i],card5[j],card5[k]]) == 0){
                       var copy = card5.slice();
                       delete copy[i];
                       delete copy[j];
                       delete copy[k];
                       var a = sumFn(copy.filter(function(){return true}));
                       if(a == 0){return 10}//牛牛
                       else{return a}//a牛
                   }
               }
           }
       }
       return 0;//'无牛'

       //求和并求于10
       function sumFn(arr){
           return arr.reduce(function(a,b){return a+b})%10
       }
   }

   /**
    * 牌由大到小比较
    * */
   function cardsSort(a,b){
       return(b.cardNum-a.cardNum)
   }
   /**
    * 牌花色由黑红梅方比较
    * */
   function cardsSort2(a,b){
       if(a.cardNum == b.cardNum){
           return(b.cardType-a.cardType)
       }
   }
/**
* 扩展Array方法, 去除数组中空白数据
*/
Array.prototype.notempty = function(){
   for(var i=0; i

你可能感兴趣的:(H5五分钟上手牛牛算法)