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

📄 finalcore.cpp

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 CPP
字号:
#include "FinalCore.h"

FinalCore::FinalCore(DEBUGFUNCTION debugFunction/* = NULL*/):
	mState(CORE_STATE_NULL),
	mpRole1(NULL), mpRole2(NULL), mpRoleActive(NULL),
	mDebugFunction(debugFunction)
{
	setMap(0, 0);
}

FinalCore::~FinalCore(void)
{
	release();
}

void FinalCore::setMap(unsigned char index, unsigned char blank)
{
	const unsigned long AllMaps[46] = {
		0xa00a5005, 0x82186005, 0x09c03006, 0x81186006,
		0x24c01209, 0x05c0300a, 0xa014410a, 0x0530c00a,
		0x11c0220c, 0x9003600c, 0x5003a00c, 0x44882211,
		0x48812412, 0x84214812, 0x05886012, 0xa00a4114,
		0x0a816014, 0x41288214, 0x410aa014, 0x24c00318,
		0x42812418, 0x2403c018, 0x90420924, 0x09c01224,
		0x81421824, 0x90034824, 0x09429024, 0x82500528,
		0x50810628, 0x82144128, 0x05508228, 0x0ac00530,
		0x09c00630, 0x88034430, 0xa0110648, 0x21841248,
		0x12812448, 0xa00c0350, 0xa0030c50, 0x05288250,
		0x81180660, 0x90030c60, 0x22114488, 0x24034890,
		0x411806a0, 0x05500aa0};

	release();

	index %= 46; blank %= 8;
	mMapIndex = index;

	unsigned long map = AllMaps[index];
	for(int x=0; x<4; x++)
	{
		for(int y=0; y<8; y++)
		{
			mMap[y][x] = map & 0x1 > 0;
			if(mMap[y][x] && (y == blank))
			{
				mDestX = x;
				mDestY = y;
				mMap[y][x] = false;
			}
			map >>= 1;
		}
	}

	mState = CORE_STATE_NULL;
}

void FinalCore::getMapInfo(bool map[8][4], unsigned char &index, unsigned char &destX, unsigned char &destY)
{
	for(int y=0; y<8; y++)
	{
		for(int x=0; x<4; x++)
			map[y][x] = mMap[y][x];
	}
	index = mMapIndex;
	destX = mDestX;
	destY = mDestY;
}

void FinalCore::getQueenInfo(bool queen[8])
{
	for(int i=0; i<8; i++)
		queen[i] = mQueen[i] <= OFF_ROUND;
}

void FinalCore::debugOffQueen(unsigned char y)
{
	if(mQueen[y] == 0)
		mQueen[y] = OFF_ROUND*2;
}

int FinalCore::initRoles(wchar_t *fileName1, wchar_t *fileName2)
{
	if((fileName1 == NULL) || (fileName2 == NULL))
		return -1;

	release();

	mpRole1 = new FinalRole(mDebugFunction);
	if(mpRole1->init(fileName1) < 0)
	{
		mState = CORE_STATE_2_WIN;
		release();
		return -1;
	}

	mpRole2 = new FinalRole(mDebugFunction);
	if(mpRole2->init(fileName2) < 0)
	{
		mState = CORE_STATE_1_WIN;
		release();
		return -1;
	}

	mState = CORE_STATE_READY;

	return 0;
}

int FinalCore::startGame(void)
{
	if(mState != CORE_STATE_READY)
		return -1;

	if(mpRole1->start() < 0)
	{
		mState = CORE_STATE_2_WIN;
		release();
		return -1;
	}
	if(mpRole2->start() < 0)
	{
		mState = CORE_STATE_1_WIN;
		release();
		return -1;
	}
	if(mpRole2->pause() < 0)
	{
		mState = CORE_STATE_1_WIN;
		release();
		return -1;
	}

	mpRoleActive = mpRole1;

	mRound = 0;
	mAction1 = 0; mAction2 = 0;
	mX1 = 3; mY1 = 8; // 初始位置为地图右下角之外
	mDirection1 = 0; // 初始方向为上
	mX2 = 3; mY2 = 8;
	mDirection2 = 0;
	for(int i=0; i<8; i++)
		mQueen[i] = 0;

	mState = CORE_STATE_RUNNING;

	return 0;
}

