热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

scratch五子棋人机对战

   扫描关注微信公众号获取更多内容 今天跟大家分享下scratch五子棋的程序,五子棋我们都玩过,当黑子或者白子横、竖、斜连成五子,游戏就结束啦。想要把五子棋的规则完全实现出来还

   《scratch五子棋人机对战》扫描关注微信公众号获取更多内容

 今天跟大家分享下scratch五子棋的程序,五子棋我们都玩过,当黑子或者白子横、竖、斜连成五子,游戏就结束啦。想要把五子棋的规则完全实现出来还是很不容易的。

 

《scratch五子棋人机对战》

 

    那在做之前,我们先梳理下思路:

    1.棋盘背景——横、竖线相隔单位保持一致

    2.黑子(人)——跟随鼠标,且中心落点在黑线的交叉点

    3.白子(电脑)——自主判断落点,且中心落点在黑线的交叉点上

    看起来似乎比较简单,但是还有很多隐藏的问题(至关重要)

    比如:

    1.一个交叉点只能落一子

    2.不能在棋盘外落子

    3.电脑的AI

    4.判断胜负的条件

 

    今天我们就来解决棋盘背景和落子的问题。

   棋盘的背景可以通过画笔的方式绘制

    我们可以把棋盘看成是由竖线和横线组成,且每条线相隔的距离也相同,假设这个距离为20个像素点。

    那么可以先找到一个合适的位置(-200,-160),向上移动画一条黑线,然后移动到(-200,-160),将坐标x增加20后,再画条黑线,重复此过程,通过控制循环的次数控制线的数量,横线也是一样,只需要改成向右画线,且每次y变化20,就可以了

《scratch五子棋人机对战》

竖线

《scratch五子棋人机对战》

横线

 

    接下来我们要解决的问题是:

    1.黑子跟随鼠标移动,点击鼠标落子

    2.每次落子要正好在交叉点的中间

    我们新建一个黑子角色,调整为合适大小(半径小于10个像素点),且黑子的位置如下图所示:

《scratch五子棋人机对战》

    这有这样才能保证  《scratch五子棋人机对战》  运行时,鼠标指针正对黑子的圆心。当点击鼠标后,落子,盖章。这样就能实现跟随鼠标移动,点击落子的功能了

《scratch五子棋人机对战》

 

    最后要解决落子要在交叉点中间的关键就是,当鼠标指针在交叉点附近时(红圆里任意位置),点击鼠标,黑子不会直接盖章,而是黑子圆心会移动到交叉点上再去盖章。

《scratch五子棋人机对战》

 

    根据之前绘图时的坐标可以发现,交叉点的X或Y坐标都是20的整数倍,且红色圆圈半径为10。那我们可以把它看成一个数学问题。

    假设交叉点坐标为(X,Y),鼠标的坐标可能是(X+a,Y+b),且-10

《scratch五子棋人机对战》

《scratch五子棋人机对战》

    比如,假设交叉点(40,80),鼠标指针为(43,82),按照上述公式计算可以得到最后的落点就是交叉点。

要讲的内容是:

  1. 如何保证交叉点不重复落子

  2. 如何保证不会在棋盘外落子

  3. 如何判定胜负

    先解决第一个问题‘不重复落子’,都知道每个交叉点有一个独一无二的(X,Y),为了保证不重复落子,也就是交叉点的(X,Y)只能使用一次,在落子前,就需要判断列表内是否存在交叉点的(X,Y)。如果有,那么不盖章(不落子)。如果没有则盖章(落子),并且将交叉点的(X,Y)存储到列表中。

   

《scratch五子棋人机对战》

    这里有个问题大家可以思考下,为什么需要用逗号连接坐标,不用逗号,直接连接行不行?

 

   第一个问题解决了,接下来解决第二个问题,如何保证不会在棋盘外落子。这个问题的关键就是找到棋盘内和棋盘外的区别,也就是坐标范围的不同,棋盘的坐标范围:-210<X<110 , -170<Y<150(思考为什么不是-200<X<100 , -160<Y<140) ,所以只要落子的X和Y在此范围内那么一定是在棋盘内。

 

