97 lines
4.8 KiB
C++
97 lines
4.8 KiB
C++
#ifndef AndroidLogic_h__
|
|
#define AndroidLogic_h__
|
|
#pragma once
|
|
|
|
#include "GameLogic.h"
|
|
|
|
#define MAX_TYPE_COUNT 254
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
//出牌类型结果
|
|
struct tagOutCardTypeResult
|
|
{
|
|
BYTE cbCardType; //扑克类型
|
|
BYTE cbCardTypeCount; //牌型数目
|
|
BYTE cbEachHandCardCount[MAX_TYPE_COUNT]; //每手个数
|
|
BYTE cbEachHandCardData[MAX_TYPE_COUNT][MAX_COUNT]; ///每手数据
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
class CAndroidLogic : public CGameLogic
|
|
{
|
|
//AI变量
|
|
public:
|
|
WORD m_wBankerUser; //地主玩家
|
|
LONG m_lBankerOutCardCount; //出牌次数
|
|
BYTE m_cbHandCardData[GAME_PLAYER][MAX_COUNT]; //所有扑克
|
|
BYTE m_cbHandCardCount[GAME_PLAYER]; //扑克数目
|
|
BYTE m_cbBackCardData[BACK_COUNT]; //底牌
|
|
BYTE m_cbAllCardOutCount[18]; //出牌记录 0,1,2下标不用
|
|
|
|
public:
|
|
//构造函数
|
|
CAndroidLogic(void);
|
|
//析构函数
|
|
~CAndroidLogic(void);
|
|
|
|
public:
|
|
//重置变量
|
|
void ResetAllData(bool bConstruct=false);
|
|
//设置庄家
|
|
void SetBankerUser(const WORD wBankerUser);
|
|
//设置扑克
|
|
void SetUserCard(const WORD wChairID, const BYTE cbCardData[], const BYTE cbCardCount);
|
|
//设置底牌
|
|
void SetBackCard(const BYTE cbCardData[], const BYTE cbCardCount);
|
|
//设置底牌
|
|
void SetBackCard(const WORD wChairID, const BYTE cbCardData[], const BYTE cbCardCount);
|
|
//删除扑克
|
|
void RemoveUserCard(const WORD wChairID, const BYTE cbRemoveCardData[], const BYTE cbRemoveCardCount);
|
|
//叫分判断
|
|
BYTE LandScore(const WORD wMeChairID, const BYTE cbCurrentLandScore);
|
|
|
|
//辅助函数
|
|
public:
|
|
//组合算法
|
|
void Combination(BYTE cbCombineCardData[], BYTE cbResComLen, BYTE cbResultCardData[254][5], BYTE &cbResCardLen, BYTE cbSrcCardData[], BYTE cbCombineLen1, BYTE cbSrcLen, const BYTE cbCombineLen2);
|
|
//排列算法
|
|
void Permutation(BYTE *list, int m, int n, BYTE result[][4], BYTE &len);
|
|
//最大牌型判断
|
|
bool IsLargestCard(const WORD wChairID, const BYTE cbWantOutCardData[], const BYTE cbWantOutCardCount);
|
|
//排除炸弹,一定是最大牌型
|
|
bool IsLargestCardWithOutBomb(const WORD wMeChairID, const BYTE cbWantOutCardData[], const BYTE cbWantOutCardCount);
|
|
//分析四带二牌型
|
|
void Analyse4D2CardType(const WORD wMeChairID, const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbHandCardType, tagOutCardResult &OutCardResult);
|
|
//分析只剩一张牌时的出牌策略
|
|
void AnalyseEnemyLastOneCard(const WORD wMeChairID, const BYTE cbHandCardData[], const BYTE cbHandCardCount, const tagOutCardTypeResult CardTypeResult[13], tagOutCardResult &OutCardResult);
|
|
//分析只剩两张牌时的出牌策略
|
|
void AnalyseEnemyLastTwoCard(const WORD wMeChairID, const BYTE cbHandCardData[], const BYTE cbHandCardCount, const tagOutCardTypeResult CardTypeResult[13], tagOutCardResult &OutCardResult);
|
|
|
|
//主要函数
|
|
protected:
|
|
//分析牌型(后出牌调用)
|
|
void AnalyseOutCardType(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, tagOutCardTypeResult OutCardTypeResult[12+1]);
|
|
//分析牌牌(先出牌调用)
|
|
void AnalyseOutCardType(const BYTE cbHandCardData[], const BYTE cbHandCardCount, tagOutCardTypeResult OutCardTypeResult[12+1]);
|
|
//分析单牌个数
|
|
BYTE AnalyseSinleCardCount(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbWantOutCardData[], const BYTE cbWantOutCardCount, BYTE cbSingleCardData[]=NULL);
|
|
|
|
//出牌函数
|
|
public:
|
|
//出牌搜索
|
|
bool SearchOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, const WORD wMeChairID, const WORD wOutCardUser, tagOutCardResult &OutCardResult);
|
|
//地主出牌(先出牌)
|
|
void BankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const WORD wMeChairID, tagOutCardResult &OutCardResult);
|
|
//地主出牌(后出牌)
|
|
void BankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, const WORD wMeChairID, const WORD wOutCardUser, tagOutCardResult &OutCardResult);
|
|
//地主上家(先出牌)
|
|
void UpsideOfBankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const WORD wMeChairID, tagOutCardResult &OutCardResult);
|
|
//地主上家(后出牌)
|
|
void UpsideOfBankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, const WORD wMeChairID, const WORD wOutCardUser, tagOutCardResult &OutCardResult);
|
|
//地主下家(先出牌)
|
|
void UndersideOfBankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const WORD wMeChairID, tagOutCardResult &OutCardResult);
|
|
//地主下家(后出牌)
|
|
void UndersideOfBankerOutCard(const BYTE cbHandCardData[], const BYTE cbHandCardCount, const BYTE cbTurnCardData[], const BYTE cbTurnCardCount, const WORD wMeChairID, const WORD wOutCardUser, tagOutCardResult &OutCardResult);
|
|
};
|
|
|
|
#endif // AndroidLogic_h__
|