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

📄 main.cpp

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <fstream>

using namespace std;

#include "GKL.h"

using namespace GKL;

#include "FinalCore.h"
#include "FinalJudge.h"


/**
 * for JudgeScene
 */

const int LOGO_WIDTH = 100;
const int LOGO_HEIGHT = 50;

class LogoControl: public virtual Control
{
	public:
		LogoControl(Window *pWnd, int x, int y, int playerIndex, int gameIndex):
			Control(pWnd, false, true),
			mX(x), mY(y),
			mPlayerIndex(playerIndex), mGameIndex(gameIndex), mLogoIndex(0)
	{
	}

		virtual ~LogoControl(void)
		{
		}

	protected:
		virtual int onDrawDetect(int &flagDraw)
		{
			int logoIndex = 0;
			if(mPlayerIndex > 0)
				logoIndex = ((FinalJudge*)leader.mpJudge)->getPlayer(mPlayerIndex);
			else if(mPlayerIndex > -12)
				logoIndex = ((FinalJudge*)leader.mpJudge)->
					getPlayer((leader.mPage - 1)*3 - mPlayerIndex);
			else
				logoIndex = ((FinalJudge*)leader.mpJudge)->
					getPlayer(12 + ((leader.mPage - 1)*2 - 12 - mPlayerIndex)%8);
			if(mLogoIndex != logoIndex)
			{
				mLogoIndex = logoIndex;
				if(flagDraw == DRAW_NONE)
					flagDraw = DRAW_NORMAL;
			}
			return 0;
		}

		virtual void reDraw(void)
		{
			if((mLogoIndex > 0) && (mLogoIndex <= 12))
			{
				BitBlt(mpPnl->gethMemDC(), mX, mY, LOGO_WIDTH, LOGO_HEIGHT,
						leader.mhLogoDC[mLogoIndex - 1], 0, 0, SRCCOPY);
			}
			else
			{
				RECT rect = {mX, mY, mX + LOGO_WIDTH, mY + LOGO_HEIGHT};
				HBRUSH hBr = CreateSolidBrush(0x000000);
				FillRect(mpPnl->gethMemDC(), &rect, hBr);
				DeleteObject(hBr);
			}
		}

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

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

	protected:
		int mX, mY;
		int mPlayerIndex, mGameIndex, mLogoIndex;
};

class ScoreControl: public virtual Control
{
	public:
		ScoreControl(Window *pWnd, int x1, int y1, int x2, int y2, int index):
			Control(pWnd, false, false),
			mX1(x1), mY1(y1), mX2(x2), mY2(y2),
			mIndex(index),
			mScore1(0), mScore2(0)
	{
	}

		virtual ~ScoreControl(void)
		{
		}

	protected:
		virtual int onDrawDetect(int &flagDraw)
		{
			unsigned char score1, score2;
			((FinalJudge*)leader.mpJudge)->getScore((leader.mPage - 1)*3 + mIndex, score1, score2);
			if((mScore1 != score1) || (mScore2 != score2))
			{
				mScore1 = score1;
				mScore2 = score2;
				if(flagDraw == DRAW_NONE)
					flagDraw = DRAW_NORMAL;
			}

			return 0;
		}

