c语言jj斗地主源码,GitHub - choushane/cocoscreator-ddz: cocos-斗地主,客户端和服务端(node.js socket.io)...
cocoscreator-斗地主
/**
* 牌型
火箭:即雙王(大王和小王),最大的牌。
炸彈:四張點數相同的牌,如:7777。
單牌:任意一張單牌。
對牌:任意兩張點數相同的牌。
三張:任意三張點數相同的牌,如888。
三帶一:點數相同的三張牌+一張單牌或一對牌。如:333+6 或 444+99。
單順:任意五張或五張以上點數相連的牌,如:45678或78910JQK。不包括 2和雙王。
雙順:三對或更多的連續對牌,如:334455、7788991010JJ。不包括 2 點和雙王。
三順:二個或更多的連續三張牌,如:333444 、555666777888。不包括 2 點和雙王。
飛機帶翅膀:三順+同數量的單牌或同數量的對牌。如:444555+79 或333444555+7799JJ
四帶二:四張牌+兩手牌。(注意:四帶二不是炸彈)。如:5555+3+8 或 4444+55+77 。
*/
var PokerObj = require("Poker");
var CardType = cc.Enum({
c1: 0, //單牌。
c2: -1, //對子。
c20: -1, //王炸。
c3: -1, //3不帶。
c4: -1, //炸彈。
c31: -1, //3帶1。
c32: -1, //3帶2。
c411: -1, //4帶2個單,或者一對
c422: -1, //4帶2對
c123: -1, //順子。
c1122: -1, //連隊。
c111222: -1, //飛機。
c11122234: -1, //飛機帶單排.
c1112223344: -1, //飛機帶對子.
c0: -1 //不能出牌
});
//獲取牌的等級
function getGrade(card) {
return card.getComponent('Poker')._grade;
};
//牌生成一個反應數量的數組
function getCarAnalyseInfo(cards) {
var oneArray = [];
var twoArray = [];
var threeArray = [];
var fourArray = [];
//循環跳過的數量=相同牌的數量
var jumpCount = 1;
for (let i = 0; i < cards.length; i += jumpCount) {
var sameCount = 1;
var grade = getGrade(cards[i]);
for (let j = i + 1; j < cards.length; j++) {
var grade1 = getGrade(cards[j]);
if (grade != grade1) {
break;
}
sameCount++;
}
jumpCount = sameCount;
switch (sameCount) {
case 1:
oneArray.push(grade);
break;
case 2:
twoArray.push(grade);
break;
case 3:
threeArray.push(grade);
break;
case 4:
fourArray.push(grade);
break;
default:
break;
}
};
var allInfo = [oneArray, twoArray, threeArray, fourArray];
console.log(allInfo)
return allInfo;
}
//根據長度篩選先
function sortByLength(cards) {
let length = cards.length;
var cardsInfo = getCarAnalyseInfo(cards);
switch (length) {
case 0:
return CardType.c0;
break;
case 1:
//單
return CardType.c1;
break;
case 2:
//進行對子的判斷和王炸判斷
if (checkIsWangzha(cards)) {
return CardType.c20;
} else if (cardsInfo[1].length == 1) {
return CardType.c2;
}
break;
case 3:
//3不帶的判斷
if (cardsInfo[2].length == 1) {
return CardType.c3;
}
break;
case 4:
//炸彈、3帶1。
if (cardsInfo[2].length == 1) {
return CardType.c31;
} else if (cardsInfo[3].length == 1) {
return CardType.c4;
}
break;
case 5:
//三帶二、順子
//炸彈
if (cardsInfo[2].length == 1 && cardsInfo[1].length == 1){
return CardType.c32;
} else if (cardsInfo[3].length == 1) {
return CardType.c4;
} else if (checkIsShunzi(cardsInfo, length)) {
return CardType.c123;
}
break;
case 6:
//順子、四帶二、飛機不帶、連對
if (cardsInfo[3].length == 1) {
return CardType.c411;
} else if (cardsInfo[2].length == 2) {
return CardType.c111222;
} else if (checkIsShunzi(cardsInfo, length)) {
return CardType.c123;
} else if (checkIsLianDuizi(cardsInfo, length)) {
return CardType.c1122;
}
break;
case 8:
//順子、四帶二對、連對、飛機帶單
if (cardsInfo[3].length == 1 && cardsInfo[1].length == 2) {
return CardType.c422;
} else if (cardsInfo[2].length == 2) {
return CardType.c11122234;
} else if (checkIsShunzi(cardsInfo, length)) {
return CardType.c123;
} else if (checkIsLianDuizi(cardsInfo, length)) {
return CardType.c1122;
}
break;
default:
//順子、連對、飛機(不帶、單、雙)
/**
* 順子:每個值差1,5-11張,不含王、2
* 連對:偶數,每兩個差1,6-18張,不含王、2
* 飛機不帶:%3為0,每三張差1,6-18張
* 飛機帶單:%4為0,從前到后或者后到前,每三張差1,8-16張
* 飛機帶雙:%5為0,從前到后或者后到前,每三張差1,10-15張
*/
if (checkIsShunzi(cardsInfo, length)) {
return CardType.c123;
} else if (checkIsLianDuizi(cardsInfo, length)) {
return CardType.c1122;
} else if (checkIsFeiJi(cardsInfo, length, 3)) {
//飛機不帶
return CardType.c111222;
} else if (checkIsFeiJi(cardsInfo, length, 4)) {
//飛機帶單
return CardType.c11122234;
} else if (checkIsFeiJi(cardsInfo, length, 5)) {
//飛機帶對子
return CardType.c1112223344;
}
break;
}
return CardType.c0;
}
//進行對子的判斷和王炸判斷
function checkIsWangzha(cards) {
var grade1 = getGrade(cards[0]);
var grade2 = getGrade(cards[1]);
//王炸
if (grade1 == 17 && grade2 == 16) {
return true;
}
return false;
}
//順子的判斷
function checkIsShunzi(cardsInfo, length) {
var flag = false;
if (cardsInfo[0].length != length) {
//單排數組長度為所有撲克牌
} else if (checkElementIsContain(17, cardsInfo[0]) || checkElementIsContain(16, cardsInfo[0]) || checkElementIsContain(15, cardsInfo[0])) {
//不可以包含王、2
} else if (cardsInfo[0][0] - cardsInfo[0][cardsInfo[0].length - 1] == length - 1) {
//(第一張牌值 - 最后一張牌值)== (length-1)
flag = true;
}
return flag;
}
//連對子判斷
function checkIsLianDuizi(cardsInfo, length) {
var flag = false;
if ((cardsInfo[1].length != length / 2) || (0 != length % 2)) {
//對子數組長度為所有撲克牌/2 length為2的整除
} else if (checkElementIsContain(17, cardsInfo[1]) || checkElementIsContain(16, cardsInfo[1]) || checkElementIsContain(15, cardsInfo[1])) {
//不可以包含王、2
} else if ( cardsInfo[1][0] - cardsInfo[1][cardsInfo[1].length - 1] == length / 2 - 1) {
//(第一張牌值 - 最后一張牌值)== (length/2-1)
flag = true;
}
return flag;
}
function checkIsFeiJi(cardsInfo, length, count) {
var flag = false;
if ((cardsInfo[2].length != length / count) || (0 != length % count)) {
//對子數組長度為所有撲克牌/2 length為2的整除
} else if (checkElementIsContain(15, cardsInfo[2])) {
//不可以包含、2
} else if (cardsInfo[2][0] - cardsInfo[2][cardsInfo[2].length - 1] == length / count - 1) {
//(第一張牌值 - 最后一張牌值)== (length/3-1)
flag = true;
}
return flag;
}
//二次排序(針對四帶和三代)
function secondSortWithCards(cards){
let type = sortByLength(cards);
var cardsInfo = getCarAnalyseInfo(cards);
if (type == CardType.c31 ||type == CardType.c32 ||type == CardType.c11122234 ||type == CardType.c1112223344) {
//將cardsInfo[2]中有的全部提前
//反向遍歷
for (let i = cardsInfo[2].length -1 ; i >=0 ; i--) {
let grade = cardsInfo[2][i];
for (let j = 0 ; j
const pokerSpriteOne = cards[j];
let pokerGrade = pokerSpriteOne.getComponent('Poker')._grade;
//找到相等等級的提前
if (grade == pokerGrade) {
let tempArray = [cards[j+2],cards[j+1],cards[j]];
//合并兩個數組
cards = tempArray.concat(cards);
//刪除原始的三個數據
cards.splice(j+3,3);
break;
}
}
}
}else if (type == CardType.c411 ||type == CardType.c422) {
//將cardsInfo[3]中有的全部提前
//反向遍歷
let grade = cardsInfo[3][0];
for (let j = 0 ; j
const pokerSpriteOne = cards[j];
let pokerGrade = pokerSpriteOne.getComponent('Poker')._grade;
//找到相等等級的提前
if (grade == pokerGrade) {
let tempArray = [cards[j],cards[j+1],cards[j+2],cards[j+3]];
//合并兩個數組
cards = tempArray.concat(cards);
//刪除原始的三個數據
cards.splice(j+4,4);
break;
}
}
}else{
return cards;
}
return cards;
}
/**
* 比較兩次打的牌,后一次要大于前一次
* @param {上一手牌} lastPoker
* @param {本次} thisPoker
*/
function comparePokers(lastPoker, thisPoker) {
//首先判斷是否為炸彈和王炸
if (lastPoker == CardType.c20) {//上一手為王炸
return false;
} else if (thisPoker == CardType.c20) {//當前為王炸
return true;
} else if (thisPoker == CardType.c4 && lastPoker != CardType.c4) {//當前為炸彈,上一手不為炸彈
return true;
}
//長度不同則直接返回錯誤
if (Global.lastPokers.length != Global.selectPokers.length) {
return false;
}
//大小判斷
if (lastPoker == thisPoker) {
//通用方法,從大到小(先排序一次)
bubbleSortCards(Global.lastPokers);
bubbleSortCards(Global.selectPokers);
let lastCardsInfo = getCarAnalyseInfo(Global.lastPokers);
let thisCardsInfo = getCarAnalyseInfo(Global.selectPokers);
let index = 0;
if (lastPoker == CardType.c1 || lastPoker == CardType.c123) {
index = 0;
} else if (lastPoker == CardType.c2) {
index = 1;
} else if (lastPoker == CardType.c3 || lastPoker == CardType.c31 || lastPoker == CardType.c32 || lastPoker == CardType.c11122234 || lastPoker == CardType.c1112223344) {
index = 2;
} else if (lastPoker == CardType.c4 || lastPoker == CardType.c411 || lastPoker == CardType.c422) {
index = 3
}
for (let i = 0; i < lastCardsInfo[index].length; i++) {
if (lastCardsInfo[index][i] >= thisCardsInfo[index][i]) {
//出現一個小于則失敗
return false;
}
}
return true;
}
return false;
}
//檢查數組是否包含元素
function checkElementIsContain(element, array) {
for (const grade of array) {
if (grade == element) {
return true;
}
}
return false;
};
/**
* 對牌進行排序,從小到大,使用冒泡排序,此種方法不是很好
*
* @param cards
* 牌
*/
function bubbleSortCards(cards) {
if (cards == null) {
return cards;
}
let size = cards.length;
// 冒泡排序,從左到右,從小到大
for (var i = 0; i < size; i++) {
for (var j = 0; j < size - 1 - i; j++) {
let pokerSpriteOne = cards[j];
let PokerOne = pokerSpriteOne.getComponent('Poker');
let pokerSpriteTwo = cards[j + 1];
let PokerTwo = pokerSpriteTwo.getComponent('Poker');
var gradeOne = PokerOne._grade;
var gradeTwo = PokerTwo._grade;
var isExchange = false;
if (gradeOne < gradeTwo) {
isExchange = true;
} else if (gradeOne == gradeTwo) {
// 2張牌的grade相同
var type1 = PokerOne._bigType;
var type2 = PokerTwo._bigType;
// 從左到右,方塊、梅花、紅桃、黑桃
if (type1 == PokerObj.CardBigType.HEI_TAO) {
isExchange = true;
} else if (type1 == PokerObj.CardBigType.HONG_TAO) {
if (type2 == PokerObj.CardBigType.MEI_HUA ||
type2 == PokerObj.CardBigType.FANG_KUAI) {
isExchange = true;
}
} else if (type1 == PokerObj.CardBigType.MEI_HUA) {
if (type2 == PokerObj.CardBigType.FANG_KUAI) {
isExchange = true;
}
}
}
if (isExchange) {
cards[j + 1] = pokerSpriteOne;
cards[j] = pokerSpriteTwo;
}
}
}
// console.log("我的牌"+ cards);
// return cards;
};
module.exports = {
CardType: CardType,
sortByLength: sortByLength,
bubbleSortCards: bubbleSortCards,
secondSortWithCards: secondSortWithCards,
comparePokers:comparePokers
}
總結
以上是生活随笔為你收集整理的c语言jj斗地主源码,GitHub - choushane/cocoscreator-ddz: cocos-斗地主,客户端和服务端(node.js socket.io)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net开通支付宝移动端网页支付
- 下一篇: 大陆居民身份证验证方法(java)