card_svr/src/utils/game.util.ts

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;