废话不多说,直接上代码,如有问题,欢迎咨询
/**
* 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<this.length; i++){
if(this[i] == "" || typeof(this[i]) == "undefined"){
this.splice(i,1);
i--;
}
}
return this;
};