zoukankan      html  css  js  c++  java
  • 一个连珠五子棋的算法

       
    为了实现连珠六子及六子以上自杀的功能,中间没有使用break及return 语句,执行效率有所降低。

    注:1、使用的是C#语法。
      2、如果“五(子)、六(子)连”按自杀处理。
      3、三三禁军功能还没有实现,以后会进一步完善。

    晚辈学习C#的时间不长,还望前辈们多多指教。

       /// <summary>
            /// 是否赢
            /// </summary>
            /// <param name="arrCol">棋盘中的所有棋子</param>
            /// <param name="p">所下棋子的最后一个位置</param>
            /// <returns>是否赢</returns>
            public virtual bool Win(Color[,] arrCol,Point p,out int maxNum)
            {
                maxNum = 0;//标识连续白子或者黑子的最大个数,连续五子取胜,连续六子及六子以上视为自杀
                bool bo = false;//标识是否取胜
                int lenX = arrCol.GetLength(0) - 1;//棋盘行边界索引
                int lenY = arrCol.GetLength(1) - 1;//棋盘列边界索引
                int num = 0;//临时标识变量
                Color col = arrCol[p.X, p.Y];//所下棋子的最后一个棋子的颜色

                for (int i = 0; i < 9; i++)//从左上角 到 右下角 取临界值在九子范围内进行搜索、提高效率
                {
                    if ((p.X - 4 + i) < 0 || (p.X - 4 + i) > lenX)//判断是否出界
                        continue;
                    if ((p.Y - 4 + i) < 0 || (p.Y - 4 + i) > lenY)//判断是否出界
                        continue;
                    if (arrCol[p.X - 4 + i, p.Y - 4 + i] == col)//如果是同一种颜色的棋子,则连续子的个数加一;反之,归零(*****)
                    {
                        num++;
                        if (num == 5)//标识五子胜
                        {
                            if (num > maxNum)//(*****)
                            {
                                maxNum = num;
                            }
                            bo = true;
                        }
                        else if(num > 5)//标识六子及六子以上自杀
                        {
                            if (num > maxNum)//(*****)
                            {
                                maxNum = num;
                            }
                            bo = false;
                        }
                    }
                    else
                        num = 0;//(*****)
                }
                num = 0;//归零(*****)

                /*几乎所有注释下同*/
                for (int i = 0; i < 9; i++)//从 左下角 到 右上角
                {
                    if ((p.X + 4 - i) < 0 || (p.X + 4 - i) > lenX)
                        continue;
                    if ((p.Y - 4 + i) < 0 || (p.Y - 4 + i) > lenY)
                        continue;
                    if (arrCol[p.X + 4 - i, p.Y - 4 + i] == col)
                    {
                        num++;
                        if (num == 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = true;
                        }
                        else if (num > 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = false;
                        }
                    }
                    else
                        num = 0;
                }
                num = 0;
                for (int i = 0; i < 9; i++)//从 左 到 右
                {
                    if ((p.X - 4 + i) < 0 || (p.X - 4 + i) > lenX)
                        continue;
                    if (arrCol[p.X - 4 + i, p.Y] == col)
                    {
                        num++;
                        if (num == 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = true;
                        }
                        else if (num > 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = false;
                        }
                    }
                    else
                        num = 0;
                }
                num = 0;
                for (int i = 0; i < 10; i++)//从 上 到 下
                {
                    if ((p.Y - 4 + i) < 0 || (p.Y - 4 + i) > lenY)
                        continue;
                    if (arrCol[p.X, p.Y - 4 + i] == col)
                    {
                        num++;
                        if (num == 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = true;
                        }
                        else if (num > 5)
                        {
                            if (num > maxNum)
                            {
                                maxNum = num;
                            }
                            bo = false;
                        }
                    }
                    else
                        num = 0;
                }

                return bo;
            }

    今后会实现“三三自杀” 的算法!



    返回导读目录,阅读更多随笔



    分割线,以下为博客签名:

    软件臭虫情未了
    • 编码一分钟
    • 测试十年功


    随笔如有错误或不恰当之处、为希望不误导他人,望大侠们给予批评指正。

  • 相关阅读:
    WebService 安静点
    爬虫(一) 安静点
    wpf(三) 安静点
    wpf问题解决链接 安静点
    wpf(一) 安静点
    webapi(一) 安静点
    WPF(二)之为对象属性赋值 安静点
    wpf(四) 安静点
    云计算实验二 Docker实验docker安装
    新闻分类中文分词+词云展示(2)
  • 原文地址:https://www.cnblogs.com/08shiyan/p/shiyan.html
Copyright © 2011-2022 走看看