首先上源码:

一.概要
使用了2种AI算法:
一种是经典的Pierre Dellacherie算法
一种基于基于深度搜索的算法:

由于时间因,只测试了一次Pierre Dellacherie算法
消行数13W+


第2种算法没有花时间去测试,理论上消行数应该比较可观

下面简单介绍2种AI算法实现思路


二.Pierre Dellacherie算法:(只考虑当前方块) 
Pierre Dellacherie官网:

AI算法主要是评分函数: 所以只介绍评分函数
<1>、尝试着对当前落子的每一种旋转变换、从左到右地摆放,产生所有摆法。 
<2>、对每一种摆法进行评价。评价包含如下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 
 
    各项指标权重经验值: 
    1   -4.500158825082766 
    2   3.4181268101392694 
    3   -3.2178882868487753 
    4   -9.348695305445199 
    5   -7.899265427351652 
    6   -3.3855972247263626 

    最后的评分函数:
    private void ******;;;i++) {
                // 检测当前坐标是否能移动

                // 模拟下落 (类似与人类在大脑思考某种行为的后果如何)

                // 设置当前状态
                
                // 消行
                
                // 遍历下一个方块 (遍历下一个方块函数功能和本函数类似,只是该调用变成了评价函数)
                
                // 恢复背景数组状态(最高点向下copy)
            }
        }
        
        // 找到一个最佳点
        setFind(true);

}  



2.评价函数
再次强调一遍,AI的关键在于评价函数

a. 脑残评价策略
    只考虑2次消行数,  和2次游戏后最终局面的高度
    这样会造成大量空洞,游戏很快死掉

b. 简单评价策略
    在脑残策略的基础上增加了每列的空洞数量
    实现方法也很简单,从最高点向下找空洞
    
    有所改善,但是还是很快死掉

c. 高端策略
    在简单策略的基础上增加:
    a. 高度差之和
    b. 高山数量 (当前列高于临近列)
    c  深坑数量 (当前列低于临近列)
    d  平均高度 
    上面的一些权值反映游戏局面地势的平缓程度
    然后每种取不同权值,权值不同AI效果不同 (经验主义)





Android俄罗斯方块AI设计文档的更多相关文章

  1. Android APP开发需求文档范本

    Android  APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...

  2. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

  3. Atitit.atiagent  agent分销系统 代理系统 设计文档

    Atitit.atiagent  agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...

  4. Net 通用权限管理系统源码 带数据库设计文档,部署说明文档

    Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389

  5. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  6. Access数据库自动生成设计文档

    在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...

  7. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  8. 找回Android studio的帮助文档

    对于业余写点小程序,自娱自乐的我来说,写程序过程的帮助文档非常重要,毕竟不是专业人士.用Visual Studio时,习惯于光标一移到一个类或对象上面,马上出现相应的帮助文档(如图) studio的帮 ...

  9. 厨娘ui设计文档

    厨娘ui设计文档 一.概述 中国的饮食文化从古到今源远流长.在生活日益丰富的今天,人们对饮食的要求不仅仅是温饱,更讲究健康和美味.近年来,饮食甚至成为娱乐的一部分,关于吃的流行用语层出不穷,可见在当今 ...

随机推荐

  1. Ctrl+Scroll改变所有Editor的缩放比例 (Code::Blocks)

    Settings > Editor > Zooming resizes all editors

  2. Latex论文写作-Texsdudio 快捷键总结

    Latex论文写作-Texsdudio 快捷键总结  The keyboard shortcuts can be modified at Options -> Shortcuts. The fo ...

  3. centos 7.0 ln命令 和chkconfig 命令介绍 开机自动启 服务

    有时候centos需要 程序开机启动的时候  自启动 首先在 /etc/init.d/ cd /etc/init.d 文件夹下建立开机启动项 使用ln命令 使用方式 : ln [options] so ...

  4. Linux负载均衡软件LVS简介

    Linux负载均衡软件LVS LVS集群的体系结构以及特点 1. LVS简介        LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起 ...

  5. js实现99乘法表

    实现99乘法表(输出到页面上) * document.write("<table border='1' bordercolor='blue'>"); //循环行 9 f ...

  6. HDInsight 路径问题

    HDInsight中..上传文件的路径是要区分大小写的.. 很变态吧.. 所以项目中要求全部路径使用小写..

  7. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

  8. java常用类 --- Object

    Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...

  9. 360随身WIFI程序单文件绿色版及网卡驱动(附使用感受)

    大家好,我是Colin,今天刚收到传说中的360WIFI,拿到手后马上就进行了测试.就做工而言,19.9的价格算是比较公道的,网卡很小,做工还可以,带磨砂质感,而且还提供了一个耳机插头,可以当挂件一样 ...

  10. 必须知道的.net(继承)

    1.继承定义:就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次. 2.CLR支持实现单继承和接口多 ...