⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	protected:
		HBITMAP mhMonsterBmp, mhQueenBmp;
		HBITMAP mhMonsterBmpOld, mhQueenBmpOld;
		HDC mhMonsterDC, mhQueenDC;

		int mAlpha[8], mDestAlpha[8];
		int mX[8], mDestY;
};

class SpriteControl: public virtual Control
{
	public:
		SpriteControl(Window *pWnd):
			Control(pWnd, false, false),
			mhSpriteBmp(NULL),
			mhSpriteDC(NULL),
			mState(SPRITE_STATE_READY)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);

		mhSpriteBmp = (HBITMAP)LoadImage(NULL, L"sprite.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(mhSpriteBmp == NULL);

		mhSpriteDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
		alert(mhSpriteDC == NULL);

		mhBmpOld = (HBITMAP)SelectObject(mhSpriteDC, mhSpriteBmp);
	}

		virtual ~SpriteControl(void)
		{
			HBITMAP hBmpOld = (HBITMAP)SelectObject(mhSpriteDC, mhBmpOld);
			alert(mhSpriteBmp != hBmpOld);

			DeleteObject(mhSpriteBmp);
			DeleteDC(mhSpriteDC);
		}

		void reset(void)
		{
			mDestX1 = MAP1_ORGX + 3*CELL_WIDTH;
			mDestY1 = MAP1_ORGY + 8*CELL_WIDTH;
			mDestAngle1 = 0;
			mDestX2 = MAP2_ORGX + 0*CELL_WIDTH;
			mDestY2 = MAP2_ORGY + 8*CELL_WIDTH;
			mDestAngle2 = 0;

			mX1 = mDestX1;
			mY1 = mDestY1;
			mAngle1 = mDestAngle1;
			mX2 = mDestX2;
			mY2 = mDestY2;
			mAngle2 = mDestAngle2;

			mState = SPRITE_STATE_READY;
		}

		void setDest(int x1, int y1, int angle1, int action1,
				int x2, int y2, int angle2, int action2)
		{
			mDestX1 = MAP1_ORGX + x1*CELL_WIDTH;
			mDestY1 = MAP1_ORGY + y1*CELL_WIDTH;
			mDestAngle1 = angle1*90;
			mAction1 = action1;

			mDestX2 = MAP2_ORGX + (3 - x2)*CELL_WIDTH;
			mDestY2 = MAP2_ORGY + y2*CELL_WIDTH;
			mDestAngle2 = (360 - angle2*90)%360;
			mAction2 = action2;

			mState = SPRITE_STATE_RUNNING;
		}

		int getState(void)
		{
			return mState;
		}

	protected:
		virtual int onDrawDetect(int &flagDraw)
		{
			if(mState == SPRITE_STATE_READY)
				return 0;

			if((mX1 == mDestX1) && (mY1 == mDestY1) && (mAngle1 == mDestAngle1) &&
					(mX2 == mDestX2) && (mY2 == mDestY2) && (mAngle2 == mDestAngle2))
			{
				mState = SPRITE_STATE_READY;
				return 0;
			}

			if(flagDraw == DRAW_NONE)
				flagDraw = DRAW_NORMAL;

			int MOVE_STEP1 = (mAction1 == GO_FORWARD_FAST) ? 2 : 1;
			int MOVE_STEP2 = (mAction2 == GO_FORWARD_FAST) ? 2 : 1;
			const int ROTATE_STEP = 2;
			int disAngle;

			// role 1
			if(abs(mX1 - mDestX1) < MOVE_STEP1)
				mX1 = mDestX1;
			if(abs(mY1 - mDestY1) < MOVE_STEP1)
				mY1 = mDestY1;
			if((360 + ROTATE_STEP + mAngle1 - mDestAngle1)%360 < 2*ROTATE_STEP)
				mAngle1 = mDestAngle1;

			if(mX1 < mDestX1)
				mX1 += MOVE_STEP1;
			else if(mX1 > mDestX1)
				mX1 -= MOVE_STEP1;
			if(mY1 < mDestY1)
				mY1 += MOVE_STEP1;
			else if(mY1 > mDestY1)
				mY1 -= MOVE_STEP1;
			disAngle = (360 + mDestAngle1 - mAngle1)%360;
			if(disAngle > 180)
				disAngle -= 360;
			if(disAngle > 0)
				mAngle1 = (mAngle1 + ROTATE_STEP)%360;
			else if(disAngle < 0)
				mAngle1 = (360 + mAngle1 - ROTATE_STEP)%360;

			// role 2
			if(abs(mX2 - mDestX2) < MOVE_STEP2)
				mX2 = mDestX2;
			if(abs(mY2 - mDestY2) < MOVE_STEP2)
				mY2 = mDestY2;
			if((360 + ROTATE_STEP + mAngle2 - mDestAngle2)%360 < 2*ROTATE_STEP)
				mAngle2 = mDestAngle2;

			if(mX2 < mDestX2)
				mX2 += MOVE_STEP2;
			else if(mX2 > mDestX2)
				mX2 -= MOVE_STEP2;
			if(mY2 < mDestY2)
				mY2 += MOVE_STEP2;
			else if(mY2 > mDestY2)
				mY2 -= MOVE_STEP2;
			disAngle = (360 + mDestAngle2 - mAngle2)%360;
			if(disAngle > 180)
				disAngle -= 360;
			if(disAngle > 0)
				mAngle2 = (mAngle2 + ROTATE_STEP)%360;
			else if(disAngle < 0)
				mAngle2 = (360 + mAngle2 - ROTATE_STEP)%360;

			return 0;
		}

		virtual void reDraw(void)
		{
			TransparentBlt(mpPnl->gethMemDC(), mX1, mY1, CELL_WIDTH, CELL_WIDTH,
					mhSpriteDC, (mAngle1 + 5)%360/10*CELL_WIDTH, 0, CELL_WIDTH, CELL_WIDTH, 0x000000);
			TransparentBlt(mpPnl->gethMemDC(), mX2, mY2, CELL_WIDTH, CELL_WIDTH,
					mhSpriteDC, (mAngle2 + 5)%360/10*CELL_WIDTH, 0, CELL_WIDTH, CELL_WIDTH, 0x000000);
		}

		virtual int onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
		{
			return 0;
		}

		virtual int onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
		{
			return 0;
		}

	protected:
		HBITMAP mhSpriteBmp, mhBmpOld;
		HDC mhSpriteDC;
		int mState;

		int mX1, mY1, mAngle1;
		int mX2, mY2, mAngle2;
		int mDestX1, mDestY1, mDestAngle1;
		int mDestX2, mDestY2, mDestAngle2;
		int mAction1, mAction2;
};