		virtual void reDraw(void)
		{
			TransparentBlt(mpPnl->gethMemDC(), mX1 + 37, mY1, 25, 50,
					leader.mhNumbersDC, mScore1*25, 0, 25, 50, 0x000000);
			TransparentBlt(mpPnl->gethMemDC(), mX2 + 37, mY2, 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:
		int mX1, mY1, mX2, mY2;
		int mIndex;
		unsigned char mScore1, mScore2;
};

class JudgeScene: public virtual Scene
{
	public:
		JudgeScene(Window *pWnd):
			Scene(pWnd),
			mDTGroupGame(false, true),
			mETGroupGame(false, true),
			mDTFinalGame(false, true),
			mETFinalGame(false, true),
			mDTContent(false, true),
			mETContent(false, true)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);

		leader.mhNumbersBmp = (HBITMAP)LoadImage(NULL, L"numbers_25x50.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(leader.mhNumbersBmp == NULL);

		leader.mhNumbersDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
		alert(leader.mhNumbersDC == NULL);

		leader.mhNumbersBmpOld= (HBITMAP)SelectObject(leader.mhNumbersDC, leader.mhNumbersBmp);

		for(int i=0; i<12; i++)
		{
			wchar_t fileName[MAX_MESSAGE_LEN];
			snwprintf(fileName, MAX_MESSAGE_LEN, L"./Strategy%d/logo.bmp", i + 1);

			leader.mhLogoBmp[i] = (HBITMAP)LoadImage(NULL, fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
			alert(leader.mhLogoBmp[i] == NULL);

			leader.mhLogoDC[i] = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
			alert(leader.mhLogoDC[i] == NULL);

			leader.mhLogoBmpOld[i]= (HBITMAP)SelectObject(leader.mhLogoDC[i], leader.mhLogoBmp[i]);
		}
	}

		virtual ~JudgeScene(void)
		{
			HBITMAP hNumbersBmp = (HBITMAP)SelectObject(leader.mhNumbersDC, leader.mhNumbersBmpOld);
			alert(leader.mhNumbersBmp != hNumbersBmp);

			DeleteObject(leader.mhNumbersBmp);
			DeleteDC(leader.mhNumbersDC);

			for(int i=0; i<12; i++)
			{
				HBITMAP hLogoBmp = (HBITMAP)SelectObject(leader.mhLogoDC[i], leader.mhLogoBmpOld[i]);
				alert(leader.mhLogoBmp[i] != hLogoBmp);

				DeleteObject(leader.mhLogoBmp[i]);
				DeleteDC(leader.mhLogoDC[i]);
			}
		}

	protected:
		virtual void onInit(void)
		{
			// group
			{
				ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 600, L"groupGame.bmp");
				mDTGroupGame.addTrigger(pImagePnl);

				int x[] = {
					175, 375, 175, 375, 175, 375, 575, 575};
				int y[] = {
					100, 100, 250, 250, 400, 400, 200, 350};
				int pi[] = {
					0, -1, -1, -2, -2, 0, -12, -15};
				int gi[] = {
					0, 0, 1, 1, 2, 2, -1, -1};
				for(int i=0; i<8; i++)
				{
					LogoControl *pLogoCtl = new LogoControl(mpWnd, x[i], y[i], pi[i], gi[i]);
					mETGroupGame.addTrigger(pLogoCtl);
					pImagePnl->addControl(pLogoCtl);
				}
				for(int i=0; i<3; i++)
				{
					ScoreControl *pScoreCtl = new ScoreControl(mpWnd,
							x[i*2], y[i*2] + 50, x[i*2 + 1], y[i*2 + 1] + 50, i);
					mETGroupGame.addTrigger(pScoreCtl);
					pImagePnl->addControl(pScoreCtl);
				}
			}

			// final
			{
				ImagePanel *pImagePnl = new ImagePanel(mpWnd, 0, 0, 800, 600, L"finalGame.bmp");
				mDTFinalGame.addTrigger(pImagePnl);
				LogoControl *pLogoCtl;

				for(int i=0; i<8; i++)
				{
					pLogoCtl = new LogoControl(mpWnd, 120, i*70 + 30, i + 12, -1);
					mETFinalGame.addTrigger(pLogoCtl);
					pImagePnl->addControl(pLogoCtl);
				}
				for(int i=0; i<4; i++)
				{
					pLogoCtl = new LogoControl(mpWnd, 290, i*140 + 65, i + 20, i + 12);
					mETFinalGame.addTrigger(pLogoCtl);
					pImagePnl->addControl(pLogoCtl);
				}

				pLogoCtl = new LogoControl(mpWnd, 460, 135, 24, 16);
				mETFinalGame.addTrigger(pLogoCtl);
				pImagePnl->addControl(pLogoCtl);
				pLogoCtl = new LogoControl(mpWnd, 460, 415, 25, 17);
				mETFinalGame.addTrigger(pLogoCtl);
				pImagePnl->addControl(pLogoCtl);

				pLogoCtl = new LogoControl(mpWnd, 630, 275, 26, 18);
				mETFinalGame.addTrigger(pLogoCtl);
				pImagePnl->addControl(pLogoCtl);
			}

			{
				SolidPanel *pSolidPnl = new SolidPanel(mpWnd, 0, 0, 50, 600, 0xCCCCCC);
				mDTContent.addTrigger(pSolidPnl);

				Button *pContentBtn = new Button(mpWnd, 20, 90, 30, 60, L"A组", JudgeScene::onClickPage1);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 150, 30, 60, L"B组", JudgeScene::onClickPage2);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 210, 30, 60, L"C组", JudgeScene::onClickPage3);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 270, 30, 60, L"D组", JudgeScene::onClickPage4);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 330, 30, 60, L"决赛", JudgeScene::onClickPage0);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 450, 30, 30, L"存储", JudgeScene::onClickSave);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);

				pContentBtn = new Button(mpWnd, 20, 480, 30, 30, L"读取", JudgeScene::onClickLoad);
				mETContent.addTrigger(pContentBtn);
				pSolidPnl->addControl(pContentBtn);
			}

			showPage(1);
		}

		void showPage(int page)
		{
			if((page >= 0) && (page < 5))
			{
				leader.mPage = page;

				mDT.clearTriggerList();
				mET.clearTriggerList();
				if(leader.mPage == 0)
				{
					mDT.addTrigger(&mDTFinalGame);
					mDT.addTrigger(&mDTContent);
					mET.addTrigger(&mETFinalGame);
					mET.addTrigger(&mETContent);
				}
				else
				{
					mDT.addTrigger(&mDTGroupGame);
					mDT.addTrigger(&mDTContent);
					mET.addTrigger(&mETGroupGame);
					mET.addTrigger(&mETContent);
				}

				refresh();
			}
		}

		static void onClickPage1(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->showPage(1);
		}

		static void onClickPage2(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->showPage(2);
		}

		static void onClickPage3(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->showPage(3);
		}

		static void onClickPage4(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->showPage(4);
		}

		static void onClickPage0(Button *pButton)
		{
			((JudgeScene*)leader.mpJudgeScn)->showPage(0);
		}

		static void onClickSave(Button *pButton)
		{
			int retVal = MessageBox(((Window*)leader.mpWnd)->gethWnd(),
					L"存储比赛数据,确定吗?", L"提示", MB_OKCANCEL | MB_ICONWARNING);
			if(retVal == IDOK)
			{
				((FinalJudge*)leader.mpJudge)->saveScores("scores.txt");

				// backup
				ifstream fin("scores.txt", ios::binary);
				ofstream fout("scores.log", ios::binary | ios::app);
				char ch;
				fin.read(&ch, 1);
				while(!fin.eof())
				{
					fout.write(&ch, 1);
					fin.read(&ch, 1);
				}
				fin.close();
				fout.close();
			}
		}

		static void onClickLoad(Button *pButton)
		{
			int retVal = MessageBox(((Window*)leader.mpWnd)->gethWnd(),
					L"读取比赛数据,确定吗?", L"提示", MB_OKCANCEL | MB_ICONWARNING);
			if(retVal == IDOK)
				((FinalJudge*)leader.mpJudge)->loadScores("scores.txt");
		}

	protected:
		Trigger mDTGroupGame;
		EventTrigger mETGroupGame;
		Trigger mDTFinalGame;
		EventTrigger mETFinalGame;
		Trigger mDTContent;
		EventTrigger mETContent;
};


