基于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;
}
五子棋,棋盘为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;
}
相关文章推荐
- 基于MFC+vs 2003的人人对战五子核心算法
- 五子棋 人人对战
- Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析
- 基于VS2013MFC的JSON文件的写入和解析
- VS2012 基于对话框 MFC应用程序 重置工具箱
- 五子棋核心算法
- VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法](介绍)
- Symbian OS开发入门(一) :基于VS.Net 2003的Symbian开发环境的准备
- 五子棋-人人对战(一)
- VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]
- VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]
- 五子棋_人人对战_小结
- 基于白点检测的数码相机自动白平衡算法实现(Opencv+vs)
- 基于VS.Net 2003的S60开发环境的搭建
- 基于VS.Net 2003的Symbian开发环境的准备
- TrafficAssistSys——基于VS2013_MFC
- vs.net2005与ie7冲突(不能通过向导创建基于MFC的移动设备工程)
- 基于VS.NET 2003S60开发环境的搭建
- VS2013/MFC基于对话框编程: [1]创建MFC工程
- VS2013/MFC基于对话框编程:[5]按钮的使用