如何让AI教机器自己玩俄罗斯方块?
作者 | Ahab
转载自公众号Ahab杂货铺(ID:PythonLearningCamp)
人工智能大火的今天,如果还是自己玩俄罗斯方块未免显得太 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# 每种块包含的四个小方块相对坐标分布
2 self.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。
(本文为AI科技大本营转载文章,转载请联系原作者)
推荐阅读:
一个App卖了4亿美元,这家听声识曲公司为何得到Apple的青睐?
对标Bert?刷屏的GPT 2.0意味着什么
5行代码就能入门爬虫?
只需45秒,Python 给故宫画一组手绘图!
我是如何从行政转行做程序媛的? | 程序员有话说
东北到底有没有互联网?!
趣挨踢 | 只有挨踢人才能读懂的西游记
孟岩:JPMCoin 与 Schneier 教授的“区块链无用论”
2月报告:Python逆袭成功?踢馆Java,碾压C++!
点击“阅读原文”,打开CSDN APP 阅读更贴心。
相关文章:

【驱动】内核打印级别设置
在uboot中设置 setenv loglevel loglevel8 setenv loglevel debug setenv loglevel quiet setenv loglevel setenv mmcargs run set_disp; setenv bootargs console${console},${baudrate} ${loglevel} ${smp} root${mmcroot} ${disp_args}内核对应代码 main.c (init) 467 s…

vue基本标签
2019独角兽企业重金招聘Python工程师标准>>> vue基本是数据驱动,数据双向绑定,组件化,常用标签v-modal,v-html,v-if,v-else,v-show,v-for,v-on(简写),v-bind(简写 :) vue.js 兼具 angular.js 和 react.js 的优点&#…

