资源描述
XXXXXXXXX游戏软件V1.0
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之新东方客栈软件设计说明 来源于。
3 结构设计
3.1 服务端模块分解
XXXXXXXXXXXX服务端共分为四个模块:游戏棋盘模块(Chessboard),棋盘服务模块(ChessboardSink2pSuper)游戏桌子模块(TableFrameSink),游戏服务器管理模块(GameServerManager)。
Module 1
Module 3
Module 4
Chessboard
TableFrameManager
GameServerManager
Module 2
ChessboardSink2pSuper
图 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)
Module 3
Module 2
ChessboardView
GameView
Module 1
GameClientDlg
Module 4
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) 服务端变量(棋盘服务变量)
所在类:ChessboardSink2pSuper
Chessboard2pSuper 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) 客户端变量
所在类:CGameView
WORD 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
展开阅读全文