您的位置:首页 > 其它

基于MFC+vs 2003的人人对战五子核心算法

2010-07-23 13:25 495 查看
自己写了一个五子棋的人人对战赢棋判断算法,写的时候由于比较匆忙,还存在一些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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: