Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Alpha-Beta 剪枝搜索实现黑白棋AI

Alpha-Beta 剪枝搜索实现黑白棋AI

作者头像
云微
发布于 2023-02-11 02:00:21
发布于 2023-02-11 02:00:21
1K00
代码可运行
举报
运行总次数:0
代码可运行

完整代码可以在 我的AI学习笔记 - github 中获取

游戏规则

棋局开始时黑棋位于 E4 和 D5 ,白棋位于 D4 和 E5,如图所示。

黑方先行,双方交替下棋。 一步合法的棋步包括: 在一个空格处落下一个棋子,并且翻转对手一个或多个棋子; 新落下的棋子必须落在可夹住对方棋子的位置上,对方被夹住的所有棋子都要翻转过来, 可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格; 一步棋可以在数个(横向,纵向,对角线)方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。 如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。 如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。 棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。 如果某一方落子时间超过 1 分钟 或者 连续落子 3 次不合法,则判该方失败。

使用Alpha-Beta 剪枝搜索实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AIPlayer:
    """
    AI 玩家
    """
    weight = [
        [70, -20, 20, 20, 20, 20, -15, 70], 
	    [-20,-30,5,5,5,5,-30,-15], 
	    [20,5,1,1,1,1,5,20],
	    [20,5,1,1,1,1,5,20],
	    [20,5,1,1,1,1,5,20],
        [20,5,1,1,1,1,5,20],
	    [-20,-30,5,5,5,5,-30,-15],
	    [70,-15,20,20,20,20,-15,70]
    ]

    deepth = 0

    maxdeepth = 6
    emptylistFlag = 10000000

    def __init__(self, color):
        """
        玩家初始化
        :param color: 下棋方,'X' - 黑棋,'O' - 白棋
        """

        self.color = color

    def calculate(self,board,color):
        if color == 'X':
            colorNext ='O'
        else:
            colorNext ='X'
        count = 0
        for i in range(8):
            for j in range(8):
                if color == board[i][j]: 
                    count += self.weight[i][j]
                elif colorNext == board[i][j]:
                    count -= self.weight[i][j]
        return count

    def alphaBeta(self,board,color,a,b):
        # 递归终止
        if self.deepth > self.maxdeepth:
                return None, self.calculate(board,self.color)

        if color == 'X':
            colorNext ='O'
        else:
            colorNext ='X'
        action_list = list(board.get_legal_actions(color))
        if len(action_list) == 0:
            if len(list(board.get_legal_actions(colorNext))) == 0:
                return None,self.calculate(board,self.color)
            return self.alphaBeta(board,colorNext,a,b)
        
        max = -9999999
        min = 9999999
        action = None

        for p in action_list:

            flipped_pos = board._move(p,color)
            self.deepth += 1
            p1, current = self.alphaBeta(board,colorNext,a,b)
            self.deepth -= 1
            board.backpropagation(p,flipped_pos,color)
            # print(p,current)
            # alpha-beta 剪枝
            if color == self.color:
                if current > a:
                    if current > b:
                        return p,current
                    a = current
                if current > max:
                    max = current
                    action = p

            else:
                if current < b:
                    if current < a:
                        return p,current
                    b = current
                if current < min:
                    min = current
                    action = p

        # print(color,action,max,min)

        if color == self.color:
            return action,max
        else:
            return action,min         


    def get_move(self, board):
        """
        根据当前棋盘状态获取最佳落子位置
        :param board: 棋盘
        :return: action 最佳落子位置, e.g. 'A1'
        """
        if self.color == 'X':
            player_name = '黑棋'
        else:
            player_name = '白棋'
        print("请等一会,对方 {}-{} 正在思考中...".format(player_name, self.color))

        # -----------------请实现你的算法代码--------------------------------------
        action_list = list(board.get_legal_actions(self.color))
        
        # action, weight = self.maxMin(board,self.color)
        action, weight = self.alphaBeta(board,self.color,-9999999,9999999)

        if len(action_list) == 0:
            return None
        print(action_list)
        print(action)
        return action
        # ------------------------------------------------------------------------
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
黑白棋 AI 算法
一般棋子双面为黑白两色,故称“黑白棋”。因为行棋之时将对方棋子翻转,则变为己方棋子,故又称“翻转棋” (Reversi) 。 棋子双面为红、绿色的称为“苹果棋”。它使用 8x8 的棋盘,由两人执黑子和白子轮流下棋,最后子多方为胜方。 随着网络的普及,黑白棋作为一种最适合在网上玩的棋类游戏正在逐渐流行起来。 中国主要的黑白棋游戏站点有 Yahoo 游戏、中国游戏网、联众游戏等。
不去幼儿园
2024/12/03
1840
黑白棋 AI 算法
使用最大-最小树搜索算法和alpha-beta剪枝算法设计有效围棋走法
我们的世界纷繁复杂,看起来完全不可捉摸。但在很多场景下,它运行的本质其实是通过付出最小的代价获得最大化收益。例如在自然界里的自然选择,光的运行路径。对于人的世界更是如此,由于我们做任何事情,任何选择都要付出相应的成本,因此选择一种决策方式让我们以最小的代价获得最大化的回报无疑是我们行动思考的核心。
望月从良
2019/04/28
2.5K0
使用最大-最小树搜索算法和alpha-beta剪枝算法设计有效围棋走法
从零开始再造打爆李世石的AlphaGo:快速构建棋盘和围棋规则
从本节开始,我们废话少说,迅速进入代码编写阶段。对技术而言“做”永远是比“讲”更好的说,很多用语言讲不清楚的道理,看一下代码自然就明白了。我们要实现的围棋机器人必须做到以下几点:
望月从良
2019/03/18
6660
从零开始再造打爆李世石的AlphaGo:快速构建棋盘和围棋规则
使用 Min-Max 搜索和启发式评估函数实现五子棋 AI
设计一个交互式的应用,用户用鼠标在棋盘上单击左键表示落子,然后五子棋AI分析棋局,并在它认为最好的地方落子,双方交替,直到分出胜负或者和棋。
凝神长老
2021/04/16
2.7K0
使用 Min-Max 搜索和启发式评估函数实现五子棋 AI
组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手。在本篇中,我们在已有的N子棋OpenAI Gym 环境中用Pytorch实现一个简化版的AlphaGo Zero算法。本篇所有代码在 github.com/MyEncyclopedia/ConnectNGym 中,其中部分参考了SongXiaoJun 的 github.com junxiaosong/AlphaZero_Gomoku。
AI科技大本营
2020/09/24
1.6K0
组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
从零开始再造打爆李世石的AlphaGo:创造能下围棋的机器人
我们在上节完成了围棋规则和棋盘状态监测功能,本节我们在基于上节的基础上,设计一个能自己下棋的围棋机器人。首先我们设计一个类叫Agent,它的初始化代码如下:
望月从良
2019/04/09
7100
从零开始再造打爆李世石的AlphaGo:创造能下围棋的机器人
挑战自己,编程你的五子棋:Python+Pygame实践经验分享
五子棋,古老而经典,是一种两人对抗的策略棋类游戏。想要体验制作游戏的乐趣吗?本文将详细指导你如何使用Python语言和Pygame库,一步步打造自己的五子棋游戏!
子午Python
2023/10/04
8590
开发HarmonyOS NEXT版五子棋游戏实战
大家好,我是 V 哥。首先要公布一个好消息,V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1:ArkTS 语言篇》图书终于出版了,有正在学习鸿蒙的兄弟可以关注一下,写书真是磨人,耗时半年之久,感概一下,希望可以帮助到正在入门鸿蒙开发的小伙伴,一书在手 ArkTS无优。
威哥爱编程
2025/03/05
640
用Python给我设计一个井字棋,对手是AI
这是一个用Python实现的基础井字棋游戏程序,其中玩家与对手AI轮流下棋,每次落子后判断是否有胜者或者平局,并输出结果。
GeekLiHua
2025/01/21
770
用Python给我设计一个井字棋,对手是AI
简单五子棋,没有电脑AI
  刚学了C#委托,做了个五子棋练习,把前台绘制和后台逻辑分开,前台绘制方法用委托传给后台逻辑。
