#ifndef _ANDROIDAI_H_ #define _ANDROIDAI_H_ #pragma once #include "GameLogic.h" class CAndroidAIBase { public: CAndroidAIBase(); ~CAndroidAIBase(); //设置牌 void SetCardData( const BYTE cbCardData[],BYTE byCardCount, tagWeaveItem wi[MAX_WEAVE], BYTE cbWeaveCount ); //获取最差牌 BYTE GetBadlyCard(); //获取最大分 int GetMaxScore(); //思考 virtual void Think()=NULL; protected: //组合是否是边 bool IsEdge( BYTE byCard1,BYTE byCard2 ); //搜索相同牌 bool SearchSameCard( BYTE byCardData,BYTE &byIndex1,BYTE &byIndex2 ); //搜索连牌 bool SearchLinkCard( BYTE byCardData,BYTE &byIndex1,BYTE &byIndex2 ); //搜索两只同牌 bool SearchSameCardRemain( BYTE byCardData,BYTE &byIndex,BYTE byStart ); //搜索有卡连牌 bool SearchLinkCardRemain( BYTE byCardData,BYTE byLinkType,BYTE &byIndex,BYTE byStart ); //搜索牌 BYTE FindIndex( BYTE byCardData,BYTE byStart = 0 ); //在移除最佳三只后搜索牌 BYTE FindIndexRemain( BYTE byCardData,BYTE byStart = 0 ); public: //移除牌 bool RemoveCard( BYTE byCardIndex ); //移除牌值 bool RemoveCardData( BYTE byCardData ); protected: BYTE m_byCardData[MAX_COUNT]; //原始牌 BYTE m_byCardCount; //原始牌数 bool m_bSelect[MAX_COUNT]; //牌是否被选择 BYTE m_byThreeCard[MAX_COUNT]; //三张牌组合 BYTE m_byThreeCount; //三张牌组合数 BYTE m_byGoodThreeCard[MAX_COUNT]; //最佳三张牌组合 BYTE m_byGoodThreeCount; //最佳三张牌组合数 BYTE m_byTwoCard[MAX_COUNT]; //两只牌组合 BYTE m_byTwoCount; //两只牌组合数 BYTE m_byGoodTwoCard[MAX_COUNT]; //最佳两只牌组合 BYTE m_byGoodTwoCount; //最佳两只牌组合数 BYTE m_byRemainThree[MAX_COUNT]; //移去最佳三只组合后的牌 BYTE m_byRemainThreeCount; //移去最佳三只组合后的牌数 BYTE m_byRemainTwo[MAX_COUNT]; //移去最佳三只组合及两只组合后的牌 BYTE m_byRemainTwoCount; //移去最佳三只组合及两只组合后的牌数 int m_nMaxScoreThree; //最佳三只牌组合分数 int m_nMaxScoreTwo; //最佳两只牌组合分数 int m_nActionScore; //模拟操作得分 int m_nScoreThree; //临时三只牌组合分数 int m_nScoreTwo; //临时两只牌组合分数 bool m_bHaveJiang; //是否有将 BYTE m_byBadlyCard; //最差牌 //胡牌限制条件 BYTE m_cbColorCount; //花色数目 BYTE m_cbColor[4]; //花色数目 BYTE m_cbMinColorCount; //最少花色 }; class CAndroidAI:public CAndroidAIBase { public: CAndroidAI(void); ~CAndroidAI(void); //思考 virtual void Think(); //从最佳三只牌组合中搜索最差牌 BYTE GetBadlyIn3Card(); //从最佳两只牌组合中搜索最差牌 BYTE GetBadlyIn2Card(); //设置禁止出的牌 void SetEnjoinOutCard( const BYTE cbEnjoinOutCard[],BYTE cbEnjoinOutCount ); //模拟操作 void SetAction( BYTE byActionMask,BYTE byActionCard ); //重置得分 void ResetScore(); protected: //加权 int AddScore( BYTE byCardData ); //分析三只 void AnalyseThree(); //分析两只 void AnalyseTwo(); //分析单只 void AnalyseOne(); //从两只组合中分析 void SearchTwo(); //判断牌是否禁止出 bool IsEnjoinOutCard( BYTE byCard ); protected: BYTE m_byEnjoinOutCard[MAX_COUNT]; //禁止出的牌 BYTE m_byEnjoinOutCount; //禁止出的牌数 }; #endif