我在编一个五子棋程序,不知道该怎么判输赢,有没有什么简单的算法?
我的下棋原理很简单,棋盘是GDI绘图画出来的,直接画在主窗体上
棋子也是用GDI画出来的
关键是我动用了一个二维数组:int [,] intersection = new int[15,15] (我的棋盘是15*15的)和两个变量intersectionx和intersectiony,intersectionx和intersectiony其实是经过数学处理,把鼠标坐标转换成棋盘坐标,这也意味着它们的取值范围为1到15
在主窗体Form_Load事件里,我运用双重循环先给intersection数组全部赋值-1,代表该处无子
然后再窗体单击事件里,先判断鼠标点击的地方在不在棋盘区域里,在的话则:
判断intersection[intersectionx-1, intersectiony-1]处是不是-1,如果是,则:
如果下的黑子,则把intersection[intersectionx-1, intersectiony-1]赋值1
如果下的是白子,则把intersection[intersectionx-1, intersectiony-1]赋值0
如果intersection[intersectionx-1, intersectiony-1]处不是-1则不做处理
之所以intersectionx和intersectiony要减一是因为数组下标是从0开始,而intersectionx和intersectiony的取值范围为1到15。
现在问题来了,我该怎样利用数组intersection来判断五子相连呢?
附上部分代码:
算法 五子棋
public partial class MainForm : Form
{
//声明全局变量,用于“交替落子和回合计数”代码段
int roundblack = 1; //黑子判断
int roundwhite = 0; //白子判断
int roundcount = 0; //回合计数器
int intersectionx = 0;
int intersectiony = 0;
int[,] intersection = new int[15, 15];
public void MainForm_Click_1(object sender, EventArgs e)
{
if (intersectionx > 15 || intersectiony > 15)
{
return; //在棋盘界外,什么也不做
}
else if (intersectionx < 1 || intersectiony < 1)
{
return; //还是在棋盘界外,还是什么也不做
}
else
{
if (roundwhite < roundblack)
{
switch (intersection[intersectionx - 1, intersectiony - 1])
{
case -1:
piece.FillEllipse(firsthand, gridx, gridy, 18, 18); //下黑子,firsthand是solidbrush,gridx和gridy是开始绘图的点(要画的圆形外接矩形的左上角坐标)
intersection[intersectionx - 1, intersectiony - 1] = 1; //下黑子处改写值为1
roundwhite++;
roundcount++;
break;
default:
break;
}
intersection[intersectionx - 1, intersectiony - 1]
}
else
{
switch (intersection[intersectionx - 1, intersectiony - 1])
{
case -1:
piece.FillEllipse(nexthand, gridx, gridy, 18, 18); //下白子
intersection[intersectionx - 1, intersectiony - 1] = 0; //下白子处记为0
roundblack++;
roundcount++;
break;
default:
break;
}
}
}
flag=0;
for(j=0;j<15;j++)
if(a[i][j]==color){
flag++;
if (flag==5)
return true;}
else flag=0;
}
for(j=0;j<15;j++){
flag=0;
for(i=0;i<15;i++)
if(a[i][j]==color)
{flag++;
if(flag==5)
return true;}
else flag=0;
}
for(j=4;j<15;j++){
flag=0; int m=j;
for(i=0;i<=j;i++){
if(a[i][m--]==color){
flag++;
if(flag==5)
return true;}
else flag=0;}
}
for(j=14;j>=0;j--){
flag=0; int m=j;
for(i=0;i<=14-j;i++){
if(a[i][m++]==color){
flag++;
if(flag==5)
return true;}
else flag=0;}
}
for(i=14;i>=0;i--){
flag=0; int n=i;
for(j=0;j<15-i;j++){
if(a[n++][j]==color){
flag++;
if(flag==5)
return true;}
else flag=0;}
}
for(j=14;j>=0;j--){
flag=0; int m=j;
for(i=14;i>=j;i--){
if(a[i][m++]==color){
flag++;
if(flag==5)
return true;}
else flag=0;}
}
return false;}
}