int FinalCore::switchRole(void)
{
	if(mState != CORE_STATE_RUNNING)
		return -1;

	if(mpRoleActive == mpRole1)
	{
		if((mpRole1->getState() == ROLE_STATE_RUNNING) &&
				(mpRole1->pause() < 0))
		{
			mState = CORE_STATE_2_WIN;
			release();
			return -1;
		}
		mpRoleActive = mpRole2;
		if((mpRole2->getState() == ROLE_STATE_RUNNING) &&
				(mpRole2->resume() < 0))
		{
			mState = CORE_STATE_1_WIN;
			release();
			return -1;
		}
	}
	else
	{
		if((mpRole2->getState() == ROLE_STATE_RUNNING) &&
				(mpRole2->pause() < 0))
		{
			mState = CORE_STATE_1_WIN;
			release();
			return -1;
		}
		mpRoleActive = mpRole1;
		if((mpRole1->getState() == ROLE_STATE_RUNNING) &&
				(mpRole1->resume() < 0))
		{
			mState = CORE_STATE_2_WIN;
			release();
			return -1;
		}
	}

	return 0;
}

unsigned char FinalCore::nextRound(unsigned long &round,
		unsigned char &action1, unsigned char &x1, unsigned char &y1, unsigned char &direction1,
		unsigned char &action2, unsigned char &x2, unsigned char &y2, unsigned char &direction2)
{
	round = mRound;
	action1 = mAction1;
	x1 = mX1; y1 = mY1;
	direction1 = mDirection1;
	action2 = mAction2;
	x2 = mX2; y2 = mY2;
	direction2 = mDirection2;

	if(mState != CORE_STATE_RUNNING)
		return mState;

	mpRoleActive->pause();

	if((mpRole1->getState() == ROLE_STATE_RUNNING) &&
			(mpRole2->getState() == ROLE_STATE_RUNNING))
	{
		mRound++;
		if(mRound > MAX_ROUND)
		{
			mState = CORE_STATE_DRAW;
			release();
			return mState;
		}

		for(int i=0; i<8; i++)
		{
			if(mQueen[i] > 0)
				mQueen[i]--;
		}

		unsigned char action;

		mpRole1->getAction(action);
		if(actAction(action, mAction1, mX1, mY1, mDirection1) < 0)
			mpRole1->setState(false);
		mpRole2->getAction(action);
		if(actAction(action, mAction2, mX2, mY2, mDirection2) < 0)
			mpRole2->setState(false);

		round = mRound;
		action1 = mAction1;
		x1 = mX1; y1 = mY1;
		direction1 = mDirection1;
		action2 = mAction2;
		x2 = mX2; y2 = mY2;
		direction2 = mDirection2;
	}

	if(mpRole1->getState() == ROLE_STATE_FINISHED)
		mpRole1->setState((mX1 == mDestX) && (mY1 == mDestY));
	if(mpRole2->getState() == ROLE_STATE_FINISHED)
		mpRole2->setState((mX2 == mDestX) && (mY2 == mDestY));

	if(
			((mpRole1->getState() == ROLE_STATE_COMPLETED) &&
			 (mpRole2->getState() == ROLE_STATE_COMPLETED)) ||
			((mpRole1->getState() == ROLE_STATE_FAILED) &&
			 (mpRole2->getState() == ROLE_STATE_FAILED)) ||
			((mpRole1->getState() == ROLE_STATE_BAD) &&
			 (mpRole2->getState() == ROLE_STATE_BAD))
	  )
	{
		mState = CORE_STATE_DRAW;
		release();
		return mState;
	}

	if(
			(mpRole1->getState() == ROLE_STATE_COMPLETED) ||
			(mpRole2->getState() == ROLE_STATE_FAILED) ||
			(mpRole2->getState() == ROLE_STATE_BAD)
	  )
	{
		mState = CORE_STATE_1_WIN;
		release();
		return mState;
	}
	if(
			(mpRole2->getState() == ROLE_STATE_COMPLETED) ||
			(mpRole1->getState() == ROLE_STATE_FAILED) ||
			(mpRole1->getState() == ROLE_STATE_BAD)
	  )
	{
		mState = CORE_STATE_2_WIN;
		release();
		return mState;
	}

	if((mX1 == mX2) && (mY1 == mY2))
	{
		if(mMap[mY1][mX1])
		{
			if(mQueen[mY1] <= OFF_ROUND)
			{
				mpRole1->feedback(true, mX1, mY1, mDirection1, mX2, mY2, mDirection2);
				mpRole2->feedback(true, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
				if(mQueen[mY1] == 0)
					mQueen[mY1] = OFF_ROUND*2;
			}
			else
			{
				mpRole1->feedback(false, mX1, mY1, mDirection1, mX2, mY2, mDirection2);
				mpRole2->feedback(false, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
			}
		}
		else
		{
			mpRole1->feedback(false, mX1, mY1, mDirection1, mX2, mY2, mDirection2);
			mpRole2->feedback(false, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
		}
	}
	else
	{
		if(mMap[mY1][mX1])
		{
			if(mQueen[mY1] <= OFF_ROUND)
			{
				mpRole1->feedback(true, mX1, mY1, mDirection1, mX2, mY2, mDirection2);
				if(mQueen[mY1] == 0)
					mQueen[mY1] = OFF_ROUND*2;
			}
			else
				mpRole1->feedback(false, mX1, mY1, mDirection1, mX2, mY2, mDirection2);
		}
		else
			mpRole1->feedback(false, mX1, mY1, mDirection1, mX2, mY2, mDirection2);

		if(mMap[mY2][mX2])
		{
			if(mQueen[mY2] <= OFF_ROUND)
			{
				mpRole2->feedback(true, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
				if(mQueen[mY2] == 0)
					mQueen[mY2] = OFF_ROUND*2;
			}
			else
				mpRole2->feedback(false, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
		}
		else
			mpRole2->feedback(false, mX2, mY2, mDirection2, mX1, mY1, mDirection1);
	}

	mpRoleActive->resume();

	return mState;
}

int FinalCore::actAction(unsigned char action, unsigned char &actionOld,
		unsigned char &x, unsigned char &y, unsigned char &direction)
{
	char tx = x, ty = y; // 没有用 unsigned ,目的是检测出界

	if(actionOld == GO_FORWARD_FAST)
	{
		// 共同的动作
		switch(direction)
		{
			case 0:
				ty--;
				break;
			case 1:
				tx++;
				break;
			case 2:
				ty++;
				break;
			case 3:
				tx--;
				break;
		}
		// 补上的动作
		switch(action)
		{
			case GO_FORWARD_FAST:
				switch(direction)
				{
					case 0:
						ty--;
						break;
					case 1:
						tx++;
						break;
					case 2:
						ty++;
						break;
					case 3:
						tx--;
						break;
				}
				break;
			case TURN_LEFT:
				direction = (direction + 3) % 4;
				break;
			case TURN_RIGHT:
				direction = (direction + 1) % 4;
				break;
			default:
				break;
		}
	}
	else
	{
		switch(action)
		{
			case GO_FORWARD:
				switch(direction)
				{
					case 0:
						ty--;
						break;
					case 1:
						tx++;
						break;
					case 2:
						ty++;
						break;
					case 3:
						tx--;
						break;
				}
				break;
			case GO_FORWARD_FAST:
				switch(direction)
				{
					case 0:
						ty -= 2;
						break;
					case 1:
						tx += 2;
						break;
					case 2:
						ty += 2;
						break;
					case 3:
						tx -= 2;
						break;
				}
				break;
			case GO_BACKWARD:
				switch(direction)
				{
					case 0:
						ty++;
						break;
					case 1:
						tx--;
						break;
					case 2:
						ty--;
						break;
					case 3:
						tx++;
						break;
				}
				break;
			case TURN_LEFT:
				direction = (direction + 3) % 4;
				break;
			case TURN_RIGHT:
				direction = (direction + 1) % 4;
				break;
			default:
				break;
		}
	}
	actionOld = action;
	if((tx < 0) || (tx > 3) || (ty < 0) || (ty > 7))
		return -1;

	x = (unsigned char)tx;
	y = (unsigned char)ty;

	return 0;
}

void FinalCore::release(void)
{
	if(mpRole1 != NULL)
	{
		delete mpRole1;
		mpRole1 = NULL;
	}
	if(mpRole2 != NULL)
	{
		delete mpRole2;
		mpRole2 = NULL;
	}
	mpRoleActive = NULL;
}

⌨️ 快捷键说明

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