两幅斗地主【源码】
http://img.woaidaima.com//upload/image/20170512/1494568484781027542.jpghttp://img.woaidaima.com//upload/image/20170512/1494568486313084609.jpg#ifndef GAME_LOGIC_HEAD_FILE#define GAME_LOGIC_HEAD_FILE
#pragma once
#include "Stdafx.h"
//////////////////////////////////////////////////////////////////////////
//排序类型
#define ST_ORDER 0 //大小排序
#define ST_COUNT 1 //数目排序
//////////////////////////////////////////////////////////////////////////
//数目定义
#define MAX_COUNT 33 //最大数目
#define FULL_COUNT 108 //全牌数目
#define GOOD_CARD_COUTN 76 //好牌数目
#define BACK_COUNT 8 //底牌数目
#define NORMAL_COUNT 25 //常规数目
//////////////////////////////////////////////////////////////////////////
//数值掩码
#define MASK_COLOR 0xF0 //花色掩码
#define MASK_VALUE 0x0F //数值掩码
//扑克类型
#define CT_ERROR 0 //错误类型
#define CT_SINGLE 1 //单牌类型
#define CT_DOUBLE 2 //对牌类型
#define CT_THREE 3 //三条类型
#define CT_SINGLE_LINE 4 //单连类型
#define CT_DOUBLE_LINE 5 //对连类型
#define CT_THREE_LINE 6 //三连类型
#define CT_THREE_LINE_TAKE_ONE 7 //三带一单
#define CT_THREE_LINE_TAKE_TWO 8 //三带一对
#define CT_FOUR_LINE_TAKE_ONE 9 //四带两单
#define CT_FOUR_LINE_TAKE_TWO 10 //四带两对
#define CT_BOMB_CARD 11 //炸弹类型
#define CT_MISSILE_CARD 12 //火箭类型
//////////////////////////////////////////////////////////////////////////
//分析结构
struct tagAnalyseResult
{
BYTE cbEightCount; //八张数目
BYTE cbSevenCount; //七张数目
BYTE cbSixCount; //六张数目
BYTE cbFiveCount; //五张数目
BYTE cbFourCount; //四张数目
BYTE cbThreeCount; //三张数目
BYTE cbDoubleCount; //两张数目
BYTE cbSignedCount; //单张数目
BYTE cbEightCardData; //八张扑克
BYTE cbSevenCardData; //七张扑克
BYTE cbSixCardData; //六张扑克
BYTE cbFiveCardData; //五张扑克
BYTE cbFourCardData; //四张扑克
BYTE cbThreeCardData; //三张扑克
BYTE cbDoubleCardData; //两张扑克
BYTE cbSignedCardData; //单张扑克
};
//分布信息
struct tagDistributing
{
BYTE cbCardCount; //扑克数目
BYTE cbDistributing; //分布信息
};
//出牌结果
struct tagOutCardResult
{
BYTE cbCardCount; //扑克数目
BYTE cbResultCard; //结果扑克
};
#define MAX_TYPE_COUNT 254
struct tagOutCardTypeResult
{
BYTE cbCardType; //扑克类型
BYTE cbCardTypeCount; //牌型数目
BYTE cbEachHandCardCount;//每手个数
BYTE cbCardData;//扑克数据
};
//扑克信息
struct tagHandCardInfo {
BYTE cbHandCardData[ MAX_COUNT ]; //扑克数据
BYTE cbHandCardCount; //扑克数目
tagOutCardTypeResult CardTypeResult[ 12 + 1 ] ; //分析数据
//初始数据
tagHandCardInfo( void ) {
ZeroMemory( cbHandCardData, sizeof( cbHandCardData ) ) ;
cbHandCardCount = 0;
ZeroMemory( CardTypeResult, sizeof( CardTypeResult ) );
}
};
//类型定义
typedef CWHArray< tagHandCardInfo * > tagHandCardInfoArray;
//栈结构
class tagStackHandCardInfo {
//内联函数
public:
//构造函数
tagStackHandCardInfo( void ) {
m_HandCardInfoFreeArray.RemoveAll();
m_HandCardInfoArray.RemoveAll();
}
//析构函数
~tagStackHandCardInfo( void ) {
//清空栈
ClearAll();
}
//元素压栈
void Push( tagHandCardInfo * pHandCardInfo ) {
//是否还有空间
if ( 0 < m_HandCardInfoFreeArray.GetCount() ) {
//获取空间
tagHandCardInfo * pHandCardInfoFree = m_HandCardInfoFreeArray[ 0 ];
m_HandCardInfoFreeArray.RemoveAt( 0 );
//元素赋值
CopyMemory( pHandCardInfoFree->cbHandCardData, pHandCardInfo->cbHandCardData, sizeof( pHandCardInfoFree->cbHandCardData ) );
pHandCardInfoFree->cbHandCardCount = pHandCardInfo->cbHandCardCount;
CopyMemory( pHandCardInfoFree->CardTypeResult, pHandCardInfo->CardTypeResult, sizeof( pHandCardInfo->CardTypeResult ) );
//压入栈顶
INT_PTR nECount = m_HandCardInfoArray.GetCount() ;
m_HandCardInfoArray.InsertAt( nECount, pHandCardInfoFree );
}
else {
//申请空间
tagHandCardInfo * pNewHandCardInfo = new tagHandCardInfo ;
//元素赋值
CopyMemory( pNewHandCardInfo->cbHandCardData, pHandCardInfo->cbHandCardData, sizeof( pNewHandCardInfo->cbHandCardData ) );
pNewHandCardInfo->cbHandCardCount = pHandCardInfo->cbHandCardCount;
CopyMemory( pNewHandCardInfo->CardTypeResult, pHandCardInfo->CardTypeResult, sizeof( pHandCardInfo->CardTypeResult ) );
//压入栈顶
INT_PTR nECount = m_HandCardInfoArray.GetCount() ;
m_HandCardInfoArray.InsertAt( nECount, pNewHandCardInfo );
}
}
//弹出栈顶
void Pop() {
//非空判断
if ( IsEmpty() ) return ;
//获取元素
INT_PTR nECount = m_HandCardInfoArray.GetCount() ;
tagHandCardInfo * pTopHandCardInfo = m_HandCardInfoArray.GetAt( nECount - 1 );
//移除元素
m_HandCardInfoArray.RemoveAt( nECount - 1 );
//保存空间
m_HandCardInfoFreeArray.Add( pTopHandCardInfo );
}
//初始栈
void InitStack() {
//保存空间
while ( 0 < m_HandCardInfoArray.GetCount() ) {
tagHandCardInfo *pHandCardInfo = m_HandCardInfoArray[ 0 ];
m_HandCardInfoArray.RemoveAt( 0 );
m_HandCardInfoFreeArray.Add( pHandCardInfo );
}
}
//清空栈
void ClearAll() {
//释放内存
while ( 0 < m_HandCardInfoArray.GetCount() ) {
tagHandCardInfo *pHandCardInfo = m_HandCardInfoArray[ 0 ];
delete pHandCardInfo;
pHandCardInfo = NULL;
m_HandCardInfoArray.RemoveAt( 0 );
}
//释放内存
while ( 0 < m_HandCardInfoFreeArray.GetCount() ) {
tagHandCardInfo *pHandCardInfo = m_HandCardInfoFreeArray[ 0 ];
delete pHandCardInfo;
pHandCardInfo = NULL;
m_HandCardInfoFreeArray.RemoveAt( 0 );
}
}
//获取栈顶
void GetTop( tagHandCardInfo * & pHandCardInfo ) {
//非空判断
if ( IsEmpty() ) {
ASSERT( false );
return;
}
//获取元素
INT_PTR nECount = m_HandCardInfoArray.GetCount() ;
pHandCardInfo = m_HandCardInfoArray[ nECount - 1 ];
}
//空判断
bool IsEmpty() {
return m_HandCardInfoArray.IsEmpty();
}
//成员变量
private:
tagHandCardInfoArray m_HandCardInfoFreeArray; //扑克信息
tagHandCardInfoArray m_HandCardInfoArray; //扑克信息
};
//////////////////////////////////////////////////////////////////////////
//游戏逻辑类
class CGameLogic
{
//变量定义
protected:
static const BYTE m_cbCardData; //扑克数据
static const BYTE m_cbGoodcardData; //好牌数据
//AI变量
public:
BYTE m_cbAllCardData;//所有扑克
BYTE m_cbLandScoreCardData; //叫牌扑克
BYTE m_cbUserCardCount; //扑克数目
WORD m_wBankerUser; //地主玩家
LONGLONG m_lBankerOutCardCount ; //出牌次数
tagStackHandCardInfo m_StackHandCardInfo; //栈变量
//函数定义
public:
//构造函数
CGameLogic();
//析构函数
virtual ~CGameLogic();
//类型函数
public:
//获取类型
BYTE GetCardType(const BYTE cbCardData[], BYTE cbCardCount);
//获取数值
BYTE GetCardValue(BYTE cbCardData) { return cbCardData&MASK_VALUE; }
//获取花色
BYTE GetCardColor(BYTE cbCardData) { return cbCardData&MASK_COLOR; }
//控制函数
public:
//混乱扑克
void RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount);
//得到好牌
void GetGoodCardData(BYTE cbGoodCardData) ;
//删除好牌
bool RemoveGoodCardData(BYTE cbGoodcardData, BYTE cbGoodCardCount, BYTE cbCardData, BYTE cbCardCount) ;
//排列扑克
void SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType);
//删除扑克
bool RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount);
//逻辑函数
public:
//有效判断
bool IsValidCard(BYTE cbCardData);
//逻辑数值
BYTE GetCardLogicValue(BYTE cbCardData);
//对比扑克
bool CompareCard(const BYTE cbFirstCard[], const BYTE cbNextCard[], BYTE cbFirstCount, BYTE cbNextCount);
//出牌搜索
bool SearchOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, const BYTE cbTurnCardData[], BYTE cbTurnCardCount, tagOutCardResult & OutCardResult);
//变幻扑克
bool MagicCardData(BYTE cbCardData[], BYTE cbCardCount, BYTE cbResultCard, BYTE cbCardType);
//分析分布
VOID AnalysebDistributing(const BYTE cbCardData[], BYTE cbCardCount, tagDistributing & Distributing);
//构造扑克
BYTE MakeCardData(BYTE cbValueIndex, BYTE cbColorIndex){return (cbColorIndex<<4)|(cbValueIndex+1);}
//内部函数
public:
//分析扑克
bool AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult);
//////////////////////////////////////////////////////////////////////////
//AI函数
//设置函数
public:
//设置扑克
void SetUserCard(WORD wChairID, BYTE cbCardData[], BYTE cbCardCount) ;
//设置底牌
void SetBackCard(WORD wChairID, BYTE cbBackCardData[], BYTE cbCardCount) ;
//设置庄家
void SetBanker(WORD wBanker) ;
//叫牌扑克
void SetLandScoreCardData(BYTE cbCardData[], BYTE cbCardCount) ;
//删除扑克
void RemoveUserCardData(WORD wChairID, BYTE cbRemoveCardData[], BYTE cbRemoveCardCount) ;
//辅助函数
protected:
//组合算法
void Combination(BYTE cbCombineCardData[], BYTE cbResComLen,BYTE cbResultCardData, BYTE &cbResCardLen,BYTE cbSrcCardData[] , BYTE cbCombineLen1, BYTE cbSrcLen, const BYTE cbCombineLen2);
//排列算法
void Permutation(BYTE *list, int m, int n, BYTE result[], BYTE &len) ;
//分析炸弹
void GetAllBomCard(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE cbBomCardData[], BYTE &cbBomCardCount);
//分析顺子
void GetAllLineCard(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE cbLineCardData[], BYTE &cbLineCardCount);
//分析三条
void GetAllThreeCard(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE cbThreeCardData[], BYTE &cbThreeCardCount);
//分析对子
void GetAllDoubleCard(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE cbDoubleCardData[], BYTE &cbDoubleCardCount);
//分析单牌
void GetAllSingleCard(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE cbSingleCardData[], BYTE &cbSingleCardCount);
//出牌测试
bool _TestOutAllCard(WORD wTestUser, BYTE cbWantOutCardData[], BYTE cbWantOutCardCount, BYTE cbAllCardData, BYTE cbUserCardCount, bool bFirstOutCard) ;
//出牌测试
bool TestOutAllCard(WORD wTestUser, BYTE cbWantOutCardData[], BYTE cbWantOutCardCount, bool bFirstOutCard) ;
//四带牌型
bool AnalyseFourCardType( BYTE const cbHandCardData, BYTE cbHandCardCount, BYTE cbEnemyCardData, BYTE cbEnemyCardCount, tagOutCardResult &CardResult ) ;
//最大判断
bool IsLargestCard( WORD wTestUser, BYTE const cbWantOutCardData[], BYTE const cbWantOutCardCount );
//是否能出
bool VerifyOutCard( WORD wTestUser, BYTE const cbWantOutCardData[], BYTE const cbWantOutCardCount, BYTE const cbCurHandCardData[ MAX_COUNT ], BYTE const cbCurHandCardCount, bool bFirstOutCard ) ;
//主要函数
protected:
//分析牌型(后出牌调用)
void AnalyseOutCardType(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE const cbTurnCardData[], BYTE const cbTurnCardCount, tagOutCardTypeResult CardTypeResult);
//分析牌牌(先出牌调用)
void AnalyseOutCardType(BYTE const cbHandCardData[], BYTE const cbHandCardCount, tagOutCardTypeResult CardTypeResult);
//单牌个数
BYTE AnalyseSinleCardCount(BYTE const cbHandCardData[], BYTE const cbHandCardCount, BYTE const cbWantOutCardData[], BYTE const cbWantOutCardCount, BYTE cbSingleCardData[]=NULL);
//出牌函数
public:
//地主出牌(先出牌)
void BankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, tagOutCardResult & OutCardResult) ;
//地主出牌(后出牌)
void BankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, WORD wOutCardUser, const BYTE cbTurnCardData[], BYTE cbTurnCardCount, tagOutCardResult & OutCardResult) ;
//地主上家(先出牌)
void UpsideOfBankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, WORD wMeChairID,tagOutCardResult & OutCardResult) ;
//地主上家(后出牌)
void UpsideOfBankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, WORD wOutCardUser,const BYTE cbTurnCardData[], BYTE cbTurnCardCount, tagOutCardResult & OutCardResult) ;
//地主下家(先出牌)
void UndersideOfBankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, WORD wMeChairID,tagOutCardResult & OutCardResult) ;
//地主下家(后出牌)
void UndersideOfBankerOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, WORD wOutCardUser, const BYTE cbTurnCardData[], BYTE cbTurnCardCount, tagOutCardResult & OutCardResult) ;
//出牌搜索
bool SearchOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, const BYTE cbTurnCardData[], BYTE cbTurnCardCount, WORD wOutCardUser, WORD wMeChairID, tagOutCardResult & OutCardResult);
//叫分函数
public:
//叫分判断
BYTE LandScore(WORD wMeChairID, BYTE cbCurrentLandScore) ;
//////////////////////////////////////////////////////////////////////////
};
#endif
页:
[1]