C#实现AI五子棋游戏的示例代码

 更新时间:2022年11月22日 15:57:03   作者:Csharp小记  
这篇文章主要为大家详细介绍了C#如何智能AI五子棋游戏中的人工下棋操作以及对应的机器操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

文章描述

关于简单的介绍,这篇就不赘述了,主要还是来写一下实际的人工下棋操作以及对应的机器操作的算法处理。

还是先大致说一下算法实现方式,我们之前写的五子棋大部分可能主要是基于机器算法做一个拦截操作,即判断横向、竖向、斜向、反斜向的棋子的数量去直接进行拦截。但是这一篇中主要是使用了一个分配权重的算法,根据权重来匹配我是要去拦截你,还是保持自己的胜利。这个权重可以根据自己的需求适当调整(我也是瞎写的)。

万变不离其宗,无论什么算法,肯定到最后都是根据五子棋的玩法,去解析横竖斜的胜率来进行权衡。

开发环境

.NET Framework版本:4.5

开发工具

Visual Studio 2013

实现代码

 /// <summary>
        /// 转换棋子的绘制位置
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        private Point GetChessPostion(int x, int y)
        {
            return new Point((int)(x * cellSize.Width) - chessSize.Width / 2, (int)(y * cellSize.Height) - chessSize.Height / 2);
        }

 /// <summary>
        /// 判断胜负
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="type"></param>
        private void IsWin(int x, int y, bool type)
        {
            for (int w = 0; w < winSum; w++)
            {
                if (wins[x, y, w] == 1)
                {
                    if (!type)
                    {
                        userWin[w]++;
                        aiWin[w] = 6;
                        if (userWin[w] == 5)
                        {
                            graphics.DrawString("赢", new Font("黑体", 11.0f), new SolidBrush(Color.Red), GetChessPostion(x, y));
                            if (MessageBox.Show("你赢了,是否重新开始?") == DialogResult.OK)
                            {
                                Reset();
                            }
                            break;
                        }
                    }
                    else
                    {
                        aiWin[w]++;
                        userWin[w] = 6;
                        if (aiWin[w] == 5)
                        {
                            graphics.DrawString("赢", new Font("黑体", 11.0f), new SolidBrush(Color.Red), GetChessPostion(x, y));
                            if (MessageBox.Show("你输了,是否重新开始?") == DialogResult.OK)
                            {
                                Reset();
                            }

                            break;
                        }
                    }
                }
            }
            isUserPlay = !isUserPlay;
        }
 /// <summary>
        /// 人工下棋操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void panel_board_Click(object sender, EventArgs e)
        {
            if (!isUserPlay)
            {
                return;
            }
            MouseEventArgs mouse = e as MouseEventArgs;
            if (mouse.X < cellSize.Width || mouse.X > boardSize.Width - cellSize.Width)
            {
                return;
            }
            if (mouse.Y < cellSize.Height || mouse.Y > boardSize.Height - cellSize.Height)
            {
                return;
            }
            int x = Convert.ToInt32(Math.Round((decimal)mouse.X / (decimal)cellSize.Width, MidpointRounding.AwayFromZero));
            int y = Convert.ToInt32(Math.Round((decimal)mouse.Y / (decimal)cellSize.Width, MidpointRounding.AwayFromZero));
            Point chessPoint = GetChessPostion(x, y);
            if (!chessList.Exists(s => s.point == chessPoint))
            {
                chessList.Add(new ChessModel { point = chessPoint, type = true });

                graphics.DrawImage(Properties.Resources.黑棋子, chessPoint.X, chessPoint.Y, chessSize.Width, chessSize.Height);

                IsWin(x, y, false);
                SetStatus(x, y, false);
                if (!isUserPlay)
                {
                    AIChess();
                }
            }
        }
