Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >10.带人机对战的五子棋程序

10.带人机对战的五子棋程序

作者头像
用户4381798
发布于 2020-07-31 08:06:57
发布于 2020-07-31 08:06:57
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

今天我们带来一个带人机对战功能的五子棋程序。程序基于前面文章中的框架搭建,新增人机对战的策略。程序基于规则进行决策,不考虑禁手,玩家执黑子先行。棋盘规模采用15乘15,棋盘规模容易扩展,程序棋力中等,可以用来放松陪玩。

image.png

程序每一步都会搜索棋盘所有可以落子的位置,然后识别出最值得落子的位置,实现进攻和围堵。目前评估值为人为设置,所以程序棋力只能与编者相当,勉强算作中等棋力,后期若引入遗传算法或者强化学习,通过养蛊之法,可以养出更高棋力的程序。部分代码如下(简书中插入代码还是比较方便的:-):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#带AI的五子棋程序
import wx
UNIT=30
ROW_NODE_NUM=15
BOARD = []
for i in range(UNIT, UNIT * ROW_NODE_NUM + UNIT, UNIT):
    for j in range(UNIT, UNIT * ROW_NODE_NUM + UNIT, UNIT):
        BOARD.append((j, i))
print(BOARD)
class myFrame(wx.Frame):
    def __init__(self):
        self.unit = UNIT
        self.pointNum = ROW_NODE_NUM#每行落棋点数
        self.pieceNum=0
        self.bkCol=(220, 210, 0)
        self.wht=(255,255,255)
        self.blk=(0,0,0)
        self.actColor=self.blk
        self.piecePos =[]
        self.piecePosCols =[]
        # 元组列表记录落棋位置和落棋颜色
        super().__init__\
            (parent=None,pos=[800,100],
             size=[self.unit*self.pointNum
                   +self.unit+20,
                   self.unit*self.pointNum
                   +self.unit+30+20],
             title="商贾三国")
        self.SetIcon(wx.Icon("WeatherBundle.ico"))
        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour(self.bkCol)
        self.tip = \
            wx.TextCtrl(self.panel, -1, "",
                        pos=(self.unit*self.pointNum
                             +self.unit-80, 0),
                        size=(80,25))
        self.tip.SetBackgroundColour(self.bkCol)
        self.panel.Bind(wx.EVT_PAINT,self.draw)
        self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)
        self.Show()
    def draw(self,event):
        mydc=wx.PaintDC(self.panel)
        unit=self.unit
        pointNum=self.pointNum
        x=unit
        y=unit
        for i in range(1,pointNum+1):
            mydc.DrawLine(x,y,x,unit*pointNum)
            x=x+unit
        x=unit
        for i in range(1,pointNum+1):
            mydc.DrawLine(x, y, unit*pointNum, y)
            y=y+unit
        for i in range(0,len(self.piecePos)):
            mydc.SetBrush(wx.Brush(self.piecePosCols[i][2]))
            mydc.DrawCircle(self.piecePos[i][0],
                            self.piecePos[i][1], self.unit / 2.5)
    def OnClick(self,event):
        unit=self.unit
        pos = event.GetPosition()
        mydc=wx.ClientDC(self.panel)
        mydc.SetBrush(wx.Brush(self.actColor))
        x = round(pos.x / unit) * unit
        y = round(pos.y / unit) * unit
        piecePo = (x, y)
        if piecePo in BOARD:
            if piecePo not in self.piecePos:
                if self.actColor == self.blk:
                    piecePoCol=(x,y,self.actColor)
                    if piecePo not in self.piecePos:
                        mydc.DrawCircle(x,y,self.unit/2.5)
                        self.piecePos.append(piecePo)
                        self.piecePosCols.append(piecePoCol)
                        self.fiveChk(piecePo)
                        self.pieceNum = self.pieceNum+1
                        print(self.pieceNum)
                        self.tip.SetValue('%s,%s' % (x,y))
                        self.actColor = self.wht
                if self.actColor == self.wht:
                    self.board()
                    print(self.result)
                    mydc.SetBrush(wx.Brush(self.actColor))
                    x = self.result[0]
                    y = self.result[1]
                    piecePo = (x, y)
                    piecePoCol = (x, y, self.actColor)
                    if piecePo not in self.piecePos:
                        mydc.DrawCircle(x, y, self.unit / 2.5)
                        self.piecePos.append(piecePo)
                        self.piecePosCols.append(piecePoCol)
                        self.fiveChk(piecePo)
                        self.pieceNum = self.pieceNum + 1
                        print(self.pieceNum)
                        self.tip.SetValue('%s,%s' % (x, y))
                        self.actColor = self.blk

