📄 servermanage.h
字号:
#pragma once
#include "StdAfx.h"
//定时器 ID
#define TIME_SEND_CARD 30 //发牌定时器
#define TIME_WAIT_NT 31 //等待反牌
#define TIME_GAME_FINISH 32 //游戏结束定时器
//操作掩码
#define UG_HUA_MASK 0xF0 //1111 0000
#define UG_VALUE_MASK 0x0F //0000 1111
//扑克花色
#define UG_FANG_KUAI 0x00 //方块 0000 0000
#define UG_MEI_HUA 0x10 //梅花 0001 0000
#define UG_HONG_TAO 0x20 //红桃 0010 0000
#define UG_HEI_TAO 0x30 //黑桃 0011 0000
#define UG_NT_CARD 0x40 //主牌 0100 0000
#define UG_ERROR_HUA 0xF0 //错误 1111 0000
//扑克出牌类型
#define UG_ERROR_KIND 0 //错误
#define UG_ONLY_ONE 1 //单牌
#define UG_DOUBLE 2 //对牌
//扑克数目定义
#define PLAY_TWO_CARD 1 //两副扑克
#define PLAY_THREE_CARD 2 //三副扑克
//游戏结束标志定义
#define GF_NORMAL 10 //游戏正常结束
#define GF_SALE 11 //游戏安全结束
/******************************************************************************************************/
//原子逻辑类
class CUpGradeGameLogic
{
//变量定义
private:
int m_iStation[5]; //相对位置(方块,梅花,红桃,黑桃,主牌)
//函数定义
public:
//构造函数
CUpGradeGameLogic(void);
//功能函数(公共函数)
public:
//获取扑克数字
inline int GetCardNum(BYTE iCard) { return (iCard&UG_VALUE_MASK)+1; }
//获取扑克花色
BYTE GetCardHuaKind(BYTE iCard, BOOL bTrueHua);
//排列扑克
BOOL SortCard(BYTE iCardList[], BOOL bUp[], int iCardCount);
//删除扑克
int RemoveCard(BYTE iRemoveCard[], int iRemoveCount, BYTE iCardList[], int iCardCount);
//辅助函数
public:
//是否单牌
inline BOOL IsOnlyOne(BYTE iCardList[], int iCardCount) { return iCardCount==1; };
//是否对牌
BOOL IsDouble(BYTE iCardList[], int iCardCount);
//是否三条
BOOL IsThree(BYTE iCardList[], int iCardCount);
//获取牌型
BYTE GetCardShape(BYTE iCardList[], int iCardCount);
//获取扑克相对大小
int GetCardBulk(BYTE iCard, BOOL bExtVol);
//对比单牌
BOOL CompareOnlyOne(BYTE iFirstCard, BYTE iNextCard);
//其他函数
public:
//获取扑克
BYTE GetCardFromHua(int iHuaKind, int iNum);
//查找分数
int FindPoint(BYTE iCardList[], int iCardCount);
//服务器专用函数
public:
//混乱扑克
BYTE RandCard(BYTE iCard[], int iCardCount);
//客户端函数
public:
//自动出牌函数
BOOL AutoOutCard(BYTE iHandCard[], int iHandCardCount, BYTE iBaseCard[], int iBaseCardCount, BYTE iResultCard[], int & iResultCardCount, BOOL bFirstOut);
//是否可以出牌
BOOL CanOutCard(BYTE iOutCard[], int iOutCount, BYTE iBaseCard[], int iBaseCount, BYTE iHandCard[], int iHandCount);
//内部函数
private:
//清除 0 位扑克
int RemoveNummCard(BYTE iCardList[], int iCardCount);
};
//游戏桌类
class CServerGameDesk : public CGameDesk
{
protected:
//游戏基础数据
BYTE m_CardCount; //扑克数目(位变量)
//玩家设置数据
BYTE m_iLessCount; //最少游戏局数
BYTE m_iPlayCardCount; //游戏扑克数目
BYTE m_iBeginStation; //游戏开始位置
BYTE m_iEndStation; //游戏结束位置
BYTE m_iEnableWatch; //是否允许旁观
//运行状态变量
int m_PunishPoint[4]; //用户罚分
int m_iUpGradePeople; //庄家位置
BYTE m_iPlayNTNum[2]; //各玩家的主牌数目
BYTE m_iBeenPlayGame; //已经游戏的局数
BYTE m_iLeaveArgee; //离开同意标志
//反牌信息
int m_iNtPeople; //反牌玩家
BYTE m_iNtCardCount; //反牌牌数
//状态信息
BYTE m_iUserCardCount[4]; //用户手上扑克数目
BYTE m_iUserCard[4][45]; //用户手上的扑克
BYTE m_iBackCard[3]; //底牌列表
//运行信息
int m_iGamePoint; //用户游戏分数
int m_iOutCardPeople; //现在出牌用户
int m_iFirstOutPeople; //先出牌的用户
BYTE m_iBaseOutCount; //出牌的数目
BYTE m_iDeskCardCount[4]; //桌面扑克的数目
BYTE m_iDeskCard[4][39]; //桌面的扑克
//发牌数据
BYTE m_iSendCardPos; //发牌位置
CUpGradeGameLogic m_Logic; //游戏逻辑
bool m_bQueryQuit; //有玩家请求退出
int m_iLastOutPeople;
bool IsNewTurn;
bool IsDoubleKou;//是否双扣
int m_iWinStation;//赢家
int m_iTurePoint[4];//游戏得分
int m_iMiCiArr[4];
int m_iCurScoresArr[4];
int m_iCurScores;
int m_iCurMiCi;
BYTE m_iPlayRemainCardCnt[4];
BYTE m_iCurStation[4];//当前游戏状态(出或过给旁观)
bool bFlagNextHalf; ////进行下办局标志
BYTE m_iDaoCard; ///存储刀牌
int m_iFirstTouchCard; ////存储第一个摸牌的人
int m_iFirstPerOut; ///每局第一个出牌人
bool m_bDoubleClip; ///是否双夹
int m_iDoubleWin;///双夹获胜的赢家
//函数定义
public:
//构造函数
CServerGameDesk();
//析构函数
virtual ~CServerGameDesk();
//重载函数
public:
//游戏开始
virtual bool GameBegin(BYTE bBeginFlag);
//游戏结束
virtual bool GameFinish(BYTE bDeskStation, BYTE bCloseFlag);
//判断是否正在游戏
virtual bool IsPlayGame(BYTE bDeskStation);
//游戏数据包处理函数
virtual bool HandleNotifyMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser);
//用户离开游戏桌
virtual BYTE UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo);
//重载纯虚函数
public:
//获取游戏状态信息
virtual bool OnGetGameStation(BYTE bDeskStation, UINT uSocketID, bool bWatchUser);
//重置游戏状态
virtual bool ReSetGameState(BYTE bLastStation);
//定时器消息
virtual bool OnTimer(UINT uTimerID);
//处理函数
public:
//用户设置游戏
BOOL UserSetGame(UserArgeeGame * pGameSet);
//发送扑克给用户
BOOL SendCard();
//游戏开始
BOOL BeginPlayUpGrade();
//用户出牌
bool UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount);
//新一轮开始
BOOL NewPlayTurn(BYTE bDeskStation);
//用户请求离开
bool UserHaveThing(BYTE bDeskStation, char * szMessage);
//同意用户离开
bool ArgeeUserLeft(BYTE bDeskStation, BOOL bArgee);
//计算升级
int GetUpGrade(int iGamePoint, int iPlayCardCount);
//更新用户分数牌数信息
void ModifyPlayInfo(BYTE bDeskStation,int iCardCount);
////开始下半局
void StartNextHalf(void);
};
/******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -