五子棋简单AI算法(C#版)

本文详细介绍了如何使用AI算法进行五子棋游戏,涉及棋盘判断、得分计算、落点选择过程。通过黑白得分表指导决策,尽管AI水平有限,但提供了优化升级的基础。

前言:

本文只提供AI算法,不提供棋盘,因为棋盘不是我写的,不好拿出来分享,望谅解。

AI水平说明:

当前AI只能计算当前局面下最优的一步,没有深度,水平一般的普通人很轻易就会被其击败,但是有很大的升级空间,可以以此为基础再行添加算法添加深度,以及剪枝等算法。

程序运行图片:黑方为AI,我是白色(我是不是太菜了。。)

AI得分说明:

当前AI为黑色时水平较高,为白色时需要修改得分表,得分表会影响AI的决策,得分可以自行修改,此得分表并非最佳得分表,但是经过我的测试貌似还可以。ps:这是AI的核心非常重要

得分表如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 五子棋
{
    public static class ChessValueUtil
    {
        
        public static Hashtable blackTable = new Hashtable(); //创建一个HashTable实例
        public static Hashtable whiteTable = new Hashtable(); 
        //五子棋棋形,最长为7,最短为4(有些棋形必须将空位包含进去)
        public static Hashtable getBlackTable()
        {
            return blackTable;
        }
        public static Hashtable getWhiteTable()
        {
            return whiteTable;
        }
        /**
         *   *:表示黑子
         *   -:表示空位
         *   o:表示白子
         */
        static ChessValueUtil(){
        //还要设置防守方的数值,防止被gank掉
        //右边Add的whiteTable值,是防守分数,这样Ai就不会一味的猛冲

        //左边:黑方Ai的棋子判断                      右边:Ai结束后,玩家可能的棋子判断
        blackTable.Add("*****",  100000);//连五
        /*                                 */whiteTable.Add("ooooo",  90000);
        blackTable.Add("-****-",  5000);//活四
        /*                                 */whiteTable.Add("-oooo-",  4500);
        blackTable.Add("*-***",  700);//冲四  1
        /*                                 */whiteTable.Add("o-ooo",  200);
        blackTable.Add("***-*",  700);//冲四  1  反向
        /*                                 */whiteTable.Add("ooo-o",  200);
        blackTable.Add("-****o",  900);//冲四  2
        /*                                 */whiteTable.Add("-oooo*",  250);
        blackTable.Add("o****-",  900);//冲四  2  反向
        /*                                 */whiteTable.Add("*oooo-",  250);
        blackTable.Add("**-**",  700);//冲四   3
        /*                                 */whiteTable.Add("oo-oo", 200);
        blackTable.Add("-***-",  600);//活三   1
        /*                                 */whiteTable.Add("-ooo-",  150);
        blackTable.Add("-*-**-",  150);//活三  2
        /*                                 */whiteTable.Add("-o-oo-",  50);
        blackTable.Add("-**-*-",  150);//活三  2   反向
        /*                                 */whiteTable.Add("-oo-o-",  50);
        blackTable.Add("--***o",  120);//眠三  1
        /*                                 */whiteTable.Add("--ooo*",  30);
        blackTable.Add("o***--",  120);//眠三  1  反向
        /*                                 */whiteTable.Add("*ooo--",  30);
        blackTable.Add("-*-**o",  80);//眠三   2
        /*                                 */whiteTable.Add("-o-oo*",  15);
        blackTable.Add("o**-*-",  80);//眠三   2  反向
        /*                                 */whiteTable.Add("*oo-o-",  15);
        blackTable.Add("-**-*o",  60);//眠三   3
        /*                                 */whiteTable.Add("-oo-o*",  10);
        blackTable.Add("o*-**-",  60);//眠三   3   反向
        /*                                 */whiteTable.Add("*o-oo-",  10);
        blackTable.Add("*--**",  60);//眠三   4
        /*                                 */whiteTable.Add("o--oo",  10);
        blackTable.Add("**--*",  60);//眠三   4   反向
        /*                                 */whiteTable.Add("oo--o",  10);
        blackTable.Add("*-*-*",  60);//眠三   5
        /*                                 */whiteTable.Add("o-o-o",  10);
        blackTable.Add("o-***-o",  60);//眠三   6
        /*                                 */whiteTable.Add("*-ooo-*",  2);
        blackTable.Add("--**--",  50);//活二  1
        /*                                 */whiteTable.Add("--oo--",  2);
        blackTable.Add("-*-*-",  20);//活二   2
        /*                                 */whiteTable.Add("-o-o-",  2);
        blackTable.Add("*--*",  20);//活二   3
        /*                                 */whiteTable.Add("o--o",  2);
        blackTable.Add("---**o",  10);//眠二  1
        /*                                 */whiteTable.Add("---oo*",  1);
        blackTable.Add("o**---",  10);//眠二  1   反向
        /*                                 */whiteTable.Add("*oo---",  1);
        blackTable.Add("--*-*o",  10);//眠二  2
        /*                                 */whiteTable.Add("--o-o*",  1 );
        blackTable.Add("o*-*--",  10);//眠二  2   反向
        /*                                 */whiteTable.Add("*o-o--",  1);
        blackTable.Add("-*--*o",  10);//眠二  3
        /*                                 */whiteTable.Add("-o--o*",  1);
        blackTable.Add("o*--*-",  10);//眠二  3   反向
        /*                                 */whiteTable.Add("*o--o-",  1);
        blackTable.Add("*---*",  10);//眠二  4
        /*                                 */whiteTable.Add("o---o",  1);
        
    }
}
}

 AI算法思路讲解:

首先我们需要知道输入和输出,给输入当前棋盘的二维数组,从而让他返回落点坐标

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值