class CoreControl: public virtual Control
{
	public:
		CoreControl(Window *pWnd):
			Control(pWnd),
			mTicks(0),
			mSwitched(false),
			mPlayer1(0), mPlayer2(0),
			mScore1(0), mScore2(0)
	{
	}

		virtual ~CoreControl(void)
		{
		}

		void initGame(void)
		{
			FinalCore *pCore = (FinalCore*)leader.mpCore;
			pCore->setMap(leader.mMapIndex, leader.mMapBlank);
			pCore->initRoles(leader.mFileName1, leader.mFileName2);

			bool map[8][4];
			unsigned char index, destX, destY;
			wchar_t message[MAX_MESSAGE_LEN];
			pCore->getMapInfo(map, index, destX, destY);
			((MarkControl*)leader.mpMarkCtl)->setMapInfo(map, destX, destY);
			((SpriteControl*)leader.mpSpriteCtl)->reset();
			snwprintf(message, MAX_MESSAGE_LEN,
					L"\n"
					L"\n"
					L"  地图编号:%4d\n",
					leader.mMapIndex
					);
			((MessagePanel*)leader.mpMessagePnl)->setMessage(message);
			((TransparentImagePanel*)leader.mpTriggerDraw)->pause();
			((TransparentImagePanel*)leader.mpTrigger1Win)->pause();
			((TransparentImagePanel*)leader.mpTrigger2Win)->pause();

			mTicks = 0;
		}