用户6362579
2019/09/29
5340
简单五子棋,没有电脑AI
ChatGPT与我们玩游戏_五子棋
要以图形方式实现五子棋(Gomoku)游戏,我们可以使用 tkinter 库来创建一个简单的图形用户界面(GUI)。下面是一个示例程序,展示如何实现这一点。
顾翔
2025/02/12
690
ChatGPT与我们玩游戏_五子棋
今天,我们来教AI下国际象棋
国际象棋可以说是最棒的棋盘游戏之一,它是战略战术和纯技术的完美融合。每位玩家开局时各有 16 枚棋子:一王、一后、两车、两马、两象和八兵,各具不同功能与走法。真人对弈可以凭借玩家的经验,步步为营。那么,对于一个机器——计算机,你该如何教会它下棋?近日,有人在 medium 上发表了一篇文章,详细解释了如何教计算机玩国际象棋。
机器之心
2020/11/04
1.4K0
今天,我们来教AI下国际象棋
AI——五子棋网页端小游戏全附代码
五子棋是一种双人对战的棋类游戏。游戏的棋盘是一个15行15列的网格,双方玩家轮流在网格的空位上落子。目标是先在横线、竖线、斜线或对角线上形成连续的五个自己的棋子。
此星光明
2025/02/06
1960
AI——五子棋网页端小游戏全附代码
AI人机对战黑白棋
没有界面,在终端显示,这是我改编的一个八年前的老项目,没啥好玩的,学习的话值得推荐。
川川菜鸟
2021/10/18
5650
鸿蒙元服务实战-笑笑五子棋(4)
entry/src/main/ets/entryability/EntryAbility.ets 中统一设置
万少
2025/02/08
800
鸿蒙元服务实战-笑笑五子棋(4)
LeetCode 2021 力扣杯全国秋季编程大赛(第384名)
2021.9.11,周六 比赛之前:早上去交大看看,本科毕业10年了,由于限流,校园里没有多少回校的校友。 逛了逛,跟太太和的她的同学一起吃了个午饭,饭后准备去送孩子上声乐课,到了上课的地方,已经过了3点,比赛已经开始了。。。 我想是再开20分钟回家比赛(呵呵,想省停车费),还是在孩子上课的地方打比赛呢?(我的积分啊,不能掉的太厉害) 我果断停车,上楼,找个插座的地方,接通电源,开始比赛,比赛已经开始了10多分钟。 题目还算比较简单,第四题想到了是二分查找,中间出了点岔子,17:34 做出来了,但是什么,17:30 比赛就结束了。白高兴了一会。
Michael阿明
2022/01/07
5920
LeetCode 2021 力扣杯全国秋季编程大赛(第384名)
向AlphaGo进化,应用增强式学习技术打造超越人类的围棋机器人
AlphaGo在与李世石或柯洁对弈过程中有个休息流程。此时人类选手利用这段时间充分放松思维,让自己从上一盘比赛的剧烈思维活动中抽身而出,让身体和思维获得恢复以便再战。但此时AlphaGo并没有休息,而是抓住这段时间自己跟自己对弈,在对方休息时,它可能又让自己下了好几万盘棋,于是自己的下棋能力又有了新的提升。当下一盘棋开始时,李世石和柯洁唯一的变化是由体力的下降而变弱了,而AlphaGo通过自我对弈增强了,如此此消彼长,最终结局自然不难预料。
望月从良
2019/06/02
5850
改变棋盘编码方式,增强围棋机器人的智能肌肉
在上一节,我们把棋盘编码成二维数组后输入到网络,对网络进行训练。我们编码棋盘的方式很简单,把当前落子方在棋盘上棋子摆放的位置设置成1,对方在棋盘上落子的位置设置成-1,然后落子方根据当前棋盘情况实现的落子,也被编码成二维数组,所有元素都是0,只有落子位置设置成1,由此我们就形成了一条训练记录,落子前的棋盘编码是训练数据,落子方式对应的二维数组是训练标签。
望月从良
2019/05/17
5840
改变棋盘编码方式,增强围棋机器人的智能肌肉
C语言——五子棋人机对战
先说下背景吧,写下这篇博客时,博主大一在读,C语言初学者,寒假无事,便计划写几个由C语言实现的小游戏以提升编程能力。在这篇博客里分享的是可人机对战的五子棋游戏。
全栈程序员站长
2022/09/07
1.2K0
详解强化学习多智能体博弈算法——蒙特卡洛树搜索
👆点击“博文视点Broadview”,获取更多书讯 强化学习,除了可以用于单个强化学习智能体和环境的相互作用,也可以用于两个或者多个智能体在某个强化学习环境下的博弈。 关于这种类型的算法,最有名的应该是蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)。 随着AlphaGo和AlphaZero算法在围棋、国际象棋和将棋等棋类领域的广泛应用,并且在这些领域内均取得了相比传统的Alpha-Beta 剪枝算法更加优异的性能,蒙特卡洛树搜索算法作为这些智能体使用的算法也被越来越多的人研究
博文视点Broadview
2022/03/30
2.7K0
推荐阅读
相关推荐
黑白棋 AI 算法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文