首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

小弟我在编一个五子棋程序,不知道该如何判输赢,有没有什么简单的算法

2013-07-01 
我在编一个五子棋程序,不知道该怎么判输赢,有没有什么简单的算法?我的下棋原理很简单,棋盘是GDI绘图画出来

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

       

热点排行