		void startGame(void)
		{
			if(((FinalCore*)leader.mpCore)->startGame() < 0)
				return;

			mTicks = GetTickCount();
			mSwitched = false;
		}

	protected:
		virtual int onDrawDetect(int &flagDraw)
		{
			if(
					(mPlayer1 != leader.mPlayer1) ||
					(mPlayer2 != leader.mPlayer2) ||
					(mScore1 != leader.mScore1) ||
					(mScore2 != leader.mScore2))
			{
				mPlayer1 = leader.mPlayer1;
				mPlayer2 = leader.mPlayer2;
				mScore1 = leader.mScore1;
				mScore2 = leader.mScore2;

				if(flagDraw == DRAW_NONE)
					flagDraw = DRAW_NORMAL;
			}

			// core behaviour
			if(mTicks == 0)
				return 0;

			FinalCore *pCore = (FinalCore*)leader.mpCore;

			if((!mSwitched) && (GetTickCount() - mTicks > HALF_ROUND_TIME))
			{
				pCore->switchRole();
				mTicks = GetTickCount();
				mSwitched = true;
			}

			if(mSwitched && (GetTickCount() - mTicks > HALF_ROUND_TIME) &&
					(((SpriteControl*)leader.mpSpriteCtl)->getState() == SPRITE_STATE_READY))
			{
				mTicks = GetTickCount();
				mSwitched = false;

				bool queen[8];
				pCore->getQueenInfo(queen);
				((MarkControl*)leader.mpMarkCtl)->setQueenInfo(queen);

				unsigned long round;
				unsigned char action1, action2;
				unsigned char x1, y1, x2, y2;
				unsigned char direction1, direction2;
				unsigned char retVal = pCore->nextRound(round,
						action1, x1, y1, direction1, action2, x2, y2, direction2);

				((SpriteControl*)leader.mpSpriteCtl)->setDest(x1, y1, direction1, action1,
					x2, y2, direction2, action2);

				wchar_t message[MAX_MESSAGE_LEN];
				snwprintf(message, MAX_MESSAGE_LEN,
						L"\n"
						L"\n"
						L"  地图编号:%4d\n"
						L"\n"
						L"  当前回合:%4d\n"
						L"\n"
						L"\n"
						L"    左侧:\n"
						L"\n"
						L" 当前决策:%s\n"
						L" 当前坐标:(%d, %d)\n"
						L" 当前方向:%s\n"
						L"\n"
						L"\n"
						L"    右侧:\n"
						L"\n"
						L" 当前决策:%s\n"
						L" 当前坐标:(%d, %d)\n"
						L" 当前方向:%s\n",
						leader.mMapIndex, round,
						ACTION1[action1], x1, y1, DIRECTION1[direction1],
						ACTION2[action2], x2, y2, DIRECTION2[direction2]
							);
				((MessagePanel*)leader.mpMessagePnl)->setMessage(message);

				switch(retVal)
				{
					case CORE_STATE_DRAW:
						((TransparentImagePanel*)leader.mpTriggerDraw)->resume();
						mTicks = 0;
						break;
					case CORE_STATE_1_WIN:
						((TransparentImagePanel*)leader.mpTrigger1Win)->resume();
						mTicks = 0;
						leader.mScore1++;
						break;
					case CORE_STATE_2_WIN:
						((TransparentImagePanel*)leader.mpTrigger2Win)->resume();
						mTicks = 0;
						leader.mScore2++;
						break;
				}
			}

			return 0;
		}

