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;
}
Beispiel #4
0
#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) ;