0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何让AI教机器自己玩俄罗斯方块?

电子工程师 来源:lq 2019-02-19 09:17 次阅读

人工智能大火的今天,如果还是自己玩俄罗斯方块未免显得太 LOW,为什么不对游戏升级,让机器自己去玩俄罗斯方块呢?有了这个想法之后,我用了两天时间去搜集了大量资料,在电脑死机好多次之后终于将 AI 俄罗斯方块实现了。

程序介绍

所谓让机器自己去玩俄罗斯方块,就是让机器计算当前方块的所有形态可放置的所有位置,然后根据统一的评价标准,计算出最优的位置进行放置。这个评价的标准简单的来说就是:板块放置的位置越靠下越好,方块之间越紧密越好,自身对消除行的方块贡献数量越多越好,但是这里还要注意的是不可为了追求消除行数,而去造成过多的空洞,这样也是不合理的。

关于 AI 算法主要有两种:一种是经典的 Pierre Dellacherie 算法,一种基于基于深度搜索的算法。深度搜索需要优化的地方很多,假如计算的层数不够、没有高效剪枝,一不小心容易写成人工智障,时间复杂度也不好。Pierre Dellacherie 算法更加清晰,复杂度更低。但是该算法只考虑当前,不对未来的情况进行计算,注重的是“不死性”,追求方块的“密集”,有时就算可以一次性消除 3 行,却会使全局方块更加“疏”,即过多的空洞。

代码由Tetris.py、AI.py和Utils.py三部分组成,游戏的主要逻辑由 Tetis 控制,Utils 定义了方块的样式,AI 顾名思义实现了主要的 AI算法。

具体介绍

Pierre Dellacherie 算法

只考虑当前方块,不对未来的情况进行计算,注重的是“不死性”,算法每次生成一个方块,便穷举该方块所有旋转的落点。一种方块最多有 4 种旋转,并且由于游戏界面是 10*20 的,所以对于每个旋转形状,只需要考虑 10 种落点。算法的核心是一个评估函数,对穷举出的每一种下落情况,计算 6 个参数值,用评估函数加权求和得到一个值,该值最大的情况便是目前方块的最优下落位置,六个参数分别是:

1. 下落高度(Landing Height)

当前方块落下去之后,方块中点距底部的方格数(事实上,不求中点也是可以的)。

2. 消行数(Rows eliminated)

消行层数与当前方块贡献出的方格数乘积。

3. 行变换(Row Transitions)

从左到右(或者反过来)检测一行,当该行中某个方格从有方块到无方块(或无方块到有方块),视为一次变换。游戏池边界算作有方块。行变换从一定程度上反映出一行的平整程度,越平整值越小;

该指标为所有行的变换数之和;

如图:■ 表示有方块,□ 表示空格(游戏池边界未画出)

■■□□■■□□■■□□ 变换数为 6

□□□□□■□■□■□■ 变换数为 9

■■■■□□□□□□■■ 变换数为 2

■■■■■■■■■■■■ 变换数为 0

4. 列变换(Column Transitions)

大意同上,列变换从一定程度上反映出一列中空洞的集中程度,空洞越集中值越小。

5. 空洞数(Number of Holes)

6. 井的总和(Well Sums)

井指两边皆有方块的空列。该指标为所有井的深度连加到 1 再求总和。

注意一列中可能有多个井,如图:

■□□

■□■

■□■

■■■

■□■

■□■

■□■

中间一列为井,深度连加到一的和为 (2+1)+(3+2+1)=9

评估函数如下 (首字母简写):

关于方块形态

这里对 AI 俄罗斯方块的形态做一下特别说明,各个方块都是根据中心点的坐标来生成的,以(0,0)为中心点,在 x、y 轴加减 1 则是其他方格的坐标,这样的好处就是只要确定中心点坐标,其他的方格位置就能随即生成。

看图就懂:

1#每种块包含的四个小方块相对坐标分布 2self.shapes_relative_coords=[ 3[[0,0],[0,0],[0,0],[0,0]], 4[[0,-1],[0,0],[0,1],[0,2]], 5[[0,-1],[0,0],[0,1],[1,1]], 6[[0,-1],[0,0],[0,1],[-1,1]], 7[[0,-1],[0,0],[0,1],[1,0]], 8[[0,0],[0,-1],[1,0],[1,-1]], 9[[0,0],[0,-1],[-1,0],[1,-1]],10[[0,0],[0,-1],[1,0],[-1,-1]]11]

基于深度搜索的方法暂不介绍。

收获成果

以上,感兴趣的同学可通过网盘获取源代码:https://pan.baidu.com/s/1gC6sF62Pz5D6rh6eicOZUw,提取码: k17b。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人工智能
    +关注

    关注

    1775

    文章

    43716

    浏览量

    230494
  • 机器
    +关注

    关注

    0

    文章

    756

    浏览量

    40480
  • AI算法
    +关注

    关注

    0

    文章

    212

    浏览量

    12096

原文标题:如何让AI教机器自己玩俄罗斯方块?

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    拜求 labview设计的俄罗斯方块

    拜求 labview设计的俄罗斯方块拜求 labview设计的俄罗斯方块
    发表于 11-02 09:31

    俄罗斯方块

    俄罗斯方块程序
    发表于 05-24 22:26

    俄罗斯方块

    单片机做的俄罗斯方块游戏
    发表于 07-31 19:56

    俄罗斯方块仿真

    网上找的俄罗斯方块游戏,自己连接的图,程序,希望大家喜欢
    发表于 12-02 12:16

    c语言版的俄罗斯方块

    c语言版的俄罗斯方块自己写的,一时高兴和大家分享
    发表于 12-03 18:09

    汇编版的俄罗斯方块

    汇编版的俄罗斯方块也是自己写的 同样和大家分享
    发表于 12-03 18:13

    俄罗斯方块

    俄罗斯方块
    发表于 04-23 16:53

    俄罗斯方块

    俄罗斯方块........................................................................................
    发表于 03-13 23:08

    自编俄罗斯方块

    新手自己编写的俄罗斯方块,BUG有点多,有大神能够指导一下吗?
    发表于 10-25 08:52

    AI俄罗斯方块

    ,还能打开AI功能,程序自己来找到合适位置并摆放,最终程序也实现了我的预期。下面是程序的示意,它可是在自动哦:原计划给自己一周的时间(包
    发表于 02-10 20:08

    俄罗斯方块源码(带烟花版)

    俄罗斯方块源码(带烟花版)游戏简介经典游戏,俄罗斯方块,源码公布。我争取简化功能,使结构清晰、框架简单,代码更容易看懂。每打到300分,速度增加一级。同时消去两
    发表于 08-02 09:55 0次下载

    基于单片机实现的俄罗斯方块游戏

    自己弄的分享给大家,关于单片机的俄罗斯方块游戏
    发表于 11-10 10:47 22次下载

    8乘8点阵俄罗斯方块(代码+仿真)

    自己做的俄罗斯方块游戏,附系统实物图,proteus仿真,源代码
    发表于 04-29 11:28 86次下载

    俄罗斯方块主程序讲解

    俄罗斯方块主程序讲解
    发表于 04-21 09:16 29次下载

    汇编俄罗斯方块8.8点阵

    两个单片机控制8*8点阵的俄罗斯方块程序
    发表于 11-15 17:18 3次下载