		virtual void reDraw(void)
		{
			if((mPlayer1 > 0) && (mPlayer1 <= 12))
			{
				BitBlt(mpPnl->gethMemDC(), 200, 25, LOGO_WIDTH, LOGO_HEIGHT,
						leader.mhLogoDC[mPlayer1 - 1], 0, 0, SRCCOPY);
			}
			else
			{
				RECT rect = {
					200, 25, 200 + LOGO_WIDTH, 25 + LOGO_HEIGHT};
				HBRUSH hBr = CreateSolidBrush(0x000000);
				FillRect(mpPnl->gethMemDC(), &rect, hBr);
				DeleteObject(hBr);
			}
			if((mPlayer2 > 0) && (mPlayer2 <= 12))
			{
				BitBlt(mpPnl->gethMemDC(), 500, 25, LOGO_WIDTH, LOGO_HEIGHT,
						leader.mhLogoDC[mPlayer2 - 1], 0, 0, SRCCOPY);
			}
			else
			{
				RECT rect = {
					500, 25, 500 + LOGO_WIDTH, 25 + LOGO_HEIGHT};
				HBRUSH hBr = CreateSolidBrush(0x000000);
				FillRect(mpPnl->gethMemDC(), &rect, hBr);
				DeleteObject(hBr);
			}
			TransparentBlt(mpPnl->gethMemDC(), 87, 25, 25, 50,
					leader.mhNumbersDC, mScore1*25, 0, 25, 50, 0x000000);
			TransparentBlt(mpPnl->gethMemDC(), 687, 25, 25, 50,
					leader.mhNumbersDC, mScore2*25, 0, 25, 50, 0x000000);
		}

		virtual int onKBEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
		{
			return 0;
		}

		virtual int onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
		{
			return 0;
		}

	protected:
		DWORD mTicks;
		bool mSwitched;
		int mPlayer1, mPlayer2;
		int mScore1, mScore2;
};

class MainScene: public virtual Scene
{
	public:
		MainScene(Window *pWnd):
			Scene(pWnd)
	{
		srand(GetTickCount());
	}

		virtual ~MainScene(void)
		{
		}

	protected:
		virtual void onInit(void)
		{
			// bottomBar
			ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 500, 800, 100, L"bottomBar.bmp");
			mDT.addTrigger(pImagePnl);

			// the game controller
			CoreControl *pCoreCtl = new CoreControl(mpWnd);
			leader.mpCoreCtl = (void*)pCoreCtl;
			mET.addTrigger(pCoreCtl);
			pImagePnl->addControl(pCoreCtl);

			// backgrounds
			pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 500, L"map.bmp");
			mDT.addTrigger(pImagePnl);

			// monsters, queens and sprites
			MarkControl *pMarkCtl = new MarkControl(mpWnd);
			leader.mpMarkCtl = (void*)pMarkCtl;
			mET.addTrigger(pMarkCtl);
			pImagePnl->addControl(pMarkCtl);

			SpriteControl *pSpriteCtl = new SpriteControl(mpWnd);
			leader.mpSpriteCtl = (void*)pSpriteCtl;
			mET.addTrigger(pSpriteCtl);
			pImagePnl->addControl(pSpriteCtl);

			// control panels
			SolidPanel *pSolidPnl = new SolidPanel(mpWnd, 300, 0, 200, 500);
			mDT.addTrigger(pSolidPnl);

			MessagePanel *pMessagePnl = new MessagePanel(mpWnd, 320, 20, 160, 310);
			leader.mpMessagePnl = (void*)pMessagePnl;
			mDT.addTrigger(pMessagePnl);

			Button *pBtn = new Button(mpWnd, 60, 360, 80, 30,
					L"开始比赛", MainScene::onClickStartGame);
			mET.addTrigger(pBtn);
			pSolidPnl->addControl(pBtn);

			pBtn = new Button(mpWnd, 60, 400, 80, 30,
					L"记录成绩", MainScene::onSave);
			mET.addTrigger(pBtn);
			pSolidPnl->addControl(pBtn);

			pBtn = new Button(mpWnd, 60, 440, 80, 30,
					L"直接返回", MainScene::onCancel);
			mET.addTrigger(pBtn);
			pSolidPnl->addControl(pBtn);

			// result panels
			TransparentImagePanel *pTIPnl = new TransparentImagePanel(mpWnd,
					200, 100, 400, 200, L"draw.bmp");
			leader.mpTriggerDraw = (void*)pTIPnl;
			mDT.addTrigger(pTIPnl);

			pTIPnl = new TransparentImagePanel(mpWnd,
					50, 100, 700, 200, L"1_win.bmp");
			leader.mpTrigger1Win = (void*)pTIPnl;
			mDT.addTrigger(pTIPnl);

			pTIPnl = new TransparentImagePanel(mpWnd,
					50, 100, 700, 200, L"2_win.bmp");
			leader.mpTrigger2Win = (void*)pTIPnl;
			mDT.addTrigger(pTIPnl);
		}

		static void onClickStartGame(Button *pButton)
		{
			if(leader.mMapIndexs.size() == 46)
				leader.mMapIndexs.clear();
			int mapIndex = rand()%46;
			while(leader.mMapIndexs.find(mapIndex) != leader.mMapIndexs.end())
				mapIndex = (mapIndex + 1)%46;
			leader.mMapIndexs.insert(mapIndex);
			leader.mMapIndex = mapIndex;
			leader.mMapBlank = rand()%8;
			((CoreControl*)leader.mpCoreCtl)->initGame();
			((CoreControl*)leader.mpCoreCtl)->startGame();
		}

		static void onSave(Button *pButton)
		{
			((FinalJudge*)leader.mpJudge)->setScore(
				leader.mGameIndex, leader.mScore1, leader.mScore2);
			((JudgeScene*)leader.mpJudgeScn)->attachToWindow();
		}

		static void onCancel(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->attachToWindow();
		}
};

