Files
2026-03-03 13:56:44 +08:00

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__