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