/** * getUseableCard - 获得牌手可行着法 * @card _OUT_: 返回可行着法 * @return: 返回可行着法数量 */ int BridgeModel::getUseableCard(int card[13]) { int num = 0; int player = getCurPlayer(); if (player == leader[turn]) {//领出 for (int i = 0; i < 13; i++) { if (handCard[player][i] != -1) { card[num++] = handCard[player][i]; } } } else { for (int i = 0; i < 13; i++) { if ((handCard[player][i] != -1) && (handCard[player][i] % 4 == historyCard[turn * 4][0] % 4)) { card[num++] = handCard[player][i]; } } if (num == 0) {//没有领出花色则任出一张 for (int i = 0; i < 13; i++) { if (handCard[player][i] != -1) { card[num++] = handCard[player][i]; } } } } return num; }
//生成局面标识 已出牌52bit:手牌52bit:明手牌52bit:定约花色3bit:当前轮已出牌信息18bit void BridgeModel::getInfoSet(char infoSet[INFOSETLEN]) { for (int i = 0; i < INFOSETLEN - 1; i++) { infoSet[i] = (char)64; } infoSet[INFOSETLEN - 1] = 0; int i, m, n, index; int historyNum = turn * 4 + num; for (i = 0; i < historyNum; i++) { index = historyCard[i][0]; m = index / INFOLEN; n = index % INFOLEN; infoSet[m] |= (1 << n); } int player = getCurPlayer(); for (int i = 0; i < 13; i++) { index = handCard[player][i] + 52; m = index / INFOLEN; n = index % INFOLEN; infoSet[m] |= (1 << n); } if (player == 2) { for (int i = 0; i < 13; i++) { index = handCard[0][i] + 104; m = index / INFOLEN; n = index % INFOLEN; infoSet[m] |= (1 << n); } } else { for (int i = 0; i < 13; i++) { index = handCard[2][i] + 104; m = index / INFOLEN; n = index % INFOLEN; infoSet[m] |= (1 << n); } } infoSet[INFOSETLEN - 5] |= stone; if (num == 3) { infoSet[INFOSETLEN - 2] |= historyCard[turn * 4 + 2][0]; infoSet[INFOSETLEN - 3] |= historyCard[turn * 4 + 1][0]; infoSet[INFOSETLEN - 4] |= historyCard[turn * 4][0]; } else if(num == 2) { infoSet[INFOSETLEN - 2] |= 52; infoSet[INFOSETLEN - 3] |= historyCard[turn * 4 + 1][0]; infoSet[INFOSETLEN - 4] |= historyCard[turn * 4][0]; } else if (num == 1) { infoSet[INFOSETLEN - 2] |= 52; infoSet[INFOSETLEN - 3] |= 52; infoSet[INFOSETLEN - 4] |= historyCard[turn * 4][0]; } else { infoSet[INFOSETLEN - 2] |= 52; infoSet[INFOSETLEN - 3] |= 52; infoSet[INFOSETLEN - 4] |= 52; } }
void Game::nextPlayer() { if(getCurHole()->tiles->at(getCurPlayer()->curTile-1)->tilePlane.distance(getCurPlayer()->pos) <= 0) { if(getCurPlayer()->velocity.length() < 0.00005f && getCurHole()->tiles->at(getCurPlayer()->curTile-1)->angle == 0) { getCurPlayer()->moving = false; getCurPlayer()->velocity.coords[1] = 0.0f; getCurPlayer()->speed = getCurPlayer()->startSpeed; curBall = (curBall+1) % numPlayers; } } }
//出牌 bool BridgeModel::lead(const int card) { int player = getCurPlayer(); for (int i = 0; i < 13; i++) { if (handCard[player][i] == card) { historyCard[turn * 4 + num][0] = card; historyCard[turn * 4 + num][1] = i; handCard[player][i] = -1; return true; } } return false; }
//恢复 bool BridgeModel::recover() { num--; if (num < 0) { if (leader[turn] % 2 == 0) { bankerPayoff--; } else { breakerPayoff--; } turn--; num = 3; } int player = getCurPlayer(); handCard[player][historyCard[turn * 4 + num][1]] = historyCard[turn * 4 + num][0]; return true; }