Android俄罗斯方块AI设计文档

首先上源码:

https://github.com/bingghost/SimpleTetris

一.概要

使用了2种AI算法:

一种是经典的Pierre Dellacherie算法

一种基于基于深度搜索的算法:

由于时间因,只测试了一次Pierre Dellacherie算法

消行数13W+

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

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

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

Pierre Dellacherie官网:

http://imake.ninja/el-tetris-an-improvement-on-pierre-dellacheries-algorithm/

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 PierreDellacherie(int boxIndex,int releaseLines) {

int highestY = calcApex(mFirstBoxs);

int landingHeight = landingHeight(boxIndex);

int erodedPieceCellsMetric = erodedPieceCellsMetric(mFirstBoxs,mCurX,mCurY,boxIndex,releaseLines);

int boardRowTransitions = boardRowTransitions(mFirstBoxs,highestY);

int boardColTransitions = boardColTransitions(mFirstBoxs,highestY);

int boardBuriedHoles = boardBuriedHoles(mFirstBoxs,highestY);

int boardWells = boardWells(mFirstBoxs,highestY);

int score = -45*landingHeight + 34*erodedPieceCellsMetric -

32*boardRowTransitions -

93*boardColTransitions -

79*boardBuriedHoles -

34*boardWells;

refreshScore(score);

}

三.基于深度搜索(考虑下一个方块)

1.深度搜索模型

假设游戏宽度为10,只考虑平移下落的可能,在极端的情况下,方块有4种旋转类型 (可以做表优化)

那么对于当前方块则有 4*10 = 40种下落情况

那么有 下一个方块有 4*10 = 40种下落情况

深度遍历则有 40 * 40 = 1600种情况

所以Tetris的AI算法是常量阶

public void seekBestStrategy() {

// 获取当前游戏模型最高点

// 深度搜索存在的情况

for (int rotate = 0;rotate < getRotateCount(mCurType);rotate++) {

for (int i = 0;i < mTetrisGame.mGameWidth - 2;i++) {

// 检测当前坐标是否能移动

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

// 设置当前状态

// 消行

// 遍历下一个方块 (遍历下一个方块函数功能和本函数类似,只是该调用变成了评价函数)

// 恢复背景数组状态(最高点向下copy)

}

}

// 找到一个最佳点

setFind(true);

}

2.评价函数

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

a. 脑残评价策略

只考虑2次消行数,  和2次游戏后最终局面的高度

这样会造成大量空洞,游戏很快死掉

b. 简单评价策略

在脑残策略的基础上增加了每列的空洞数量

实现方法也很简单,从最高点向下找空洞

有所改善,但是还是很快死掉

c. 高端策略

在简单策略的基础上增加:

a. 高度差之和

b. 高山数量 (当前列高于临近列)

c  深坑数量 (当前列低于临近列)

d  平均高度

上面的一些权值反映游戏局面地势的平缓程度

然后每种取不同权值,权值不同AI效果不同 (经验主义)

来自为知笔记(Wiz)

时间: 2024-11-08 20:25:12

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

软件需求工程与建模--搜索引擎项目--设计文档

第一章      绪论 一.  搜索引擎出现的背景及意义 网络的出现以及发展对于世界发展的意义是极其重要的,它让地球村的理念变成的现实,信息的传输不再受到时间和空间的限制. 随着网络技术和应用的不断发展,互联网已经成为了信息的重要来源地,人们越来越依靠网络来査找他们所需要的信息.我们所处的是一个信息爆炸的时代, Google的索引在1998年开始工作,当时他们]收集了2600万个页面,2000年就突破了10亿,到10年后的2008年达到了1,000,000,000,000,Google的数据库变

设计文档1.0

