📄 finalcore.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 + -