当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=jpeg

作者 | Ahab

转载自公众号Ahab杂货铺(ID:PythonLearningCamp)

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


程序介绍


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

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

代码由 Tetris.pyAI.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

640?wx_fmt=png

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

640?wx_fmt=gif

关于方块形态

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

看图就懂:

640?wx_fmt=png


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


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


收获成果


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


(本文为AI科技大本营转载文章,转载请联系原作者)


精彩推荐


640?wx_fmt=png

推荐阅读:

  • 一个App卖了4亿美元,这家听声识曲公司为何得到Apple的青睐?

  • 对标Bert?刷屏的GPT 2.0意味着什么

  • 5行代码就能入门爬虫?

  • 只需45秒,Python 给故宫画一组手绘图!

  • 我是如何从行政转行做程序媛的? | 程序员有话说

  • 东北到底有没有互联网?!

  • 趣挨踢 | 只有挨踢人才能读懂的西游记

  • 孟岩:JPMCoin 与 Schneier 教授的“区块链无用论”

  • 2月报告:Python逆袭成功?踢馆Java,碾压C++!

640?wx_fmt=png

点击“阅读原文”,打开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 指令&#xff0c;你也能执行一次性地插值&#xff0c;当数据改变时&#xff0c;插值处的内容不会更新。但请留心这会影响到该节点上所有的数据绑定&#xff1a; span v-once>这个将不会改变: {{ msg }}</span> v-html 双大括号会将数据…

【ubuntu工具】bless:二进制查看工具,类似win下的UltraEdit

###安装 sudo apt-get install bless 使用 bless filename 或者执行bless&#xff0c;在图形界面中打开准备操作的文件 工具主界面

马斯克连发三推,发布退出OpenAI内情

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

开发代码命名规范!

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

【linux命令】readelf工具中英文说明

简介 readelf命令用来显示一个或者多个elf格式的目标文件的信息&#xff0c;可以通过它的选项来控制显示哪些信息。 ELF文件由4部分组成&#xff0c;分别是ELF头&#xff08;ELF header&#xff09;、程序头表&#xff08;Program header table&#xff09;、节&#xff08;Se…

再见Python!Yann LeCun警告:深度学习需要新编程语言

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

Linux系统与我之间的故事

2019独角兽企业重金招聘Python工程师标准>>> 说起Linux想必大家都不是很陌生的&#xff0c;关注这方面的不是大神就是对Linux特别热爱的人&#xff0c;那么接下来我给大家介绍下我和Linux之间的一些事&#xff0c;还有如何去快速的学习Linux。 我接触Linux大概就是大…

Google Instant 瞬时搜索上手指南

Google Instant是Google刚刚发布的一种新的搜索方式&#xff0c;随着你在搜索框里输入文字&#xff0c;Google将同时给出搜索结果&#xff0c;同时在搜索框里还会根据你输入的关键字给出搜索建议&#xff0c;通过上下键即可切换。按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 …

“编程不规范,同事两行泪!”

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

记一次 调节有音量界面 上移的bug

如图所示&#xff1a;音量调节的界面直接上移了本来是以为是因为edittext 的原因使得这个界面上移了&#xff08;但其实我也不信&#xff0c;因为我应该影响不了系统的界面&#xff09; 然后最后不断调整布局 不断调整代码 通过排查 发现是因为使用了DTMF的原因&#xff08;用来…

这可能是史上最全的Python算法集!

来源 | CSDN&#xff08;ID&#xff1a;CSDNnews &#xff09;本文是一些机器人算法&#xff08;特别是自动导航算法&#xff09;的Python代码合集。其主要特点有以下三点&#xff1a;选择了在实践中广泛应用的算法&#xff1b;依赖最少&#xff1b;容易阅读&#xff0c;容易理…

Emoji表情图标在iOS与PHP之间通信及MySQL存储

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

【linux】图形界面基础知识(X、X11、GNOME、Xorg、KDE的概念和它们之间的关系)

转载自&#xff1a;https://blog.csdn.net/zhangxinrun/article/details/7332049 简介 LINUX初学者经常分不清楚linux和X之间&#xff0c;X和Xfree86之间&#xff0c;X和KDE&#xff0c;GNOME等之间是什么关系。常常混淆概念&#xff0c;本文以比较易于理解的方式来解释X&…

DreamWeaver做ASP 第13页

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

【linux命令】setterm控制终端属性命令(中英文)

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

搜狗分身技术再进化,让AI合成主播“动”起来

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

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(二)

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

Centos7.4 版本环境下安装Mysql5.7操作记录

Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的&#xff0c;废话就不多赘述了&#xff0c;下面介绍下在centos7.x环境里安装mysql5.7的几种方法&#xff1a;一、yum方式安装 Centos7.x版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所…