/**
 * for MainScene
 */

const int MAP1_ORGX = 50, MAP1_ORGY = 50;
const int MAP2_ORGX = 550, MAP2_ORGY = 50;
const int CELL_WIDTH = 50;
const DWORD HALF_ROUND_TIME = 500;
const wchar_t *ACTION1[] =
{
	L"无",
	L"前进",
	L"快速前进",
	L"后退",
	L"左转",
	L"右转"
};
const wchar_t *ACTION2[] =
{
	L"无",
	L"前进",
	L"快速前进",
	L"后退",
	L"右转",
	L"左转"
};
const wchar_t *DIRECTION1[] =
{
	L"↑",
	L"→",
	L"↓",
	L"←"
};
const wchar_t *DIRECTION2[] =
{
	L"↑",
	L"←",
	L"↓",
	L"→"
};
enum
{
	SPRITE_STATE_RUNNING,
	SPRITE_STATE_READY
};

class MarkControl: public virtual Control
{
	public:
		MarkControl(Window *pWnd):
			Control(pWnd, false, false)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);

		mhMonsterBmp = (HBITMAP)LoadImage(NULL, L"monster.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(mhMonsterBmp == NULL);
		mhQueenBmp = (HBITMAP)LoadImage(NULL, L"queen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(mhQueenBmp == NULL);

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

		mhMonsterBmpOld = (HBITMAP)SelectObject(mhMonsterDC, mhMonsterBmp);
		mhQueenBmpOld = (HBITMAP)SelectObject(mhQueenDC, mhQueenBmp);
	}

		virtual ~MarkControl(void)
		{
			HBITMAP hMonsterBmp = (HBITMAP)SelectObject(mhMonsterDC, mhMonsterBmpOld);
			alert(mhMonsterBmp != hMonsterBmp);
			HBITMAP hQueenBmp = (HBITMAP)SelectObject(mhQueenDC, mhQueenBmpOld);
			alert(mhQueenBmp != hQueenBmp);

			DeleteObject(mhMonsterBmp);
			DeleteObject(mhQueenBmp);
			DeleteDC(mhMonsterDC);
			DeleteDC(mhQueenDC);
		}

		void setMapInfo(bool map[8][4], int destX, int destY)
		{
			for(int y=0; y<8; y++)
			{
				for(int x=0; x<4; x++)
				{
					if(map[y][x])
						mX[y] = x;
				}
			}
			mX[destY] = destX;
			mDestY = destY;

			showAll();
		}

		void setQueenInfo(bool queen[8])
		{
			for(int i=0; i<8; i++)
			{
				if(queen[i])
					mDestAlpha[i] = 255;
				else
					mDestAlpha[i] = 63;
			}
		}

		void showAll(void)
		{
			for(int i=0; i<8; i++)
			{
				mDestAlpha[i] = 255;
				mAlpha[i] = 256;
			}
		}

	protected:
		virtual int onDrawDetect(int &flagDraw)
		{
			const int ALPHA_STEP = 32;

			for(int i=0; i<8; i++)
			{
				if(mAlpha[i] != mDestAlpha[i])
				{
					if(mAlpha[i] < mDestAlpha[i])
					{
						mAlpha[i] += ALPHA_STEP;
						if(mAlpha[i] > mDestAlpha[i])
							mAlpha[i] = mDestAlpha[i];
					}
					else if(mAlpha[i] > mDestAlpha[i])
					{
						mAlpha[i] -= ALPHA_STEP;
						if(mAlpha[i] < mDestAlpha[i])
							mAlpha[i] = mDestAlpha[i];
					}

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

			return 0;
		}

		virtual void reDraw(void)
		{
			BLENDFUNCTION bf;
			bf.BlendOp = AC_SRC_OVER;
			bf.BlendFlags = 0;
			bf.AlphaFormat = 0;

			for(int y=0; y<8; y++)
			{
				bf.SourceConstantAlpha = mAlpha[y];
				AlphaBlend(mpPnl->gethMemDC(), MAP1_ORGX + mX[y]*CELL_WIDTH, MAP1_ORGY + y*CELL_WIDTH,
						CELL_WIDTH, CELL_WIDTH, (y == mDestY) ? mhQueenDC : mhMonsterDC,
						0, 0, CELL_WIDTH, CELL_WIDTH, bf);
				AlphaBlend(mpPnl->gethMemDC(), MAP2_ORGX + (3 - mX[y])*CELL_WIDTH, MAP2_ORGY + y*CELL_WIDTH,
						CELL_WIDTH, CELL_WIDTH, (y == mDestY) ? mhQueenDC : mhMonsterDC,
						0, 0, CELL_WIDTH, CELL_WIDTH, bf);
			}
		}

		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;
		}

⌨️ 快捷键说明

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