读书人

小弟我在编一个五子棋程序不知道该如

发布时间: 2013-07-01 12:33:04 作者: rapoo

我在编一个五子棋程序,不知道该怎么判输赢,有没有什么简单的算法?
我的下棋原理很简单,棋盘是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;
}
}
}

算法 五子棋
[解决办法]
只看最后下的那个子就行了啊
[解决办法]
我想想,最后下子的坐标为中心,看八个方向,各有多少个连续的子,然后如果两个对称的方向加起来超过4个子,就赢了
[解决办法]
package chess;
public class Judge{//判断是否存在五子一条线
static boolean judge(int a[][],int color){
int i,j,flag;
for(i=0;i<15;i++){


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

读书人网 >C#

热点推荐