unsigned int Scopa::strategyPlay(std::function<Card()> strategyCard, std::function<CardGroup(std::vector<CardGroup>)> strategyCapture) { Card cardToPlay = strategyCard(); std::vector<CardGroup> captures = possibleCaptures(cardToPlay.value); if( captures.size() == 0 ) { return playCard(currentTurn, cardToPlay, CardGroup()); } else if( captures.size() == 1 ) { return playCard(currentTurn, cardToPlay, captures.front()); } else { return playCard(currentTurn, cardToPlay, strategyCapture(captures)); } }
CardGroup Scopa::chooseBestCapture(std::vector<CardGroup> captures, std::function<float(CardGroup)> evaluationFun) { if(captures.empty()) { return CardGroup(); } CardGroup* best = &captures.front(); float bestValue = evaluationFun(*best); for(std::vector<CardGroup>::iterator it = captures.begin() + 1; it != captures.end(); it++) { float currentValue = evaluationFun(*it); if(currentValue > bestValue) { bestValue = currentValue; best = &*it; } } return *best; }
std::vector<CardGroup> Scopa::possibleCapturesAux(unsigned int val) { std::vector<CardGroup> result; for(CardGroup::iterator cardIt = std::prev(table.end()); cardIt != std::prev(table.begin()); cardIt--) { std::vector<CardGroup> cgToAdd; for(std::vector<CardGroup>::iterator resIt = result.begin(); resIt != result.end(); resIt++) { if(resIt->sumValue() + cardIt->value <= val) { CardGroup tmpCg = *resIt; tmpCg.insert(*cardIt); cgToAdd.push_back(tmpCg); } } result.insert(result.end(),cgToAdd.begin(),cgToAdd.end()); CardGroup tmpCg = CardGroup(); tmpCg.insert(*cardIt); result.push_back(tmpCg); } return result; }
#include "NiuNiuPeerCard.h" #ifndef SERVER #include "cocos2d.h" #include <iostream> #include "Language.h" USING_NS_CC; #endif CNiuNiuPeerCard::CNiuNiuPeerCard(){ m_nAddIdx = 0; m_eType = Niu_Max; } CNiuNiuPeerCard::CardGroup CNiuNiuPeerCard::s_CardGroup[10] = { CardGroup(0,1,2,3,4), CardGroup(0,2,1,3,4), CardGroup(0,3,1,2,4), CardGroup(0,4,1,2,3), CardGroup(1,2,0,3,4), CardGroup(1,3,0,2,4), CardGroup(1,4,0,2,3), CardGroup(2,3,0,1,4), CardGroup(2,4,0,1,3), CardGroup(3,4,0,1,2) } ; void CNiuNiuPeerCard::addCompositCardNum( uint8_t nCardCompositNum ) { assert( (m_nAddIdx < NIUNIU_HOLD_CARD_COUNT) && "too many cards" ) ; m_vHoldCards[m_nAddIdx].RsetCardByCompositeNum(nCardCompositNum) ;