134 lines
3.7 KiB
TypeScript
134 lines
3.7 KiB
TypeScript
import {Card} from "../rooms/schema/Card";
|
|
|
|
import arrUtil from "./array.util";
|
|
import {Player} from "../rooms/schema/Player";
|
|
import {singleton} from "../common/Singleton";
|
|
import {GameEnv} from "../cfg/GameEnv";
|
|
|
|
let gameUtil = {
|
|
// TODO: 根据配表生成牌组
|
|
initCardQue() {
|
|
let cards: Array<Card> = [];
|
|
let nums: Array<number> = [];
|
|
let types : Array<number> = [];
|
|
for (let i = 0; i < 12; i ++) {
|
|
for (let j = 0; j < 16; j ++) {
|
|
nums.push(i);
|
|
}
|
|
}
|
|
arrUtil.randomSort(nums);
|
|
for (let i = 0; i < 8; i ++) {
|
|
for (let j = 0; j < 24; j ++) {
|
|
types.push(i);
|
|
}
|
|
}
|
|
arrUtil.randomSort(types);
|
|
for (let i = 0; i < nums.length; i++) {
|
|
cards.push(new Card(nums[i] + 1, types[i] + '', i));
|
|
}
|
|
arrUtil.randomSort(cards);
|
|
return cards;
|
|
},
|
|
/**
|
|
* 检查目标数组中的卡id是否在存在
|
|
* @param cardMap
|
|
* @param cardIds
|
|
*/
|
|
checkCardsExists(cardMap: Map<string, Card>, cardIds: Array<string>) {
|
|
let result = true;
|
|
for (let id of cardIds) {
|
|
if (!cardMap.has(id + '')) {
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
},
|
|
/**
|
|
* 抽卡
|
|
* @param cardArr
|
|
* @param player
|
|
* @param count
|
|
*/
|
|
drawCard(cardArr: Card[], player: Player, count: number): Card[] {
|
|
let cards: Card[] = [];
|
|
for (let i = 0; i < count; i++) {
|
|
let card = cardArr.pop();
|
|
cards.push(card);
|
|
player.cards.set(card.id + '', card);
|
|
player.cardSet.add(card.id + '');
|
|
}
|
|
return cards;
|
|
},
|
|
/**
|
|
* 更换相同数量的卡
|
|
* @param cardArr
|
|
* @param player
|
|
* @param targetCards
|
|
*/
|
|
changeCard(cardArr: Card[], player: Player, targetCards: Card[]): Card[] {
|
|
let cards: Card[] = [];
|
|
for (let card of targetCards) {
|
|
player.cards.delete(card.id + '');
|
|
player.cardSet.delete(card.id + '');
|
|
}
|
|
arrUtil.randomInsert(cardArr, targetCards);
|
|
let count = targetCards.length;
|
|
for (let i = 0; i < count; i++) {
|
|
let card = cardArr.pop();
|
|
cards.push(card);
|
|
player.cards.set(card.id + '', card);
|
|
player.cardSet.add(card.id + '');
|
|
}
|
|
return cards;
|
|
},
|
|
/**
|
|
* 检查出牌是否符合规则
|
|
* @param cardsLst
|
|
*/
|
|
checkDiscard(cardsLst: Card[]) {
|
|
if (cardsLst.length == 0 || cardsLst.length == 2) {
|
|
return false
|
|
} else if (cardsLst.length == 1) {
|
|
return true;
|
|
}
|
|
let numSet: number[] = [];
|
|
cardsLst.forEach(function (value) {
|
|
if (value.number < 11) {
|
|
numSet.push(value.number);
|
|
}
|
|
});
|
|
if (numSet.length === 1) {
|
|
return true;
|
|
}
|
|
if (numSet.length < 3) {
|
|
return false;
|
|
}
|
|
numSet.sort((a, b) => {
|
|
return a - b;
|
|
});
|
|
let preNum;
|
|
let sequence = true; //是否是顺序
|
|
let same = true; //是否是相同
|
|
for (let num of numSet) {
|
|
if (preNum) {
|
|
if (num !== (preNum + 1) && sequence) {
|
|
sequence = false;
|
|
}
|
|
if (num !== preNum && same) {
|
|
same = false;
|
|
}
|
|
if (!sequence && !same) {
|
|
return false;
|
|
}
|
|
}
|
|
preNum = num;
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
export default gameUtil;
|