总体代码比较多,限于篇幅,获取完整源码可以移步公众号:哈哈哈利,回复五子棋人机对战,可以获取决策部分代码。

五子棋程序已经打包为exe,可以脱离Python环境,程序获取路径如下:链接:https://pan.baidu.com/s/19U9AZa0Msoyt6xs-OpuDNA 提取码:q940 感兴趣可以用来放松娱乐。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5.wxPython响应鼠标点击画出棋子
今天我们为wxPython窗体设置鼠标点击事件,并在事件响应函数里画出黑白棋子。这里我们为窗体绑定wx.EVT_LEFT_UP这个事件码,来响应鼠标左键抬起事件。在事件处理函数里我们通过 event.GetPosition()函数来获取鼠标点击位置坐标,并将坐标点圆整,方便画圆形棋子时,棋子正好不偏不倚落在棋盘的交点处(后期可以加入随机数,对落子坐标进行处理,使棋子可以模拟现实落子,实现歪歪扭扭的效果)。我们采用wx.ClientDC容器来画棋子,wx.ClientDC不必设置在窗体事件中,可以随时作画,缺点是窗体重画之后会消失。
用户4381798
2020/07/30
8130
5.wxPython响应鼠标点击画出棋子
4.Python画一个五子棋棋盘
今天我们通过wx.PaintDC在窗体上画出一个五子棋棋盘。要想在wxPython创建的窗体对象上通过wx.PaintDC画图,需要在该窗体上绑定一个画图事件wx.EVT_PAINT,然后在事件处理函数里画出我们需要的线条。 我们的棋盘是画在panel上的,所以画图事件也是绑定在panel上,画图的容器mydc也是建立在panel上。我们通过 self.unit = 30、self.dotnum = 15来控制窗体及棋盘的大小,unit为格子边长,dotnum为棋盘每条边的交点个数。
用户4381798
2020/07/30
2.7K0
4.Python画一个五子棋棋盘
python 五子棋-文字版(上)
五子棋游戏相信大家应该都非常熟悉了,作为策略型棋类游戏还是非常经典的,双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜;
叶子陪你玩
2020/10/30
1.9K0
python 五子棋-文字版(上)
python做一个人机对战五子棋,AI版本
川川以前梦寐以求的想找个五子棋对手,由于学习原因,实在没小伙伴陪我玩了,于是我就想着做一个AI五子棋来陪我玩吧。网上的游戏搜可以看到一大堆,我们不能说白嫖,白嫖过来总要改一改成自己想要的吧,虽然我也喜欢白嫖,但是我还是喜欢改成我自己想要的。
川川菜鸟
2021/10/18
1.1K0
ChatGPT与我们玩游戏_五子棋
要以图形方式实现五子棋(Gomoku)游戏,我们可以使用 tkinter 库来创建一个简单的图形用户界面(GUI)。下面是一个示例程序,展示如何实现这一点。
顾翔
2025/02/12
1130
ChatGPT与我们玩游戏_五子棋
Python:游戏:五子棋之人机对战
五子棋比起我之前写的几款游戏来说,难度提高了不少。如果是人与人对战,那么,电脑只需要判断是否赢了就可以。如果是人机对战,那你还得让电脑知道怎么下。
丹枫无迹
2019/01/29
2.4K4
Python五子棋人机对战
了解过python的都知道python最高境界就是人工智能,AI技术,but但凡接触到AI那都感觉很高大上的,新手小白肯定看不懂… 别急,我给大家带来了一个伪AI技术,注释也写的很明白,保证小白都能一看就懂!!!! 唔,是的,伪AI技术,人机五子棋。(跟电脑下棋)实现一个人就可以跟电脑下棋。 具体怎么让电脑产生攻击力的… 代码的注释写的很清楚。 。。。
全栈程序员站长
2022/07/04
7510
Python实现五子棋人机对战
五子棋是常见的一款小游戏,五子棋问题是人工智能中的一个经典问题。这篇文章主要介绍了python版本五子棋的实现代码,大家可以做个参考,与我的傻儿子对弈一下。
数据森麟
2019/11/07
3.3K0
五子棋 - JavaScript 实现 - 两人对战
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
Jimmy_is_jimmy
2022/11/12
1.1K0
五子棋 - JavaScript 实现 - 两人对战
实现单机五子棋,难吗?
点击上方蓝色“程序猿DD”,选择“设为星标” 回复“资源”获取独家整理的学习资料! 来源 |  blog.csdn.net/gaosanjin/article/details/108244164 「羊毛+福利」撸一波超便宜的云服务,完成任务DD另外送奖励! 这是实验室2018年底招新时的考核题目,使用Python编写一个能够完成基本对战的五子棋游戏。面向新手。 程序主要包括两个部分,图形创建与逻辑编写两部分。 程序的运行结果: 样式创建 老规矩,先把用到的包导入进来。 ''' @Auther : ga
程序猿DD
2023/04/04
6960
实现单机五子棋,难吗?
Android基于TCP的五子棋双人对战实现
很久以前在慕课网看过鸿洋的五子棋实现的视频,由于是教学,功能比较简单。 然后我基于此拓展了一些功能,比如音效、自定义网格数,选择图片设置背景、截图、悔棋等。 最想做的当然是联网对战啦,当时实力不济,只好暂放,现在回来看看,感觉可以做。 核心是在每次绘制时将坐标点传给服务端,然后服务端再将数据发送给两个手机,在视图上显示。 随便有一个手机即作服务端,也作客户端。其中坐标点的字符化,以及字符串解析成坐标点需要小小设计一下。 ---- 零、说明 本文着重于介绍如何基于TCP的Socket实现两个手机
张风捷特烈
2018/12/06
1.4K0
多 UI 版本网页五子棋实现
五子棋是大家很熟悉的一种小游戏,本文给大家介绍如何制作一个简易的网页版五子棋游戏,并且考虑实现普通 DOM 和 Canvas 两种 UI 绘图模式供随时切换。最终的实现效果参考:https://littuomuxin.github.io/gobang/
WecTeam
2020/01/13
1.8K0
BS1030-基于C#+SqlServer+CS架构实现在线五子棋对战平台,五子棋游戏程序
本基于C#+SqlServer+CS架构实现的在线五子棋对战平台,五子棋游戏程序,系统采用多层C/S软件架构,采用C#编程语言开发技术实现界面窗口版本的五子棋程序界面,实现CS架构窗口事件监听,完成五子棋双人在线对战等。五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。这里设计和实现了一个人机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索算法过程。
计算机程序优异哥
2022/12/02
6440
前端谈谈实现五子棋
秉承着会就分享,不会就折腾的技术宗旨。自己利用周末的时间将休闲小游戏-五子棋重新梳理了一下,整理成一个小的教程,分享出来给大家指点指点。
Jimmy_is_jimmy
2019/07/31
1.5K0
挑战自己,编程你的五子棋:Python+Pygame实践经验分享
五子棋,古老而经典,是一种两人对抗的策略棋类游戏。想要体验制作游戏的乐趣吗?本文将详细指导你如何使用Python语言和Pygame库,一步步打造自己的五子棋游戏!
子午Python
2023/10/04
9490
用Python打印五子棋棋盘
五子棋是一种流行的棋类游戏,在制作五子棋游戏时,打印棋盘是一个必不可少的步骤。下面,我们将详细介绍如何使用Python来打印五子棋棋盘。
很酷的站长
2023/08/16
7140
五子棋 - JavaScript 实现 -人机交互
上一篇文章 五子棋 - JavaScript 实现 - 两人对战 我们介绍了人与人之间下棋,还挖了个坑:讲人机交互下棋。不知不觉中,把自己打包给卖了,本文就是来补坑的。
Jimmy_is_jimmy
2022/11/28
1.1K0
五子棋 - JavaScript 实现 -人机交互
C语言实现五子棋小游戏
先说一下棋盘的问题,因为后期我在测试的时候,不能一眼看出来棋落子的坐标,所以对棋盘进行了一点小优化。
小孙同学
2022/01/14
1.2K0
五子棋
一个不是很好的五子棋项目,因为以前没写过五子棋,或者说对于没有人机对决的AI五子棋,感觉没什么好写的。当然,我对算法这块也不怎么强,上次有朋友留言要五子棋项目,所以试着去写了下五子棋AI算法,用的是贪心算法,还没写完整,就先发个简单的双人对局五子棋简单版.
DeROy
2020/05/25
1.1K0
五子棋
五子棋人机对战思路「建议收藏」
五子棋人机对战: 人机对战,我们可以想象一下我们在玩QQ游戏五子棋时的场景,根据每次下的步骤来分析电脑是怎样解析我们下棋的步骤的。
全栈程序员站长
2022/07/04
4.5K0
相关推荐
5.wxPython响应鼠标点击画出棋子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验