今天吃啥APP设计文档 项目组长:杨乾成 张陈杰成员:林朝洋 梁翘楚 孟苏 李景怡 叶沛玟 赵昕颖 1 设计概述 1.1 条件与限制 建议系统的运行寿命:5 年 经费.投资方面的来源和限制:自营 法律和政策方面的限制:不得侵犯学生和商家权利,不得与相关政策违背 硬件环境:性能良好的服务器 开发环境:Android Stdio.MySQL.JAVA 相关的开发软件等 可利用的信息和资源:参考文献,所学的高级编程语言和数据库知识 系统投入使用的最晚时间:2 个月 1.2 运行环境概述 支持环境:An

《团队-科学计算器-设计文档》

设计文档: 项目:科学计算器 编辑器:python 所运用知识: 1.字符串的处理 2.正则表达式的运用 3.函数递归 基本思路: 需要优先处理内层括号运算--外层括号运算--先乘除后加减的原则: 1.正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进行正则处理,先获取最里层的每一个数据,然后一一计算 2.把有括号的计算公式计算出来的结果替换原来初始公式的位置,计算之前分别对重复运算符进行处理需要处理的重复运算 3.然后依次从里到外去除括号并进行计算,和位置替

《结对编项目作业名称-设计文档》

项目:关灯游戏,所用软件,pygame 成员:祁昊,刘孝东 关灯游戏设计文档: pygame作为一种游戏编程语言,以其简单性.可移植性等优点,得到了广泛地应用,特别是py使用比c,c++等语言简便,使其成为网络编程首选编程语言.,Pygame是跨平台Python模块,专为电子游戏设计.基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python.工具tile编辑器和一个关卡编辑器.得到广大程序员的接受和认可. "关灯游

Storm项目:流数据监控1《设计文档…

该文档为实实在在的原创文档,转载请注明作者及出处. 类型 详细 备注 2 该文档为原创模拟项目:流数据监控<1>文档<流数据监控设计文档>,相继会给出流数据监控<2>文档<流数据监控代码解析>及其他文档 2  该部分有源码(熬夜写出来的哦) CSDN中相应项目CODE链接:戳这里     相关描述 2  有任何其他想法,可以邮件[email protected] 2 文档及相关资料下载请到个人360云盘http://yunpan.cn/QGf2GDaRFpc

Atitit.atiagent &#160;agent分销系统 代理系统 设计文档

Atitit.atiagent  agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 8. 查看下级玩家6 9. 查看下级代理7 10. 数据库文档 agent7 10.1. Acc 用户帐号以及上级代理id关联字段7 10.2. 充值记录表8 1. 启动项目 C:\0workspace\AtiPlatf_cms\resin run q2b_game.bat Prj::cms 数据库

android docs本地帮助文档打开特别慢的解决方法

1.断网,使用IE打开 2.使用火狐浏览器脱机浏览 android docs本地帮助文档打开特别慢的解决方法,布布扣,bubuko.com

《结对-自然语言进行数据库查询系统-设计文档》

二〇一七年九月十四日十点一刻少两分钟 关于结对编程的设计文档: 题目:自然语言进行数据库查询系统 编程语言:C# 数据库:MySql ,其他逐渐扩展 软件所要实现的功能: 用户打开软件之后可以连接到数据库,并且通过自然语言进行数据库的查询,例如我想知道小明的学号,如果在数据库中查询需要输入 select ID from 学生表 where name = "小明"才能实现,我们要做的是,输入查询小明的学号,软件就可以将自然语言转换成sql语句进行数据库的查询. 所要实现的功能: 1.进行

为什么要写设计文档

日趋一日,程序员能够在更少的时间内完成更多的事情.使用今日的高级编程语言,开发环境,工具和“快速应用开发”思想,程序员和经理都已经习惯于急速的开发周期.今日的程序员更倾向于直接跳入到编码之中,害怕花费在非编码工作中的每一小时,都会导致项目截止日期前的周末多加一个小时班. 编码之前做设计这一过程已经变得过时了,将设计文档化就更罕见了.很多程序员从来没有写过设计文档,面对要写设计文档这一想法都畏缩不前.即使被要求写,通常来说也只是产出了一大堆的交互图和类图,这些图表大多没有表达程序员在设计阶段的思考