《scratch五子棋人机对战》

    注意此时的逻辑关系是“与”

    黑旗的落子程序为:

《scratch五子棋人机对战》

    黑旗的落子视频:

 

 

 

    接下来最为关键的就是如何判定胜负,判定胜负的方法有很多比如列表,在这里给大家提供一种新的思路,假设你和三岁的小朋友下五子棋,小朋友会怎么去判定胜负呢?

    他会用手指指到黑子,然后看手指往上看有没有黑子,如果有则继续往上,重复直到上面没有黑子为止。紧接回到最开始的黑子上,然后看手指往下看有没有黑子,如果有则继续往下,重复直到下面没有黑子。在这个过程中每数到黑子就计数加1。这样就将一条竖线上的黑子的数量计算出来了。 

 

   用程序实现就是:新建一个角色(大小不能超过黑子),控制它像小朋友的手指一样数连着的黑子数量,用来检测是否胜利。问题:为什么大小不能超过黑子?

 

    当黑子落下盖章后,并发出消息表示可以开始检测了

《scratch五子棋人机对战》

 

    变量黑和表示黑子的连接数,检测是否胜利的程序如下:

《scratch五子棋人机对战》

    这样就可以判定竖直方向上黑子的最大数,同理也可以用这种方式检测横、斜的黑子的最大数(换方向检测后,黑和需重新设为0)。我们只需要将检测横、斜方向(更改X Y的坐标)的程序写在下面就可以了,一旦黑和等于6时则黑子胜利。

问题:1.为什么从最后落子的位置开始检测?

          2.为什么黑和需重新设为0?

          3.为什么判断胜负的条件是等于6而不是等于5?

《scratch五子棋人机对战》

这篇推送是五子棋的最后一篇啦,主要是进行讲解白子的AI。

   这里给大家分享一个简单策略,就是让白子以防守为主。所谓防守就是在黑子数量最多的位置去下白子,也就是下图所示的黑子左侧或右侧。

《scratch五子棋人机对战》

    但是假设黑子已经连成四颗了,且左侧或者右侧已经有一颗白子了,那么白子就需要下在另外一侧。所以白子防守的思路就是:先找到黑子数目最多的一条线,判断判断其左侧或者右侧是否有白子,根据情况下到对应的位置。

 

    也就是现在需要解决的问题是:

1.如何找到黑子连成数目最多的位置

2.需要存储该位置左右两侧的坐标

3.判断左右两侧有无被白子占用

 

    第一个问题其实我们在上期推送已经说明了(点此看第二期内容),变量黑和最大的时候就是黑子连成数目最多的时候

《scratch五子棋人机对战》

    那么如何找到最大值,以及最大值对应的左右/上下坐标,又是多少呢?可以将检测角色在移动过程中没有碰到黑子的位置坐标存储到列表中,并且同时将变量黑和也存到新的列表中。不断重复此过程,直到最后,在从列表里找到黑和最大值,并以此找到黑和最大时对应的两个坐标。

    

《scratch五子棋人机对战》

    由上图程序我们可以看出,假设列表(黑和最大值)的序号为N,列表M(白旗坐标)为2N-1和2N。也就是只要找到列表(黑和最大值)里面最大数字对应的序号,就可以找到白子的的坐标。

《scratch五子棋人机对战》

    如上图所示,在列表黑和最大值中,让索引项不断的和其他项进行比较,如果出现其他项较大时,则让索引项变成较大的项,再继续和其他项进行比较,直到结束,这样最后索引项就是最大值了

    所以接下来的思路就是:

1.判断此时白子的两个坐标是否在棋盘外

2.判断此时白子的两个坐标是否有被占用

3.白子落子后,判断白子有无胜利

4.同时发出消息切换造型变成黑子的主动权。

    上面的类容前面两篇都讲过了这里就不在重复了。大家可以发送消息“五子棋”获得程序,当然为了鼓励大家能自己思考,这里的程序还差上面的 1到4步,相信大家在看过这几篇推文后一定能自己做出来。有任何问题可以留言问我哦。

 

《scratch五子棋人机对战》

   

扫码关注卫星公众号《scratch五子棋人机对战》

《scratch五子棋人机对战》

 


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
author-avatar
小女人快乐方子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有