博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己写的一部分斗地主的程序,没有去写界面,临时是用黑框来显示的
阅读量:7066 次
发布时间:2019-06-28

本文共 22335 字,大约阅读时间需要 74 分钟。

这几天比較空,所以想写一点东西。

斗地主的程序一直以来都想写,但感觉规则推断比較复杂,一直没有较多的时间来写。

这次主要是把跟牌和牌型的推断写出来了。写了一个比較弱智的AI,属于有牌就出的那种。对于AI算法,临时没有什么好的想法,所以打算临时放一放。

后期补上界面之后再进行优化。

在这就把基本的函数和算法列出来吧。

首先是主程序,主要控制显示和游戏的流程。

#include 
#include "PokerDesk.h"using namespace std;int main(){ cout<<"-------------------------------------------"<

"<<endl; cin>>cContinue; } while (cContinue == 'Y' || cContinue == 'y'); return 1; }

初始化之后能够反复玩,统计积分。

接下来是牌桌的类。用到了boost库的format来控制string的格式。

头文件:

#pragma once#include "Card.h"#include "Player.h"#include 
#include
using namespace std;enum enPlayerId{ piLeft, piMiddle, piRight};enum enGameState{ gsContinue, gsLordLose, gsLordWin};class CPokerDesk{private: //上一手 enPlayerId m_piLastDiscard; //出牌人 enPlayerId m_piDiscard; //地主 enPlayerId m_piLord; //游戏状态 enGameState m_gsState; //该次分值 int m_nPoint;public: vector
m_lastCards; //玩家 vector
m_players; //牌库 vector
m_cards; //地主牌 vector
m_lordcards; CPokerDesk(void); ~CPokerDesk(void); void Reset(); void Shuffle(); void Deal(); bool Discard(); enGameState GetGameState(); void SetGameState(enGameState gsState); enPlayerId GetDiscardId(); void SetDiscardId(enPlayerId piTurn); void ShowPokerDesk(); void RobLord();};
实现文件:
#include "PokerDesk.h"#include 
#include
using namespace boost;CPokerDesk::CPokerDesk(void){ for(int i = 0; i < 54; i++) { CCard a((enCardName)i); m_cards.push_back(a); } CPlayer p1("Left",true),p2("Middle",false),p3("Right",true); m_players.push_back(p1); m_players.push_back(p2); m_players.push_back(p3); srand(time(NULL)); enPlayerId pi = enPlayerId(rand()%3); m_piDiscard = m_piLastDiscard = m_piLord = pi; m_gsState = gsContinue;}CPokerDesk::~CPokerDesk(void){}void CPokerDesk::Reset(){ m_lordcards.clear(); m_lastCards.clear(); for(int i = 0; i < 3; i++) m_players[i].m_handcards.clear(); m_gsState = gsContinue;}void CPokerDesk::Shuffle(){ srand(time(NULL)); /*srand(28);*/ random_shuffle(m_cards.begin(),m_cards.end());}void CPokerDesk::Deal(){ for(int i = 0; i < m_cards.size()/3-1; i++) { for(int j = 0; j < 3; j++) { m_players[j].m_handcards.push_back(m_cards[i*3+j]); } } for(int i = 0; i < 3; i++) sort(m_players[i].m_handcards.begin(),m_players[i].m_handcards.end()); for(int i = 0; i < 3; i++) m_lordcards.push_back(m_cards[m_cards.size()-i-1]);}bool CPokerDesk::Discard(){ vector
cards; if(m_piDiscard == m_piLastDiscard) { // vector
cardnull; do { m_players[m_piDiscard].Discard(cardnull,cards); } while (cards.empty()); m_lastCards.assign(cards.begin(),cards.end()); if(m_players[m_piDiscard].m_handcards.empty()) { if(m_piDiscard == m_piLord) { m_gsState = gsLordWin; for(int i = 0; i < 3; i++) { if(i == m_piLord) { m_players[i].m_nPoint += 2*m_nPoint; } else { m_players[i].m_nPoint -= m_nPoint; } } } else { m_gsState = gsLordLose; for(int i = 0; i < 3; i++) { if(i == m_piLord) { m_players[i].m_nPoint -= 2*m_nPoint; } else { m_players[i].m_nPoint += m_nPoint; } } } } m_piLastDiscard = m_piDiscard; m_piDiscard = enPlayerId((m_piDiscard+1)%3); return true; } m_players[m_piDiscard].Discard(m_lastCards,cards); if(!cards.empty()) { m_lastCards.assign(cards.begin(),cards.end()); if(m_players[m_piDiscard].m_handcards.empty()) { if(m_piDiscard == m_piLord) { m_gsState = gsLordWin; for(int i = 0; i < 3; i++) { if(i == m_piLord) { m_players[i].m_nPoint += 2*m_nPoint; } else { m_players[i].m_nPoint -= m_nPoint; } } } else { m_gsState = gsLordLose; for(int i = 0; i < 3; i++) { if(i == m_piLord) { m_players[i].m_nPoint -= 2*m_nPoint; } else { m_players[i].m_nPoint += m_nPoint; } } } } m_piLastDiscard = m_piDiscard; } //下家 m_piDiscard = enPlayerId((m_piDiscard+1)%3); return true;}enGameState CPokerDesk::GetGameState(){ return m_gsState;}void CPokerDesk::SetGameState(enGameState gsState){ m_gsState = gsState;}enPlayerId CPokerDesk::GetDiscardId(){ return m_piDiscard;}void CPokerDesk::SetDiscardId(enPlayerId piTurn){ m_piDiscard = piTurn;}void CPokerDesk::ShowPokerDesk(){ format fmt("%c%c %s %c%c"); format fmtm("| %2d |"); const string strHor = "--------------------"; const string strVer = "| |"; std::cout<<"-----------begin of the scene-------------"<
& piUsers,enPlayerId pi){ for(vector
::iterator it = piUsers.begin(); it != piUsers.end(); ++it) { if(*it == pi) { if(++it != piUsers.end()) { return *it; } else return piUsers[0]; } } return pi;}//移除一个void RemovePlayerId(vector
& piUsers,enPlayerId pi){ for(vector
::iterator it = piUsers.begin(); it != piUsers.end(); ++it) { piUsers.erase(it); break; }}void CPokerDesk::RobLord(){ m_nPoint = 1; vector
piUsers; piUsers.push_back(piLeft); piUsers.push_back(piMiddle); piUsers.push_back(piRight); enPlayerId piNow,piNext; piNow = piNext = m_piDiscard; for(int i = 0; i < 5&&piUsers.size() > 1; i++) { piNow = piNext; if(m_players[piNow].RobLord()) { m_piDiscard = m_piLastDiscard = m_piLord = piNow; m_nPoint = m_nPoint<<1; piNext=FindNextPlayerId(piUsers,piNext); } else { i--; piNext=FindNextPlayerId(piUsers,piNext); RemovePlayerId(piUsers,piNow); } cout<<"now the point is "<
<
写完这个还要加上玩家。我设计的是两个机器人和一个玩家

头文件:

#pragma once#include "Card.h"#include 
using namespace std;enum{nInitPoint=1000};class CPlayer{public: string m_strPlayerName; bool m_bAI; int m_nPoint; vector
m_handcards; CPlayer(string strName,bool bAI); CPlayer(void); ~CPlayer(void); void Discard(vector
& cardSet,vector
& cardResSet); void CreateCards(vector
& cardSet,vector
& cardResSet); bool RemovePart(vector
& cardSet); bool RobLord(); void CardTips(vector
& cardSet,vector
& cardResSet);};
实现文件:

#include "Player.h"#include "CardSet.h"#include 
#include
#include
CPlayer::CPlayer(void){ m_bAI = false; m_nPoint = nInitPoint; m_strPlayerName = "NoName";}CPlayer::CPlayer(string strName,bool bAI){ m_bAI = bAI; m_strPlayerName = strName; m_nPoint = nInitPoint;}CPlayer::~CPlayer(void){}//出牌推断void CPlayer::Discard(vector
& cardSet,vector
& cardResSet){ //须要大于 CreateCards(cardSet,cardResSet); if(cardResSet.empty()) return; //输入 CCardSet csLastCards(cardSet); CCardSet csMyCards(cardResSet); while(! (csLastCards < csMyCards&&RemovePart(cardResSet))) { CreateCards(cardSet,cardResSet); if(cardResSet.empty()) return; csMyCards = CCardSet(cardResSet); }}void CPlayer::CreateCards(vector
& cardSet,vector
& cardResSet){ if (m_bAI) { CCardSet csCards(cardSet),csCardsRes; do { cout<<"AI testing"<
>strCards; //remove invalid char cardResSet.clear(); if(strCards.find('P')!= string::npos) { csCardsRes.m_cards.clear(); csCardsRes.m_ctCardType = ctInvalid; continue; } //将字符串改为向量 for(int i = 0; i < strCards.size(); i++) { CCard card(strCards[i]); cardResSet.push_back(card); } csCardsRes = CCardSet(cardResSet); }while(!(csCards < csCardsRes || cardResSet.empty())); }}//将已出的部分从手牌中删除bool CPlayer::RemovePart(vector
& cardSet){ vector
dmCardSet; dmCardSet.assign(m_handcards.begin(),m_handcards.end()); for(vector
::iterator itc = cardSet.begin(); itc != cardSet.end(); ++itc) { bool bFind = false; for(vector
::iterator it = dmCardSet.begin(); it != dmCardSet.end(); ++it) { if(*it==*itc) { bFind = true; dmCardSet.erase(it); break; } } if(!bFind) { std::cout<<"error poker!"<

"<<endl; char c; cin>>c; if(c == 'y'||c=='Y') { cout<<m_strPlayerName<<" rob the lord"<<endl; return true; } else { cout<<m_strPlayerName<<" give up the lord"<<endl; return false; } } } void CPlayer::CardTips(vector<CCard>& cardSet,vector<CCard>& cardResSet) { cardResSet.clear(); if(cardSet.empty()) { //double line //line //triple CCardSet csHandCard(m_handcards); if(CCardSet::FindLeastCards(csHandCard.m_mapcards,3,cardResSet)) { csHandCard.m_mapcards.erase(csHandCard.m_mapcards.find(cardResSet[0])); //double if(CCardSet::FindLeastCards(csHandCard.m_mapcards,2,cardResSet)) { return; } //single if(CCardSet::FindLeastCards(csHandCard.m_mapcards,1,cardResSet)) { return; } return; } //double if(CCardSet::FindLeastCards(csHandCard.m_mapcards,2,cardResSet)) { return; } //single if(CCardSet::FindLeastCards(csHandCard.m_mapcards,1,cardResSet)) { return; } cardResSet.push_back(m_handcards[0]); } else { CCardSet csCard(cardSet); CCardSet csHandCard(m_handcards); CCardSet csResCard; if(!csHandCard.FindBigger(csCard,csResCard)&&csCard.m_ctCardType!=ctBoom&&csCard.m_ctCardType!=ctRooket) { if(!csHandCard.FindBoom(csResCard)) csHandCard.FindRooket(csResCard); } swap(cardResSet,csResCard.m_cards); } }

对于每张牌。我定义了一个类进行管理,主要是控制显示和牌的值

头文件:

#pragma onceenum enCardName{	cnBlk3,	cnRed3,	cnFlr3,	cnRct3,	cnBlk4,	cnRed4,	cnFlr4,	cnRct4,	cnBlk5,	cnRed5,	cnFlr5,	cnRct5,	cnBlk6,	cnRed6,	cnFlr6,	cnRct6,	cnBlk7,	cnRed7,	cnFlr7,	cnRct7,	cnBlk8,	cnRed8,	cnFlr8,	cnRct8,	cnBlk9,	cnRed9,	cnFlr9,	cnRct9,	cnBlk10,	cnRed10,	cnFlr10,	cnRct10,	cnBlkJ,	cnRedJ,	cnFlrJ,	cnRctJ,	cnBlkQ,	cnRedQ,	cnFlrQ,	cnRctQ,	cnBlkK,	cnRedK,	cnFlrK,	cnRctK,	cnBlkA,	cnRedA,	cnFlrA,	cnRctA,	cnBlk2,	cnRed2,	cnFlr2,	cnRct2,	cnjoker,	cnJoker,	cnNull};class CCard{private:	enCardName m_cnCardId; public:	char m_cCard;	CCard(enCardName cnId);	CCard(char cCard);	CCard(void);	~CCard(void);	bool operator<(const CCard& card)const;	bool operator==(const CCard& card)const;	bool IsNext(CCard card);};
实现文件:

#include "Card.h"CCard::CCard(){	m_cnCardId = cnNull;	m_cCard = '\0';}CCard::CCard(char cCard){	m_cCard = cCard;	switch(m_cCard)	{	case '3':		m_cnCardId = cnBlk3;		break;	case '4':		m_cnCardId = cnBlk4;		break;	case '5':		m_cnCardId = cnBlk5;		break;	case '6':		m_cnCardId = cnBlk6;		break;	case '7':		m_cnCardId = cnBlk7;		break;	case '8':		m_cnCardId = cnBlk8;		break;	case '9':		m_cnCardId = cnBlk9;		break;	case '0':		m_cnCardId = cnBlk10;		break;	case 'J':		m_cnCardId = cnBlkJ;		break;	case 'Q':		m_cnCardId = cnBlkQ;		break;	case 'K':		m_cnCardId = cnBlkK;		break;	case 'A':		m_cnCardId = cnBlkA;		break;	case '2':		m_cnCardId = cnBlk2;		break;	case 'z':		m_cnCardId = cnjoker;		break;	case 'Z':		m_cnCardId = cnJoker;		break;	}}CCard::CCard(enCardName cnId){	m_cnCardId = cnId;	switch(m_cnCardId)	{	case cnBlk3:	case cnRed3:	case	cnFlr3:	case	cnRct3:		m_cCard = '3';		break;	case	cnBlk4:	case 	cnRed4:	case	cnFlr4:	case	cnRct4:		m_cCard = '4';		break;	case 	cnBlk5:	case 	cnRed5:	case	cnFlr5:	case	cnRct5:		m_cCard = '5';		break;	case	cnBlk6:	case	cnRed6:	case	cnFlr6:	case	cnRct6:		m_cCard = '6';		break;	case	cnBlk7:	case	cnRed7:	case	cnFlr7:	case	cnRct7:		m_cCard = '7';		break;	case	cnBlk8:	case	cnRed8:	case	cnFlr8:	case	cnRct8:		m_cCard = '8';		break;	case	cnBlk9:	case	cnRed9:	case	cnFlr9:	case	cnRct9:		m_cCard = '9';		break;	case	cnBlk10:	case	cnRed10:	case	cnFlr10:	case	cnRct10:		m_cCard = '0';		break;	case	cnBlkJ:	case	cnRedJ:	case	cnFlrJ:	case	cnRctJ:		m_cCard = 'J';		break;	case	cnBlkQ:	case	cnRedQ:	case	cnFlrQ:	case	cnRctQ:		m_cCard = 'Q';		break;	case	cnBlkK:	case	cnRedK:	case	cnFlrK:	case	cnRctK:		m_cCard = 'K';		break;	case	cnBlkA:	case	cnRedA:	case	cnFlrA:	case	cnRctA:		m_cCard = 'A';		break;	case	cnBlk2:	case	cnRed2:	case	cnFlr2:	case	cnRct2:		m_cCard = '2';		break;	case	cnjoker:		m_cCard = 'z';		break;	case	cnJoker:		m_cCard = 'Z';		break;	default:		m_cCard = '?';	}}CCard::~CCard(void){}bool CCard::operator<(const CCard& card) const{	return m_cnCardId < card.m_cnCardId;}bool CCard::operator==(const CCard& card)const{	return m_cCard == card.m_cCard;}bool CCard::IsNext(CCard card){	if(card.m_cnCardId >= cnBlk2)		return false;	if (card.m_cnCardId/4 - m_cnCardId/4 == 1)		return true;	return false;}
最后是比較关键的牌型的推断,写得比較多,在推断跟牌上还没有写完,仅仅写了常见的几种牌型。像飞机和4带2就没有写。

头文件:

#pragma once#include "Card.h"#include 
#include
using namespace std;enum enCardType{ ctSingle, ctDouble, ctTriple, ctTripleWithSingle, ctTripleWithDouble, ctPlane, ctSinglePlane, ctDoublePlane, ctLine, ctDoubleLine, ctBoom, ctRooket, ctQuatraWithTwo, ctQuatraWithTwoDouble, ctInvalid};class CCardSet{public: enCardType m_ctCardType; vector
m_cards; map
m_mapcards; CCard m_cardmain; CCardSet(vector
& cards); CCardSet(void); ~CCardSet(void); bool operator<(const CCardSet& cardset) const; bool IsValid(); enCardType GetCardType(); bool FindBigger(CCardSet& cardset,CCardSet& cardsetbig); bool FindBoom(CCardSet& cardsetbig); bool FindRooket(CCardSet& cardsetbig); bool IsLine(vector
& cards); static bool FindLeastCards(map
& cardmap,int nCount,vector
& cardset);};
实现文件:
#include "CardSet.h"#include 
CCardSet::CCardSet(vector
& cards){ if(cards.empty()) { m_ctCardType = ctInvalid; return; } m_cards.assign(cards.begin(),cards.end()); for(vector
::iterator it = m_cards.begin(); it != m_cards.end(); ++it) { CCard tmpcard(it->m_cCard); map
::iterator l_it = m_mapcards.find(tmpcard); if(l_it == m_mapcards.end()) { m_mapcards.insert(pair
(tmpcard,1)); } else { l_it->second++; } } m_ctCardType = GetCardType(); m_cardmain = m_mapcards.begin()->first; int nCount = m_mapcards.begin()->second; for(map
::iterator l_it = m_mapcards.begin();l_it != m_mapcards.end(); l_it++) { if(nCount < l_it->second) m_cardmain = l_it->first; }}CCardSet::CCardSet(void){ m_cards.clear(); m_ctCardType = ctInvalid;}CCardSet::~CCardSet(void){}bool CCardSet::operator<(const CCardSet& cardset) const{ if(cardset.m_ctCardType != ctInvalid&&m_cards.empty()) return true; if(cardset.m_ctCardType == ctInvalid||m_ctCardType == ctInvalid) return false; if(cardset.m_cards.empty()) return false; if(m_cards.empty()) return true; if (cardset.m_ctCardType == ctRooket) return true; if(m_ctCardType == ctRooket) return false; if(cardset.m_ctCardType == ctBoom && m_ctCardType != ctBoom) return true; if(cardset.m_ctCardType != ctBoom && m_ctCardType == ctBoom) return false; if(cardset.m_ctCardType != m_ctCardType) return false; if(cardset.m_cards.size() != m_cards.size()) return false; if(m_cardmain < cardset.m_cardmain) return true; else return false;}bool CCardSet::IsValid(){ if(m_ctCardType != ctInvalid) return true; else return false;}enCardType CCardSet::GetCardType(){ if(m_cards.size() == 1) return ctSingle; map
mapCards; for(vector
::iterator it = m_cards.begin(); it != m_cards.end(); ++it) { map
::iterator l_it = mapCards.find(it->m_cCard); if(l_it == mapCards.end()) { mapCards.insert(pair
(it->m_cCard,1)); } else { l_it->second++; } } int nCount[4] = {0}; for(map
::iterator l_it = mapCards.begin(); l_it != mapCards.end(); ++l_it) { nCount[l_it->second-1]++; } if (nCount[3] > 1) return ctInvalid; if(nCount[3] == 1) { if(nCount[0] == 0&&nCount[1] == 0&&nCount[2] == 0) return ctBoom; if(nCount[0] == 2&&nCount[1] == 0&&nCount[2] == 0) return ctQuatraWithTwo; if(nCount[0] == 0&&nCount[1] == 2&&nCount[2] == 0) return ctQuatraWithTwoDouble; return ctInvalid; } if(nCount[2] > 1) { vector
tricard; for(map
::iterator l_it = mapCards.begin(); l_it != mapCards.end(); ++l_it) { if(l_it->second == 3) { CCard card(l_it->first); tricard.push_back(card); } } bool bLine = IsLine(tricard); if(bLine&&nCount[0] == 0&&nCount[1] == 0) return ctPlane; if(bLine&&nCount[0] == nCount[2]&&nCount[1] == 0) return ctSinglePlane; if(bLine&&nCount[0] == 0&&nCount[1] == nCount[2]) return ctDoublePlane; return ctInvalid; } if(nCount[2] == 1) { if(nCount[0] == 0&&nCount[1] == 0) return ctTriple; if(nCount[0] == 1&&nCount[1] == 0) return ctTripleWithSingle; if(nCount[0] == 0&&nCount[1] == 1) return ctTripleWithDouble; return ctInvalid; } if (nCount[1] > 1) { if (nCount[0] > 0) return ctInvalid; if(nCount[1] == 2) return ctInvalid; //line vector
doucard; for(map
::iterator l_it = mapCards.begin(); l_it != mapCards.end(); ++l_it) { if(l_it->second == 3) { CCard card(l_it->first); doucard.push_back(card); } } bool bLine = IsLine(doucard); if(bLine) return ctDoubleLine; return ctInvalid; } if (nCount[1] == 1) { if(nCount[0] == 0) return ctDouble; if (nCount[0] > 0) return ctInvalid; } if(nCount[0] > 1) { if(nCount[0] == 2&&m_cards[0].m_cCard == 'z'&&m_cards[1].m_cCard == 'Z') return ctRooket; if(nCount[0] < 5) return ctInvalid; bool bLine = IsLine(m_cards); if(bLine) return ctLine; return ctInvalid; } if(nCount[0] == 1) return ctSingle; return ctInvalid;}//bool CCardSet::FindBigger(CCardSet& cardset,CCardSet& cardsetbig){ if(cardset.m_ctCardType == ctInvalid) return false; map
mapCards; for(vector
::iterator it = m_cards.begin(); it != m_cards.end(); ++it) { CCard tmpcard(it->m_cCard); map
::iterator l_it = mapCards.find(tmpcard); if(l_it == mapCards.end()) { mapCards.insert(pair
(tmpcard,1)); } else { l_it->second++; } } switch(cardset.m_ctCardType) { case ctSingle: for(int i = 1; i < 4; i++) { for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(it->second == i) { CCard tmpCard = it->first; if(cardset.m_cardmain.m_cCard != tmpCard.m_cCard && cardset.m_cardmain < tmpCard) { vector
tmpCards; tmpCards.push_back(tmpCard); cardsetbig = CCardSet(tmpCards); return true; } } } } break; case ctDouble: for(int i = 2; i < 4; i++) { for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(it->second == i) { CCard tmpCard = it->first; if(cardset.m_cardmain.m_cCard != tmpCard.m_cCard && cardset.m_cardmain < tmpCard) { vector
tmpCards; for(int j = 0;j < 2; j++) tmpCards.push_back(tmpCard); cardsetbig = CCardSet(tmpCards); return true; } } } } break; case ctTriple: for(map
::iterator it = mapCards.begin(); it != mapCards.end();) { if(it->second != 3) { it = mapCards.erase(it); } else ++it; } for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(cardset.m_cardmain < it->first) { CCard tmpCard = it->first; vector
tmpCards; for(int j = 0;j < 3; j++) tmpCards.push_back(tmpCard); cardsetbig = CCardSet(tmpCards); return true; } } break; case ctTripleWithSingle: for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(it->second == 3&&cardset.m_cardmain < it->first) { CCard tmpCard = it->first; vector
tmpCards; for(int j = 0;j < 3; j++) tmpCards.push_back(tmpCard); mapCards.erase(it); if(FindLeastCards(mapCards,1,tmpCards)) { cardsetbig = CCardSet(tmpCards); return true; } else { return false; } } } break; case ctTripleWithDouble: for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(it->second == 3&&cardset.m_cardmain < it->first) { CCard tmpCard = it->first; vector
tmpCards; for(int j = 0;j < 3; j++) tmpCards.push_back(tmpCard); mapCards.erase(it); if(FindLeastCards(mapCards,2,tmpCards)) { cardsetbig = CCardSet(tmpCards); return true; } else return false; } } break; case ctPlane: case ctSinglePlane: case ctDoublePlane: break; case ctLine: for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(cardset.m_cardmain < it->first) { map
::iterator it2 = it; it2++; int i = 1; CCard lastcard(it->first); vector
cards; cards.push_back(it->first); for(; i < cardset.m_cards.size()&&it2!=mapCards.end(); ++it2,++i) { cards.push_back(it2->first); if(!lastcard.IsNext(it2->first)) break; lastcard = it2->first; } if(i == cardset.m_cards.size()) { cardsetbig = CCardSet(cards); return true; } } } break; case ctDoubleLine: for(map
::iterator it = mapCards.begin(); it != mapCards.end();) { if(it->second == 1||it->second == 4) { it = mapCards.erase(it); } else ++it; } for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(cardset.m_cardmain < it->first) { map
::iterator it2 = it; it2++; int i = 1; CCard lastcard(it->first); vector
cards; for(int j = 0; j < 2; j++) cards.push_back(it->first); for(; i < cardset.m_cards.size()/2&&it2!=mapCards.end(); ++it2,++i) { for(int j = 0; j < 2; j++) cards.push_back(it2->first); if(!lastcard.IsNext(it2->first)) break; lastcard = it2->first; } if(i == cardset.m_cards.size()/2) { cardsetbig = CCardSet(cards); return true; } } } break; case ctBoom: for(map
::iterator it = mapCards.begin(); it != mapCards.end();) { if(it->second < 4) { it = mapCards.erase(it); } else ++it; } for(map
::iterator it = mapCards.begin(); it != mapCards.end(); ++it) { if(cardset.m_cardmain < it->first) { CCard tmpCard = it->first; vector
tmpCards; for(int j = 0;j < 4; j++) tmpCards.push_back(tmpCard); cardsetbig = CCardSet(tmpCards); return true; } } return false; case ctRooket: return false; case ctQuatraWithTwo: case ctQuatraWithTwoDouble: break; } return false;}bool CCardSet::IsLine(vector
& cards){ sort(cards.begin(),cards.end()); bool bLine = true; for(vector
::iterator it = cards.begin(); it != cards.end(); ++it) { if( it+1 != cards.end()) if(!it->IsNext(*(it+1))) bLine = false; } return bLine;}bool CCardSet::FindBoom(CCardSet& cardsetbig){ map
mapCards; for(vector
::iterator it = m_cards.begin(); it != m_cards.end(); ++it) { CCard tmpcard(it->m_cCard); map
::iterator l_it = mapCards.find(tmpcard); if(l_it == mapCards.end()) { mapCards.insert(pair
(tmpcard,1)); } else { l_it->second++; } } for(map
::iterator it = mapCards.begin(); it != mapCards.end();) { if(it->second < 4) { it = mapCards.erase(it); } else ++it; } if(mapCards.size() > 0) { cardsetbig.m_cards.push_back(mapCards.begin()->first); cardsetbig.m_cards.push_back(mapCards.begin()->first); cardsetbig.m_cards.push_back(mapCards.begin()->first); cardsetbig.m_cards.push_back(mapCards.begin()->first); return true; } return false;}bool CCardSet::FindRooket(CCardSet& cardsetbig){ int nSize = m_cards.size(); if(nSize < 2) return false; if(m_cards[nSize-1].m_cCard == 'Z'&&m_cards[nSize-2].m_cCard == 'z') { cardsetbig.m_cards.push_back(m_cards[nSize-2].m_cCard); cardsetbig.m_cards.push_back(m_cards[nSize-1].m_cCard); } return false;}bool CCardSet::FindLeastCards(map
& cardmap,int nCount,vector
& cardset){ for(int i = nCount; i < 4; i++) { for(map
::iterator it = cardmap.begin(); it != cardmap.end();++it) { if (it->second == i) { for(int j = 0; j < nCount; j++) { cardset.push_back(it->first); } return true; } } } return false;}

转载地址:http://sdxll.baihongyu.com/

你可能感兴趣的文章
SolrCould 集群搭建
查看>>
IDEA Git版本回滚提交方式
查看>>
tomcat中同时启动两个项目出现内存不足的错误提示解决办法
查看>>
ssm框架开发过程中遇到的一错误以及解决问题提示
查看>>
树的遍历
查看>>
Akka2使用探索6(Futures)——实现并发和异步
查看>>
【持续更新】jQuery 实用技巧
查看>>
大象也能起舞,Citrix X1计划让你对笔记本电脑say good bye
查看>>
Nginx 之常见报错问题解决
查看>>
linux 防爆破方法
查看>>
2、通过ipmitool工具修改IPMI的WEB密码
查看>>
云盘关闭,教你用蒲公英搭建私有云
查看>>
Spring Cloud 入门教程5、服务容错监控:Hystrix Dashboard
查看>>
很好的学习平台
查看>>
hibernate学习笔记3
查看>>
SQL Server 2005 日常运维检查操作手册
查看>>
利用jquery和jsonp来获取跨站数据,并实现cookie共享
查看>>
我的友情链接
查看>>
写sql语句时将时间格式“20110725”转化为格式2012年07月25日
查看>>
[Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
查看>>