C++下適合系統自動流程的棋牌遊戲伺服器桌子類
阿新 • • 發佈:2019-02-13
//適合自動流程的棋牌遊戲桌子類 class MyXXTable { public: MyXXTable() { //繫結回撥資料 mMyStatus[ eGS_1 ] = MyStatus( &MyXXTable::OnStatus1, eGS_2, 2000 ); mMyStatus[ eGS_2 ] = MyStatus( &MyXXTable::OnStatus2, eGS_3, 3000 ); mMyStatus[ eGS_3 ] = MyStatus( &MyXXTable::OnStatus3, eGS_4, 4000 ); mMyStatus[ eGS_4 ] = MyStatus( &MyXXTable::OnStatus4, eGS_1, 5000 ); //第一次啟動或者也可以認為是上一次結束 const auto &Status = mMyStatus[ eGS_4 ]; mGameStatus = Status.mNextStatus; SetTimer( 0, Status.mNextTime ); } //遊戲狀態 enum eGameStatus { eGS_1, eGS_2, eGS_3, eGS_4, eGS_MAX, }; //定時器管理流程 void OnTimerOut() { assert( mGameStatus < eGS_MAX ); const auto &Status = mMyStatus[ mGameStatus ]; (this->*Status.mpNextMethod)(); mGameStatus = Status.mNextStatus; KillTimer( 0 ); SetTimer( 0, Status.mNextTime ); //下面是傳統做法,程式碼冗餘費勁 //switch( mGameStatus ) //{ // case eGS_1: // { // OnStatus1(); // } // break; // case eGS_2: // { // OnStatus2(); // } // break; //... } void SetTimer( u32 ID, u32 Time ) { } void KillTimer( u32 ID ) { } void OnStatus1() { //處理狀態1 } void OnStatus2() { //處理狀態2 } void OnStatus3() { //處理狀態3 } void OnStatus4() { //處理狀態4 } //狀態資料 struct MyStatus { typedef void (MyXXTable::*OnStatus)(); MyStatus() { mpNextMethod = nullptr; mNextStatus = eGS_1; mNextTime = 0; } MyStatus( OnStatus pStatus, eGameStatus eGS, u32 time ) { mpNextMethod = pStatus; mNextStatus = eGS; mNextTime = time; } //下一次執行的方法 OnStatus mpNextMethod; //下一次遊戲狀態 eGameStatus mNextStatus; //下一次遊戲狀態持續時間 u32 mNextTime; }; MyStatus mMyStatus[ eGS_MAX ]; eGameStatus mGameStatus; };