自己写了一个五子棋的人人对战赢棋判断算法,写的时候由于比较匆忙,还存在一些bug,测试了几遍,好像在棋盘边缘下棋的时候会出错。
五子棋,棋盘为15X15,黑棋先下。
我的算法思想是:每走一步棋子,对其进行进行八个方向判断,然后对水平,垂直,两条对角线上的连子数进行相加,为五则当前玩家胜利。
下面是我的核心算法
/*
* 函数名称:GetWestSouthNum(CChess nCh,int i,int j)
* 函数介绍:判断右下方和左上方同一颜色相连棋子个数
* 输入参数:nCh,i,j(最后输入的一个棋子的对象,棋盘坐标)
* 输出参数:int
* 返回值 :t表示连子个数
*/
int CManagers::GetEastSouthNum(int state,int i,int j)
{
int tempx,tempy;
int t,t1,t2;//t为连子个数
t1=0;
t2=0;
//bool flag = true;
/右下方判断相连个数
tempx = i+1;
tempy = j+1;
if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t1++; //棋子相连一次t自增一次
tempx++;
tempy++;
}
else
break;
}
}
tempx = i-1;
tempy = j-1;
//判断左上方棋子连续的个数
if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1&&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t2++; //棋子相连一次t自加一次
tempx--;
tempy--;
}
else
break;
}
}
t = t1 + t2;
return t;
}
/*
* 函数名称:GetWestSouthNum(CChess nCh,int i,int j)
* 函数介绍:判断右上方和左下方同一颜色相连棋子个数
* 输入参数:nCh,i,j(最后输入的一个棋子的对象,棋盘坐标)
* 输出参数:int
* 返回值 :t表示连子个数
*/
int CManagers::GetWestSouthNum(int state,int i,int j)
{
int tempx,tempy;
int t,t1,t2;//t为连子个数
t1=0;
t2=0;
//bool flag = true;
/右上方判断相连个数
tempx = i+1;
tempy = j-1;
if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t1++; //棋子相连一次t自增一次
tempx++;
tempy--;
}
else
break;
}
}
tempx = i-1;
tempy = j+1;
//判断左下方棋子连续的个数
if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t2++; //棋子相连一次t自减一次
tempx--;
tempy++;
}
else
break;
}
}
t = t1 + t2;
return t;
}
/判断水平方向连子个数
int CManagers::GetHorizontalNum(int state,int i,int j)
{
int tempx,tempy;
int t,t1,t2;//t为连子个数
t1=0;
t2=0;
//bool flag = true;
/左边水平方向判断相连个数
tempx = i-1;
tempy = j;
if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t1++; //棋子相连一次t自增一次
tempx--;//左边水平方向x坐标不变,y坐标自减1
//tempy--;
}
else
break;
}
}
tempx = i+1;
tempy = j;
//判断右边水平方向棋子连续的个数
if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t2++; //棋子相连一次t自减一次
//右边水平方向x++,y不变
tempx++;
//tempy++;
}
else
break;
}
}
t = t1 + t2;
return t;
}
/判断垂直方向连子个数
int CManagers::GetVerticaltalNum(int state,int i,int j)
{
int tempx,tempy;
int t,t1,t2;//t为连子个数
t1=0;
t2=0;
//bool flag = true;
/上面垂直方向判断相连个数
tempx = i;
tempy = j-1;
if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t1++; //棋子相连一次t自增一次
//tempx--;//上边垂直方向x坐标不变,y坐标自减1
tempy--;
}
else
break;
}
}
tempx = i;
tempy = j+1;
//判断下面垂直方向棋子连续的个数
if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
{
for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
{
if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
{
t2++; //棋子相连一次t自减一次
//右边水平方向x++,y不变
tempy++;
}
else
break;
}
}
t = t1 + t2;
return t;
}