/// <summary>
        /// AI下棋操作
        /// </summary>
        private void AIChess()
        {
            int[,] userScore = new int[xCellCount, yCellCount];
            int[,] aiScore = new int[xCellCount, yCellCount];

            int max = 0;
            Point aiChess = new Point();

            for (int x = 0; x < xCellCount; x++)
            {
                for (int y = 0; y < yCellCount; y++)
                {
                    if (!chessList.Exists(s => s.point == GetChessPostion(x, y)))
                    {
                        for (int w = 0; w < winSum; w++)
                        {
                            if (wins[x, y, w] == 1)
                            {
                                if (userWin[w] == 1)
                                {
                                    userScore[x, y] += 100;
                                }
                                if (userWin[w] == 2)
                                {
                                    userScore[x, y] += 400;
                                }
                                if (userWin[w] == 3)
                                {
                                    userScore[x, y] += 3000;
                                }
                                if (userWin[w] == 4)
                                {
                                    userScore[x, y] += 20000;
                                }


                                if (aiWin[w] == 1)
                                {
                                    aiScore[x, y] += 200;
                                }
                                if (aiWin[w] == 2)
                                {
                                    aiScore[x, y] += 500;
                                }
                                if (aiWin[w] == 3)
                                {
                                    aiScore[x, y] += 3400;
                                }
                                if (aiWin[w] == 4)
                                {
                                    aiScore[x, y] += 30000;
                                }

                            }
                        }

                        if (userScore[x, y] > max)
                        {
                            max = userScore[x, y];

                            aiChess.X = x;
                            aiChess.Y = y;
                        }
                        else if (userScore[x, y] == max)
                        {
                            if (aiScore[x, y] > aiScore[x, y])
                            {
                                aiChess.X = x;
                                aiChess.Y = y;
                            }
                        }


                        if (aiScore[x, y] > max)
                        {
                            max = aiScore[x, y];

                            aiChess.X = x;
                            aiChess.Y = y;
                        }
                        else if (aiScore[x, y] == max)
                        {
                            if (userScore[x, y] > userScore[x, y])
                            {
                                aiChess.X = x;
                                aiChess.Y = y;
                            }
                        }
                    }
                }
            }
            Point chessPoint = GetChessPostion(aiChess.X, aiChess.Y);
            chessList.Add(new ChessModel() { point = chessPoint, type = false });
            graphics.DrawImage(Properties.Resources.白棋子, chessPoint.X, chessPoint.Y, chessSize.Width, chessSize.Height);

            IsWin(aiChess.X, aiChess.Y, true);
            SetStatus(aiChess.X, aiChess.Y, true);
        }

实现效果

代码解析:自己看代码吧,看懂了就拿来优化下,看不懂就直接下载下来玩玩(除了一个思路引导外,好像也没什么用)

到此这篇关于C#实现AI五子棋游戏的示例代码的文章就介绍到这了,更多相关C#五子棋游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用C#9.0新语法如何提升if语句美感

    利用C#9.0新语法如何提升if语句美感

    这篇文章主要给大家介绍了关于利用C# 9.0新语法如何提升if语句美感的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • c# Base关键字的使用

    c# Base关键字的使用

    c# Base关键字的使用示例代码,大家可以参考下用法。
    2009-07-07
  • 详解c# AutoMapper 使用方式

    详解c# AutoMapper 使用方式

    本篇文章主要介绍了详解c# AutoMapper 使用方式 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • C# WPF实现数据记录导出excel

    C# WPF实现数据记录导出excel

    这篇文章主要为大家详细介绍了C#如何基于WPF实现数据记录导出excel的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • C#实现完善Excel不规则合并单元格数据导入的示例代码

    C#实现完善Excel不规则合并单元格数据导入的示例代码

    本文主要介绍了C#实现完善Excel不规则合并单元格数据导入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • C#判断单词个数方法总结

    C#判断单词个数方法总结

    我们给大家总计了C#中判断英文单词个数的方法以及排序的技巧,对此有需要的朋友可以测试下。
    2018-03-03
  • C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

    C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

    拖拽效果无论是在系统上、应用上、还是在网页上,拖拽随处可见,下面通过本文介绍下C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码,需要的朋友可以参考下
    2022-04-04
  • ListView用法中与滚动相关的需求实现

    ListView用法中与滚动相关的需求实现

    这篇文章主要介绍了ListView用法中与滚动相关的需求实现,获取并设置ListView的滚动位置,以及获取滚动位置处的项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#检查远程或本地磁盘使用率

    C#检查远程或本地磁盘使用率

    要检查磁盘的使用情况确定程序放哪个服务器和清理垃圾,所以写个小程序帮忙检查。本文给大家介绍C#检查远程或本地磁盘使用率的相关知识,感兴趣的朋友一起学习吧
    2016-04-04
  • C#文字换行的实现方法

    C#文字换行的实现方法

    这篇文章主要介绍了C#文字换行的实现方法,通过自定义函数实现针对特定字符串的换行长度处理,是比较实用的技巧,对于C#的深入学习具有一定的借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论