日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言jj斗地主源码,GitHub - choushane/cocoscreator-ddz: cocos-斗地主,客户端和服务端(node.js socket.io)...

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。