int LogoControl::onMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
{
	if(mGameIndex < 0)
		return 0;

	int x = LOWORD(lParam);
	int y = HIWORD(lParam);
	if(mpPnl != NULL)
		mpPnl->WindowToPanel(x, y);
	bool inArea = (x > mX) && (x < mX + LOGO_WIDTH - 1) && (y > mY) && (y < mY + LOGO_HEIGHT - 1);

	if(inArea && (uMsg == WM_LBUTTONDOWN))
	{
		int gameIndex = mGameIndex;
		if(gameIndex < 4)
			gameIndex = (leader.mPage - 1)*3 + gameIndex;

		FinalJudge *pJudge = (FinalJudge*)leader.mpJudge;
		leader.mGameIndex = gameIndex;
		leader.mMapIndexs.clear();
		pJudge->getPlayer(gameIndex, leader.mPlayer1, leader.mPlayer2);
		if((leader.mPlayer1 == 0) || (leader.mPlayer2 == 0))
			return 0;
		leader.mScore1 = 0;
		leader.mScore2 = 0;
		snwprintf(leader.mFileName1, MAX_MESSAGE_LEN,
				L"Strategy%d/Strategy.exe", leader.mPlayer1);
		snwprintf(leader.mFileName2, MAX_MESSAGE_LEN,
				L"Strategy%d/Strategy.exe", leader.mPlayer2);

		((CoreControl*)leader.mpCoreCtl)->initGame();
		((MainScene*)leader.mpMainScn)->attachToWindow();

		return -1;
	}

	return 0;
}


/**
 * main
 */
int main(int argc, char *argv[])
{
	//FinalCore core;
	FinalCore core;
	leader.mpCore = (void*)&core;
	FinalJudge judge("config.txt");
	leader.mpJudge = (void*)&judge;

	Window wnd;
	leader.mpWnd = (void*)&wnd;

	alert(wnd.create(NULL, NULL, L"第5届新生C语言大赛决赛平台") != 0);
	alert(wnd.show(800, 600) != 0);

	JudgeScene judgeScn(&wnd);
	leader.mpJudgeScn = (void*)&judgeScn;
	MainScene mainScn(&wnd);
	leader.mpMainScn = (void*)&mainScn;
	judgeScn.init();
	mainScn.init();

	judgeScn.attachToWindow();
	alert(wnd.run() != 0);

	return EXIT_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -