www.pudn.com > Five_QT_by_CT.rar > gamelogic.cpp
#include "gamelogic.h"
GameLogic::GameLogic()
{
mGameState='f';
mMyside=QString("null");
mCurrentTurn=QString("black");
for(int i=0;i<15; i++)
for(int j=0; j<15; j++)
mChessBoard[i][j]=-1;
}
void GameLogic::clearChessInfo()
{
mChessRecord.clearRecord();
int i, j;
for(i=0; i<15; i++)
for(j=0; j<15; j++)
mChessBoard[i][j]=-1;
mCurrentTurn=QString("black");
}
//需要维护当前自己是哪方,是到谁走,k=1表示是自己下的,k=0表示是对方下的
bool GameLogic::CanPut(QPoint PutPos, int k)
{
//如果棋子位置不合法
if(PutPos.x()<=0 || PutPos.y()<=0 || PutPos.x()>15 || PutPos.y()>15)
{
printf("in GameLogic::CanPut: invalid chesspoint %d,%d\n", PutPos.x(), PutPos.y());
return false;
}
if(mGameState!='p')
{
printf("in gamelogic :: canput ,game not started!\n");
return false;
}
else
printf("in gamelogic :: canput ,game started!\n");
//判断棋盘上该位置是否有棋子
if(mChessBoard[PutPos.x()][PutPos.y()]!=-1)
{
printf("in gamelogic :: canput, already have chess\n");
return false;
}//
if(k==1)//如果是自己下的
{
//不到自己
if(mCurrentTurn.compare(mMyside)!=0)
{
printf("not your turn! :mCurrentTurn%s, mMyside%s\n",mCurrentTurn.ascii(), mMyside.ascii());
return false;
}
else
return true;
}
else if(k==0)//如果是对方下的
{
//不到对方
if(mCurrentTurn.compare(mMyside)==0)
{
printf("not your turn!\n");
return false;
}
else
return true;
}
}
//以x,y点为中心,计算direction 方向的side方棋子个数
int GameLogic :: CountStones(int x, int y ,int side, int direction)
{
int count=1;
int rx,ry;
int dx=0,dy=0;
rx=x;ry=y;
switch(direction)
{
case 0://horizontal ' - '
{
dx=-1; dy=0;
break;
}
case 1://vertical ' | '
{
dx=0; dy=-1;
break;
}
case 2://右下斜 '\'
{
dx=-1; dy=-1;
break;
}
case 3:// '/'
{
dx=-1;dy=1;
break;
}
}
//每条线上左右两个方向
for(int i=0; i<2; i++);
{
while(rx+dx>=0&&rx+dx<=15&&ry+dy>=0&&ry+dy<=15&&mChessBoard[rx+dx][ry+dy]==side)
{
rx+=dx;
ry+=dy;
count++;
}
if(dx==-1&&dy==0)
{
dx=1;
}
else if(dx==0&&dy==-1)
{
dy=1;
}
else if(dx==-1&&dy==-1)
{
dx=1;
dy=1;
}
else
{
dx=1;
dy=-1;
}
rx=x;
ry=y;
}
return count;
}
//判断输赢,调用countstones
bool GameLogic :: JudgeWin(int x, int y, int s)
{
if(CountStones(x, y, s, 0)==5
||CountStones(x, y, s, 1)==5
||CountStones(x, y, s, 2)==5
||CountStones(x, y, s, 3)==5)
return true;
else
return false;
}
void GameLogic :: setTurn(QString side)
{
mCurrentTurn=side;
}
QString GameLogic :: getTurn()
{
return mCurrentTurn;
}
bool GameLogic :: PutNewChess(int x, int y, int k)
{
int s;
QString nextturn;
if(mCurrentTurn.compare(QString("white"))==0)
{
nextturn=QString("black");
s=0;
}
else if(mCurrentTurn.compare(QString("black"))==0)
{
nextturn=QString("white");
s=1;
}
else
{
printf("in GameLogic: putnewchess, mCurrentTurn %s\n", mCurrentTurn.ascii());
return false;
}
if(CanPut(QPoint(x, y), k))
{
mChessRecord.AddRecord(QPoint(x, y),s);
mChessBoard[x][y]=s;
mCurrentTurn=nextturn;
return true;
}
else
{
printf("in GameLogic: putnewchess, canput return false \n");
return false;
}
return true;
}