XXXXXX游戏软件设计说明1引言1.1标识本文档是棋牌游戏XXXXXXXXXXXX游戏软件设计说明文档,阅读对象是产品开发,测试和维护人员。
1.2围本文档包括软件产品的系统设计和详细设计两大部分,系统设计部分主要描述产品的模块划分,相互依赖关系和交互接口,详细设计部分通过包图、类图、状态图等描述系统功能的具体实现方法和流程。
1.3定义和缩写1.“本软件”或“本产品”指:(1)XXXXXXXXXXXX游戏软件V1.0。
(2)相关的说明性书面材料、说明书以及电子文档(如果有的话)。
(3)XXXXXX公司许可您使用的本软件的相关的更新程序,或者修改版(如果有的话)。
2.“使用”指对本软件安装、设置或者以其他方式对本软件做功能性使用。
3.“用途”指您使用本软件的限制和围。
4.“XXXXXXXXXXXX游戏软件”缩写“XXXXXXXXXXXX”。
2参考献文【1】软件设计说明:Survivor之新客栈软件设计说明来源于docin.。
3 结构设计3.1 服务端模块分解XXXXXXXXXXXX服务端共分为四个模块:游戏棋盘模块(Chessboard),棋盘服务模块(ChessboardSink2pSuper)游戏桌子模块(TableFrameSink),游戏服务器管理模块(GameServerManager )。
图 3-1-1-1 服务端模块划分3.1.1 模块1 游戏棋盘模块 说明本模块定义了棋子数组和各个子的走法,包括车、马、炮这几个特殊棋子的走法和吃子规则(CanRookMove 、CanHorseMove 、CanCannonEat )并提供一个对外部游戏判断棋子是否可行可吃的总接口Action ,针对车、马、炮这三个特殊的棋子,还分别提供了SearchRookPath 、 SearchHorsePath 、SearchCannonEatPath 这三个搜寻可走路径的函数3.1.2 模块 2 棋盘服务模块 说明本模块接手了模块3的功能,定义了服务端游戏控制流程,包括游戏初始化、等待、属性、开始游戏,游戏结束和结算,分别有各自的控制逻辑和交互界面。
3.1.3 模块 3 游戏桌子模块 说明本模定义了棋盘服务的建立,使用棋盘服务控制游戏流程。
3.1.4模块 4游戏服务器管理模块 说明本模块定义了服务端的建立,主要成员函数包括:创建游戏桌(CreateTableFrameSink )。
3.2 客户端模块分解XXXXXXXXXXXX 客户端共分四个模块:游戏对话框模块(GameClientDlg ),游戏视图模块(CGameView ),游戏棋盘模块(ChessboardView ),猜拳模块(GuessView )图 3-2-1-1 客户端模块划分3.2.1 模块 1游戏对话框模块 说明本模块定义了客户端游戏控制流程,如:游戏设置(OnGameOptionSet )用于功能设置,网络消息(OnGameMessage )用于发送用户游戏消息,游戏场景(OnGameSceneMessage )用于发送游戏过程状态3.2.2 模块 2 游戏场景模块 说明本模块定义了游戏进行时的场景,游戏场景包括区域的绘制、场景信息贴图,走棋动画。
3.2.3 模块 3游戏逻辑模块 说明本模块定义了棋子数组和各个子的走法,包括车、马、炮这几个特殊棋子的走法和吃子规则(CanRookMove 、CanHorseMove 、CanCannonEat )并提供一个对外部游戏判断棋子是否可行可吃的总接口Action ,针对车、马、炮这三个特殊的棋子,还分别提供了SearchRookPath 、 SearchHorsePath 、SearchCannonEatPath 这三个搜寻可走路径的函数3.2.4 模块4猜拳模块说明本模块定义了猜拳游戏场景的渲染,猜拳动画,用于决定哪个玩家先行棋3.3全局数据结构说明3.3.1 常量(1) 服务端常量WORD g_wGamePlayer; //游戏人数WORD g_wGameMode; //游戏模式ITableFrame * m_pITableFrame; //框架接口const tagGameServiceOption * m_pGameServiceOption; //配置参数static const enStartMode m_GameStartMode; //开始模式ChessboardSink * m_pChessboardSink; //棋盘服务(服务端的网络消息处理和其他变量都交给棋盘服务)棋盘服务常量:static const BYTE m_cbBuyPropsBaseCoin[5]; //购买道具的基数static const BYTE m_cbPropsLimitBuyCount[5]; //限制购买道具数量 (2) 客户端常量CGameView * g_pGameView; //游戏视图CGuessView * g_pGuessView; //猜拳视图3.3.2 变量(1) 服务端变量(棋盘服务变量)所在类:ChessboardSink2pSuperChessboard2pSuper m_chessboard; //棋盘LONG m_lPropsCostCoin[5]; //道具花费LONG m_lBuyPropsCoin[2]; //各个玩家购买道具的金币数bool m_isBoughtProps[2][5]; //玩家是否购买了某个道具BYTE m_cbBoughtPropsCount[2][5]; //购买了某个道具的数量BYTE m_cbFreePropsCount[2][5]; //玩家获得某个免费道具的数量WORD m_wBeLimitedCount[2]; //玩家被人使用了禁锢道具的数量BYTE m_cbPeepCount[2]; //玩家使用马灯的数量PEEP *m_pPeep[2]; //玩家拥有的马灯结构(包括透视周围三颗棋子的坐标) WORD m_wFreePropsUsedCount[2][5]; //免费道具使用数量bool m_isUsedBoughtProps[2]; //是否使用了购买的道具WORD m_wBuyPropsUsedCount[2][5]; //购买道具使用数量WORD m_wBeUsedPropsCount[2][5]; //被道具作用次数LONG m_lUserUsedPropsCoin[2]; //各个玩家使用道具的金币数CMD_S_Guess m_guess; //猜谁先行Chess m_clientChessArr[6][6]; //对应的客户端的棋盘数组Chess m_seizeChessArr[2][16]; //玩家吃子数组BYTE m_cbSeizeChessCount[2]; //玩家吃子数BYTE m_cbPromisePeaceCount[2]; //玩家被答应和棋的数量BYTE m_cbPromiseGiveupCount[2]; //玩家被答应认输的数量WORD m_wBegPeaceStatus[2]; //玩家求和状态WORD m_wBegGiveupStatus[2]; //请求认输状态WORD m_wTimeOutCount[2]; //玩家超时次数WORD m_wThinkTime[2]; //思考时间(可变)bool m_isOver[2]; //玩家是否被吃光棋子或者主动认输bool m_isRevokeOffLine[2]; //是否掉线后回来BYTE m_cbColor[2]; //玩家所执的棋子颜色WORD m_wCurrentUser; //当前玩家WORD m_wStepCount; //当前游戏步数WORD m_wTimeUsed; //每步已用时WORD m_wMoveToNullCount; //空步(只是单纯的移动棋子)数,用于判断和棋WORD m_wFirstRunUser; //先行者BYTE m_cbPlayStatus; //游戏开始后的状态 (2) 客户端变量所在类:CGameViewWORD m_wGamePlayer; //游戏人数WORD m_wCurrentUser; //当前玩家WORD m_wLimitTime; //总时间WORD m_wStepLimitTime; //离超时还剩余的时间WORD m_wTimeOutCount; //超时次数bool m_isLimitTime; //是否限时bool m_isDrawTime; //是否画限时WORD m_wPeaceReqGapTime; //求和间隔时间WORD m_wGiveUpReqGapTime; //认输间隔时间WORD m_wStepCount; //游戏步数bool m_isLookon; //是否旁观bool m_isPeaceAnswered; //求和是否回应了bool m_isGiveUpAnswered; //认输是否回应了所在类:CgameView2pS(派生自CGameView)ChessboardView2pS m_chessboardView; //棋盘视图BYTE m_cbColor[2]; //玩家执子颜色COLORREF m_textColor; //聊天文字颜色bool m_isOver[2]; //玩家是否完了WORD m_wThinkTime[2]; //玩家思考时间PEEP_3INFO *m_pPeep; //马灯结构指针WORD m_wPeepCount; //马灯数量WORD m_wOtherPeepCount; //其他人的马灯数量WORD m_wTrapCount; //陷阱数量BYTE m_cbPropsCount[5]; //各个道具可用数量3.3.3消息结构本软件消息结构包括游戏服务端消息结构和客户端消息结构,数据结构如下:(1)服务端消息结构设计服务端消息结构分为主要分两部分定义,服务端消息定义和消息结构。
消息定义#define SUB_S_GAME_START 100 //游戏开始#define SUB_S_MOVE_CHESS 101 //移动棋子#define SUB_S_REGRET_REQ 102 //悔棋请求#define SUB_S_REGRET_FAILE 103 //悔棋失败#define SUB_S_REGRET_RESULT 104 //悔棋结果#define SUB_S_PEACE_REQ 105 //和棋请求#define SUB_S_PEACE_ANSWER 106 //和棋应答#define SUB_S_GAME_END 107 //游戏结束#define SUB_S_CHESS_MANUAL 108 //棋谱信息#define SUB_S_REQ_SET_RULE 109 //请求设置#define SUB_S_REQ_AGREE_RULE 110 //请求同意#define SUB_S_OPEN_CHESS 111 //翻开棋子#define SUB_S_FIRSTOPEN_CHESS 112 //未确定颜色时,第一次翻开棋子#define SUB_S_CLOSE 114 //强退#define SUB_S_GIVEUP_REQ 115 //认输#define SUB_S_GIVEUP_ANSWER 116 //认输应答#define SUB_S_CURRENT_USER 117 //指派谁走棋#define SUB_S_GUESS 118 //猜谁先走#define SUB_S_START_GUESS 119 //开始猜先#define SUB_S_SOMEONEGUESS 120 //某人已经出手了#define SUB_S_BREAK_END 121 //强退结束#define SUB_S_PEACE_END 122 //和棋结束#define SUB_S_NORMAL_END 123 //正常结束#define SUB_S_GUESSING_END 124 //猜拳状态下结束#define SUB_S_TIME_OUT 125 //玩家超时#define SUB_S_MOVE_STILL 127#define SUB_S_OPEN_PROPS 130 //翻开道具#define SUB_S_USER_OVER 135 //玩家被吃光了#define SUB_S_PROPS_RESTART 140 //重开#define SUB_S_PROPS_BOMB 141 //炸弹#define SUB_S_PROPS_PEEP 142 //走马灯#define SUB_S_PROPS_TRAP 143 //陷阱#define SUB_S_PROPS_LIMIT 144 //禁锢#define SUB_S_PROPS_WINLOST 145 //胜负道具#define SUB_S_OTHER_USER_PEEP 149 //其他玩家设置了马灯#define SUB_S_NOT_ENOUGH_COIN 150 //金币不足#define SUB_S_BUY_SUCCESS 151 //购买成功#define SUB_S_REMOVE_LIMIT 160 //消除禁锢#define SUB_S_IN_TRAP 161 //中陷阱#define SUB_S_NO_EFFECT 162#define SUB_S_MOVING_FOUND_TRAP 163 //移动棋子发现陷阱而无法移动#define SUB_S_LAYPROPS_FOUND_TRAP 164 //放置道具发现陷阱而无法移动 消息结构struct ChessWithCoord{BYTE iBePeeped;BYTE jBePeeped;Chess chess;};struct CHESS_COORD //棋子数组坐标{BYTE i;BYTE j;};struct TRAP{BYTE iTrap;BYTE jTrap;WORD wTrapUser;};struct CMD_S_FirstOpenChess{BYTE i; //棋子数组下标BYTE j;Chess chess; //棋子WORD wCurrentUser; //当前玩家WORD wOpenUser;WORD wOpenUserThinkTime; //翻棋玩家思考时间};struct CMD_S_OpenChess{BYTE i; //棋子数组下标BYTE j;Chess chess; //棋子WORD wCurrentUser; //当前玩家WORD wOpenUser;WORD wOpenUserThinkTime; //翻棋玩家思考时间};struct CMD_S_OpenProps{BYTE i; // BYTE j; // Chess chess; // WORD wCurrentUser; // WORD wOpenUserThinkTime; //翻棋玩家思考时间};struct CMD_S_MoveChess{WORD wMoveUser; //移动棋子的玩家BYTE iSrc; // BYTE jSrc; // BYTE iDst; // BYTE jDst; // WORD wCurrentUser; //当前玩家WORD wMoveUserThinkTime; //翻棋玩家思考时间};struct CMD_S_StartGuess{WORD wGuessUser1; //猜先玩家一WORD wGuessUser2; //猜先玩家二};struct CMD_S_SomeoneGuess{WORD wGuessUser; //已出手的玩家};struct CMD_S_Close{WORD wCloseUser; //强退玩家};struct CMD_S_PeaceRequest{WORD wPeaceRequestUser; //求和玩家};struct CMD_S_GiveUp{WORD wGiveupUser; //认输玩家};struct CMD_S_CurrentUser{WORD wCurrentUser; //服务器指定谁走下一步};typedef struct tagSystemAction{BYTE cbActionType; //系统帮走类型BYTE iSrc;BYTE jSrc;BYTE iDst; //若cbActionType不等于ACTION_MOVE,此值作废BYTE jDst;} SYSTEMACTION;struct CMD_S_TimeOut{WORD wTimeOutUser;WORD wThinkTime;WORD wCurrentUser;};struct CMD_S_Guess{WORD wGuessUser1; //玩家一WORD wGuessUser2; //玩家二BYTE cbGuessUser1Type; //石头剪刀布其中之一BYTE cbGuessUser2Type; //石头剪刀布其中之一};struct CMD_S_GuessResult{CMD_S_Guess guess; // WORD wWinner; //赢家椅子号};struct CMD_S_Over{WORD wOverUser; //被吃光棋子的玩家};struct CMD_S_BuySuccess{BYTE cbPropsType; //道具类型};struct CMD_S_Props_Restart{WORD wCurrentUser; //当前玩家};struct CMD_S_Props_Bomb{BYTE i; //被炸棋子数组下标BYTE j;bool isNoBomb; //是否没有炸弹道具了WORD wCurrentUser; //当前玩家WORD wBombUser; //扔炸弹玩家WORD wBeBombedUser; //被炸玩家};struct CMD_S_Props_Trap{BYTE iTrap; //陷阱下标BYTE jTrap;bool isNoTrapProps; //是否没有陷阱道具了WORD wTrapUser; //设置陷阱的玩家WORD wCurrentUser;};struct CMD_S_InTrap{WORD wMoveUser; //移动棋子的玩家WORD wTrapUser; //设置陷阱的玩家BYTE iSrc; //BYTE jSrc; //BYTE iDst; //BYTE jDst; //WORD wCurrentUser; //当前玩家WORD wMoveUserThinkTime; //移动玩家思考时间};struct CMD_S_Props_Limit{bool isNoLimitProps; //是否没有禁锢道具了WORD wLimitUser; //使用限制道具的玩家WORD wBeLimitUser; //被限制玩家WORD wCurrentUser; //当前玩家};struct CMD_S_RemoveLimit{WORD wBeLimitUser; //被限制玩家};struct CMD_S_No_Effect{BYTE cbPropsType;};/****************************************************************************** *****/struct tagGameAwardData{//奖券奖励条件(局数)WORD wGameNumberOfCrystalAward[CRYSTALAWARD_CONDICTION_COUNT];//服务费的百分比作为奖券奖励BYTE cbPercentOfService[CRYSTALAWARD_CONDICTION_COUNT];//积分等级short sScoreForLevel[SCORE_LEVEL_COUNT];//奖券加成百分比BYTE cbPercentOfCrystalAward[SCORE_LEVEL_COUNT];};struct CMD_S_Guessing_GameEnd{WORD wBreakUser; //猜拳状态下强退的玩家};struct CMD_S_Break_GameEnd_2p{WORD wBreakUser; //强退玩家LONG lFleeGoldCoin; //强退玩家被扣除金币数LONG lFleeScore; //强退玩家被扣除分数LONG lWinnerGameGoldCoin;//赢家赢得的游戏金币LONG lGameRevenue; //服务费用LONG lWinnerGameScore; //赢家游戏分数LONG lWinnerGameExp; //赢家经验值BYTE cbSeizeChessCount[2]; //玩家吃子数};struct CMD_S_Peace_GameEnd_2p{LONG lGameRevenue;BYTE cbSeizeChessCount[GAME_PLAYER_2P];};struct CMD_S_Normal_GameEnd_2p{WORD wWinner; //其中之一赢家LONG lWinnerGameGoldCoin;//赢家赢得的游戏金币LONG lGameRevenue; //服务费用(金币)LONG lWinnerGameScore; //赢家赢得的游戏分数LONG lWinnerGameExp; //赢家经验值LONG lLoserGameExp; //输家经验值BYTE cbSeizeChessCount[2]; //玩家吃子数};struct PEEP{BYTE iPeep;BYTE jPeep;WORD wPeepUser;ChessWithCoord chessWithCoord[3];};struct OTHER_PEEP{BYTE iPeep;BYTE jPeep;WORD wPeepUser;};struct CMD_S_Props_Peep{BYTE iPeep; //走马灯所在数组下标BYTE jPeep;bool isNoPeepProps; //是否没有马灯道具了WORD wCurrentUser; //当前玩家ChessWithCoord chesswithcoord[3];//走马灯透视周围三颗棋子};struct CMD_S_OtherUser_Peep{BYTE iPeep;BYTE jPeep;WORD wPeepUser; //使用马灯的玩家WORD wCurrentUser; //当前玩家};struct CMD_S_StatusFree_2p_Super{WORD wGamePlayer; //玩家数量WORD wGameMode;//游戏模式,0为经典场,1为超级场tagGameRuleInfo GameRuleInfo; //游戏规则tagGameAwardData GameAwardData; //奖券奖励数据LONG lCellScore; //房间倍数void *pServerData; //服务器端的数据BYTE cbBuyPropsBaseCoin[5];//道具购买基数,乘以房间倍率就是道具价格BYTE cbPropsLimitBuyCount[5];//道具限制购买数量};struct CMD_S_StatusGuess_2p_Super{WORD wGamePlayer;WORD wGameMode; //游戏模式,0为经典场,1为超级场tagGameRuleInfo GameRuleInfo; //游戏规则tagGameAwardData GameAwardData; //奖券奖励数据LONG lCellScore; //房间倍数bool isUser1Guess; //玩家数量bool isUser2Guess;bool isRevokeOffLine; //是否是断线重连BYTE cbBuyPropsBaseCoin[5];//道具购买基数,乘以房间倍率就是道具价格BYTE cbPropsLimitBuyCount[5]; //道具限制购买数量};struct CMD_S_StatusPlay_2p_Super{WORD wGamePlayer; //玩家数量WORD wGameMode;//游戏模式,超级场为1,普通场为0 tagGameRuleInfo GameRuleInfo; //游戏规则tagGameAwardData GameAwardData; //奖券奖励数据LONG lCellScore; //房间倍数WORD wCurrentUser; //当前玩家WORD wStepCount; //走棋步数BYTE cbColor[GAME_PLAYER_2P];Chess ChessArr[V_COUNT_2P_S][H_COUNT_2P_S];Chess lostChessArr[GAME_PLAYER_2P][SEIZE_CHESS_COUNT_2P];WORD wThinkTime[GAME_PLAYER_2P]; //思考时间WORD wTimeRemaining;bool isRevokeOffLine; //是否是断线重连bool isLimited[GAME_PLAYER_2P];BYTE cbPeepCount; //马灯数量BYTE cbOtherPeepCount; //其他人的马灯数量BYTE cbTrapCount; //陷阱数量BYTE cbPropsCount[5]; //道具数量BYTE cbBoughtPropsCount[5];//购买过的道具数量bool isOver[GAME_PLAYER_2P];BYTE cbBuyPropsBaseCoin[5];//道具购买基数,乘以房间倍率就是道具价格BYTE cbPropsLimitBuyCount[5];//道具限制购买数量};(2)客户端消息结构设计客户端消息结构主要也分两部分定义,客户端消息定义和消息结构。