C#操作域用户
using System;using System.DirectoryServices;namespace SystemFrameworks.Helper{ /// ///活动目录辅助类。封装一系列活动目录操作相关的方法。 /// public sealed class ADHelper { /// ///域名 /// private static s…

Redis进阶实践之三如何在Windows系统上安装安装Redis
一、Redis的简介 Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/po…

31页PPT概述:图神经网络表达能力有多强?
整理 | 一一出品 | AI科技大本营近年来,图神经网络的研究成为深度学习领域的热点。图是一种数据结构,它对一组对象(节点)及其关系(边)进行建模,由于图结构的强大表现力,用机器学习方…

【linux】Linux kernel uapi header file(用户态头文件)
uapi目录的创建原因 Linux在3.7以后把很多header file移到 include/uapi或是arch/xxxx/include/uapi下,为了解决include recursive(循环包含头文件)的问题。 英文参考文档:https://lwn.net/Articles/507794/ 解决include recur…

诊断IIS中的ASP0115错误
诊断IIS中的ASP0115错误 作者:未知 重要说明:本文包含有关修改注册表的信息。修改注册表之前,一定要备份注册表,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和编辑注册表的信息,请单击下面的文章…

【imx6】libipu.so.0说明
###代码位置 在目录fsl-release-bsp/build-fb/tmp/work/imx6qsabresd-poky-linux-gnueabi/imx-lib/1_3.14.28-1.0.0-r0/imx-lib-3.14.28-1.0.0/ipu中 编译完成后有如下文件列表 ipu$ ls Android.mk libipu.so Makefile mxc_ipu_hl_lib_dummy.c mxc_ipu_hl_lib.…

“安利”一款debug神器:在AI面前,bug都不是事儿
作者 | 琥珀出品 | AI科技大本营(公众号ID:rgznai100)为了帮程序员解决 bug 问题,Facebook 可算是操碎了心!你可以这么想,如果在开发和测试阶段没有发现 bug 问题,那么 bug 将会随着产品发布&am…

Spring中@Value用法收集
一、配置方式 Value需要参数,这里参数可以是两种形式: Value("#{configProperties[t1.msgname]}") 或者 Value("${t1.msgname}"); 这两形式,在配置上有什么区别: 1、Value("#{configPropert…

vue从入门到进阶:指令与事件(二)
一.插值 v-once 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上所有的数据绑定: span v-once>这个将不会改变: {{ msg }}</span> v-html 双大括号会将数据…

【ubuntu工具】bless:二进制查看工具,类似win下的UltraEdit
###安装 sudo apt-get install bless 使用 bless filename 或者执行bless,在图形界面中打开准备操作的文件 工具主界面

马斯克连发三推,发布退出OpenAI内情
整理 | 一一出品 | AI科技大本营(ID:rgznai100)美国时间 2 月 17 日,特斯拉 CEO 马斯克在 Twitter 连发三帖,道出自己退出人工智能研究组织 OpenAI的缘由。他在推文中表示,他已经有一年多时间没有深度参与 OpenAI 事务…

开发代码命名规范!
今天查看以前的资料看见代码命名规范。呵呵 就拿出来给大家分享以下,还是比较老的。估计现在也是这种开发的命名规范。仅供参考!谢谢。 1.用Pascal规则来命名方法和类型。 public class DataGrid { public void DataBind() {…

【linux命令】readelf工具中英文说明
简介 readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。 ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Se…

再见Python!Yann LeCun警告:深度学习需要新编程语言
整理 | 一一出品 | AI科技大本营尽管工程师们普遍定位 Python 是简单、优雅的编程语言,但它并非毫无缺点,比如人们一直吐槽它的执行速度不够快,线程不能利用多 CPU 等缺点,如今 AI 界泰斗也放话说要用新编程语言替代 Python。Face…

Linux系统与我之间的故事
2019独角兽企业重金招聘Python工程师标准>>> 说起Linux想必大家都不是很陌生的,关注这方面的不是大神就是对Linux特别热爱的人,那么接下来我给大家介绍下我和Linux之间的一些事,还有如何去快速的学习Linux。 我接触Linux大概就是大…
Google Instant 瞬时搜索上手指南
Google Instant是Google刚刚发布的一种新的搜索方式,随着你在搜索框里输入文字,Google将同时给出搜索结果,同时在搜索框里还会根据你输入的关键字给出搜索建议,通过上下键即可切换。按TAB键可自动补全第一位的搜索建议。随着你不断…

【视频】显示器固定参数struct fb_fix_screeninfo中char id[16]说明
imx6q关于fb和video的设备信息 设备节点 root@myzr:/unit_tests# ls /dev/fb* -l lrwxrwxrwx 1 root root 3 Jan 1 1970 /dev/fb -> fb0 crw-rw---- 1 root video 29, 0 Jan 1 1970 /dev/fb0 crw-rw---- 1 root video 29, 1 Jan 1 1970 /dev/fb1 crw-rw---- 1 …

“编程不规范,同事两行泪!”
【编者按】编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是:写注释、写文档、别人不写注释、别人不写文档。更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的“代码千万行,注释第…

记一次 调节有音量界面 上移的bug
如图所示:音量调节的界面直接上移了本来是以为是因为edittext 的原因使得这个界面上移了(但其实我也不信,因为我应该影响不了系统的界面) 然后最后不断调整布局 不断调整代码 通过排查 发现是因为使用了DTMF的原因(用来…

这可能是史上最全的Python算法集!
来源 | CSDN(ID:CSDNnews )本文是一些机器人算法(特别是自动导航算法)的Python代码合集。其主要特点有以下三点:选择了在实践中广泛应用的算法;依赖最少;容易阅读,容易理…

Emoji表情图标在iOS与PHP之间通信及MySQL存储
在某个 iOS 项目中,需要一个服务器来保存一些用户数据,例如用户信息、评论等,我们的服务器端使用了 PHPMySQL 的搭配。在测试过程中我们发现,用户在 iOS 端里输入了 Emoji 表情提交到服务器以后,PHP 无法在 MySQL 数据…

【linux】图形界面基础知识(X、X11、GNOME、Xorg、KDE的概念和它们之间的关系)
转载自:https://blog.csdn.net/zhangxinrun/article/details/7332049 简介 LINUX初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE,GNOME等之间是什么关系。常常混淆概念,本文以比较易于理解的方式来解释X&…

DreamWeaver做ASP 第13页
第七步:修改资料篇 修改资料!首先要清醒一点,什么人才可以修改。 一,本人只能修改自己的;二,管理员可以修改所有人的。 那今天先来搞个可以修改自己资料的页面。 顺序是:先确认是正确登录&#…

【linux命令】setterm控制终端属性命令(中英文)
###setterm中文 SETTERM(1) 用户命令 SETTERM(1) 名字 setterm - 设置终端属性 概要 setterm [选项] 描述 setterm向终端写一个字符串到标准输出,调用终端的特定功能。在虚拟终端上使用,将会改变虚拟终端的输出特性。不支持的选项将被忽略。 选项 对…

搜狗分身技术再进化,让AI合成主播“动”起来
整理 | 一一出品 | AI科技大本营去年 11 月的互联网大会期间,搜狗与新华社联合发布全球首个AI合成主播一经亮相,引起了人们对“AI媒体”的广泛讨论。如今,搜狗 AI 合成主播不断更新迭代。2 月 19 日,在新华社新媒体中心与搜狗公司…

Angular http跨域
var app angular.module(Mywind,[ui.router]); app.controller(Myautumn,function($scope,$http,$filter){ //$http跨域 //服务端设置 // 访问权限 response.setHeader("Access-Control-Allow-Origin", "*"); // 访问类型 response.setHeader(&q…

文本分类step by step(二)
(注:如有转载请标明作者:finallyliuyu, 和出处:博客园) 《文本分类 step by step(一)》 在《文本分类step by step(一)》中,我们从处理语料库开始讲起,一直讲到利用分类器…

Centos7.4 版本环境下安装Mysql5.7操作记录
Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的,废话就不多赘述了,下面介绍下在centos7.x环境里安装mysql5.7的几种方法:一、yum方式安装 Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所…