1. 程式人生 > >C++下適合系統自動流程的棋牌遊戲伺服器桌子類

C++下適合系統自動流程的棋牌遊戲伺服器桌子類

//適合自動流程的棋牌遊戲桌子類
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;
};