zoukankan      html  css  js  c++  java
  • C# winform GDI+ 五子棋 (一):基本界面和胜负判断

    0
    棋盘和棋子采用GDI+画上去的。棋盘18*18。棋子是用DrawElipse画的,白棋和黑棋分两个List集合存储,方便判断五子连线的情况。
    主要说一下,五子连线的思路,把集合按行和按列以及按正斜和反斜进行分组。然后在依次遍历被分组的集合,如果其中有一个集合出现了5子相连的情况就胜利。而五子相连的判断是:通过判断前一个和后一个棋子的距离是否是等于棋盘的格子宽度。按行列分组好判断,就 x y相等的分别分组。但是正斜和反斜的分组,我接用的是一元一次方程来做的。详细如代码所示:
    private bool IsWin(List<Point> pt)
            {
                bool isWin = false;
                //
                var yGroup=pt.GroupBy(p => p.Y);
                foreach (var h in yGroup)
                {
                    var lst = h.ToList().Select(a => a.X).ToList();
                    lst.Sort();
    
                    if (lst.Count < 5)
                    {
                        continue;
                    }
                    int hasCount = 1;
                    
                    for (int j = 0; j < lst.Count; j++)
                    {
                        var x=lst[j]; 
                        for (int m = j+1; m <lst.Count&&m< j+5; m++)
                        {
    
                            var xNext=lst[m];
    
                            if (xNext - x <= 30*(hasCount))
                            {
                                hasCount++;
                            }
                            else
                            {
                                hasCount = 1;
                                break;
                            }
    
                            if (hasCount == 5)
                            {
                                return true;
                            }
    
                        }
    
                        if (hasCount != 5)
                        {
                            hasCount = 1;
                        }
                    }
                    
                }
    
                //
                var xGroup=pt.GroupBy(p => p.X);
                foreach (var z in xGroup)
                {
                    var lst = z.ToList().Select(a => a.Y).ToList();
                    lst.Sort();
    
                    if (lst.Count < 5)
                    {
                        continue;
                    }
                    int hasCount = 1;
    
                    for (int j = 0; j < lst.Count; j++)
                    {
                        var y = lst[j];
                        for (int m = j + 1; m < lst.Count && m < j + 5; m++)
                        {
    
                            var yNext = lst[m];
    
                            if (yNext - y <= 30 * (hasCount))
                            {
                                hasCount++;
                            }
                            else
                            {
                                hasCount = 1;
                                break;
                            }
    
                            if (hasCount == 5)
                            {
                                return true;
                            }
    
                        }
    
                        if (hasCount != 5)
                        {
                            hasCount = 1;
                        }
                    }
    
                }
    
    
                for (int b = -30*18; b < 30*18; b+=30)
                {
                    var lst = pt.Where(a => -1 * a.Y == -1 * a.X + b).Select(a => a.X).ToList();
                    lst.Sort();
    
                    if (lst.Count < 5)
                    {
                        continue;
                    }
                    int hasCount = 1;
    
                    for (int j = 0; j < lst.Count; j++)
                    {
                        var y = lst[j];
                        for (int m = j + 1; m < lst.Count && m < j + 5; m++)
                        {
    
                            var yNext = lst[m];
    
                            if (yNext - y <= 30 * (hasCount))
                            {
                                hasCount++;
                            }
                            else
                            {
                                hasCount = 1;
                                break;
                            }
    
                            if (hasCount == 5)
                            {
                                return true;
                            }
    
                        }
    
                            hasCount = 1;           
                    }
                }
    
                //右斜
    
                for (int mq=1;mq<18*18;mq++)
                {
                    int b = mq * -10;
                    var lst = pt.Where(a =>-1*a.Y ==   a.X + b).Select(a => a.X).ToList();
                    lst.Sort();
    
                    if (lst.Count < 5)
                    {
                        continue;
                    }
                    int hasCount = 1;
    
                    for (int j = 0; j < lst.Count; j++)
                    {
                        var y = lst[j];
                        for (int m = j + 1; m < lst.Count && m < j + 5; m++)
                        {
    
                            var yNext = lst[m];
    
                            if (yNext - y <= 30 * (hasCount))
                            {
                                hasCount++;
                            }
                            else
                            {
                                hasCount = 1;
                                break;
                            }
    
                            if (hasCount == 5)
                            {
                                return true;
                            }
    
                        }
    
                        hasCount = 1;
                    }
                }
                return isWin;
    
            }
    View Code
     
    这是简单的适合人和人玩的方法。
    目前,想加入人机,想采用极大极小alphabat剪枝的博弈算法来做机器人,但对我来说,有点复杂,肯定要花很多时间的,我没有信心完成,所以就没做了。还想做局域网对战,以前做过一次五子棋局域网的,记得是在18年的时候,是用button作为棋子,下个子要等很久,而且五连判断还没写好。比起那时候自己做的五子棋,这次这个要好很多了。
    我发现在网络里,能发现无数个比自己厉害的人,特别是在B站,博客园什么的,很多厉害的人,他们在大学时候甚至才高中,初中,小学,就已经实现了我现在想实现的五子棋功能。我觉得,自己虽然已毕业多年,但在编程方面确实要下功夫才行。
  • 相关阅读:
    文档重复检测软件 DuplicateDetector
    Afinal 0.2.1 发布 Android的快速开发框架
    CshBBrain 4.0 发布,高性能WebSocket服务器
    英特尔的 C++ 编译器发布 13.0 版本
    Perl 5.16.2 发布
    OpenBSD 5.2 发布
    Webconverger 15.1 发布,适合网吧的 Linux
    Spring Framework 3.2 RC1 发布
    Postgres 9.2 新特性之:范围类型 (Range Types)
    Expression Blend实例中文教程系列文章汇总
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/15778739.html
Copyright © 2011-2022 走看看