再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(1) —— Firefox浏览器下自动运行游戏篇
四年前曾经写过一过博客:
对 游戏 《 2048 》 的一些思考
虽然过去几年了,但是这个游戏一直没有搞懂该怎么使用AI算法来进行求解,这里再次对这个问题进行一些探索。
========================================
首先说明下,这个《2048》游戏确实很火,自己当年也是好一通研究,最后还是无疾而终,最近无意间又想起这个东西来了,正好这几年也是在从事AI方面的事情,想想自己这么长时间的一些积累或许可以再次尝试这个游戏的AI解决了。
这个《2048》游戏的AI解决难易适中,不想围棋那种需要Alpha go这种庞大的算法和计算平台要求,但是又不能依靠简单的遍历搜索来训练较好的解决方案,在一定level上来说这个游戏的难易度很适合个人AI玩家来尝试和练手的。
AI算法并不同于机器学习算法,应该说AI算法是包括机器学习算法的,或者说机器学习算法是AI算法的一个子集。只要可以替代人类脑力或体力去自动化解决问题的算法我们都可以认为是AI算法,也就是说AI算法就是可以模仿人类功能的计算机算法,而机器学习算法是指通过数据不断训练来使算法学习到适合的模型参数或模型结构的方法,机器学习主要体现在两个点:一个是原来训练和学习的数据;一个是可以根据数据来进行训练的学习,学习模型参数或模型结构。
外网对于《2048》游戏的AI解法早有讨论,比较有代表性的为:
What is the optimal algorithm for the game 2048?
其中,投票率最高的解决方法是启发式AI算法:

该启发式AI方法的github代码地址:
https://github.com/nneonneo/2048-ai
该代码clone在国内gitee代码库上:
https://gitee.com/devilmaycry812839668/highest_vote_2048_ai
=========================================================
我们这里主要是针对投票率最高的对应的启发式算法 鬼&泣 / 2048-ai 进行分析。
启发式算法,某种程度上我们可以将其理解为基于预设规则的算法。人类解决某件事情所采用的方法可以理解为人类的策略或规则,但是人类针对某件事情所采用的策略或规则很难翻译成计算机语言,那么如何把人类的策略翻译成计算机可以识别并执行的策略呢?根据计算机可以识别并执行的策略或规则所设计的算法我们一般叫做启发式算法。
在《2048》游戏中人类在打游戏时所采用的策略一般有:
参考:https://soft.zol.com.cn/jingyan/59663.html
高分法则:
最大数尽可能放在角落。
数字按顺序紧邻排列。
首先满足最大数和次大数在的那一列/行是满的。
时刻注意活动较大数(32以上)旁边要有相近的数。
以大数所在的一行为主要移动方向
不要急于“清理桌面”。
需要注意的是,为了保持最大数在角落,所有最大数可能移动的方向都不能再操作了,比如选择了左上角,那么就不能向右和向下移动其他的方块,这样操作的灵活性会相对减少,难度就会增加。这时,建议玩家除了选定一个角以外,再固定一条边,将大的数字放这条边上,这样就可以朝三个方向移动,比如选定左上角,填满最大数右边的所有方块,就可以朝上,左,右三个方向移动了。
经过分析可以知道在《2048》游戏中我们人类在操作时所遵循的规则一般有:保证最大的数字和第二大的数字在角落上不动,这边我们需要保证最大数字的一边被其他数字填满,这样的话保证最大数字不动的前提下可以有三个方向可以被用来操作。
根据 https://stackoverflow.com/questions/22342854/what-is-the-optimal-algorithm-for-the-game-2048 中最高投票率的回帖,我们需要遵守的规则还可以有:保证最大可能性有空格出现,最大可能性有一行或一列中有相同数字挨着的出现(可以在下一步中被合并),尽量保证每行或每列都是保证单调增或减的数字排列等。
可以看到人类的策略虽然人类用来理解还是可以的,但是如何翻译成计算机可以理解的语言呢,从而根据计算机可以理解的语言或规则编写出启发式算法呢。在 鬼&泣 / 2048-ai 中则把不同情况的游戏画面(数字排序顺序)根据刚才人类的评价和遵循规则给出评分,并根据某步操作后获得的后续操作得到的画面加权值最高(最高得分)来给出下一步的操作,该种方式所设计的启发式算法被证明可以有效的解决《2048》游戏。
============================================
下面给出在 鬼&泣 / 2048-ai 中对在Firefox浏览器下自动运行游戏《2048》。
具体见: https://gitee.com/devilmaycry812839668/highest_vote_2048_ai/tree/devilmaycry
在Firefox浏览器中自动运行游戏,其原理就是利用浏览器调试模式下可以自动运行传入的js脚本,从而实现在浏览器中调试js程序的目的。由于《2048》游戏一般均为js语言编写的,我们打开游戏的原始页面则会自动在浏览器中加载《2048》游戏的js代码,然后我们在Firefox浏览器开启调试模式情况下为该页面注入自己编写的js代码来实现获得《2048》游戏的状态信息和得分情况,同时我们还可以通过注入JS代码的方式模拟键盘操作来实现自动操控《2048》页面游戏的目的。
使用Firefox浏览器进行调试需要设置浏览器:
浏览地址框中输入 about:config
设置选项:
- devtools.debugger.prompt-connection 为 false
- devtools.debugger.remote-enabled 为 true
- devtools.chrome.enabled 为 true


============================================
设置好Firefox后需要关闭浏览器。
再次打开Firefox需要采用运行命令行的方式启动Firefox:

firefox --start-debugger-server 32000
使用Firefox浏览器运行一次:
brower_autorun/2048_demo.py -b firefox
使用Firefox浏览器运行100次: (把100次的运行结果保存在调用命令执行的当前目录下的result.log)
brower_autorun/2048_100times_evalue.py -b firefox
执行上面命令结果将被保存在highest_vote_2048_ai文件夹下面result.log文件中:
result.log 中保存的结果格式为:score, maxval, elapse_time, moveno
含义为:
得分,最大数,总运行时长(秒),总执行步数

=============================================
在 2048_100times_evalue.py 中:

如果返回的游戏状态字段为"ended",那么则意味则游戏是结束状态。
游戏表现形式为:

如果游戏状态为“ended”后需要调用 gamectrl.restart_game() 方法来获取新一局的游戏。
对于游戏状态为 “win” 时需要调用 gamectrl.continue_game() 方法,该方法的使用意义并不是很了解,因为是follow其他人的工作,所以也就这样承接下来这个操作了。

获取当前游戏的得分值:

获取当前游戏的状态值:

获得的board为16个元素的列表,每个元素取值范围为0~15,形式如:
[
[3,0,1,2],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15],
]
如果进行状态打印的话我们需要把每个元素x 进行2**x 操作。
如果进行算法可以识别的形式,需要如下操作:

=============================================
在《2048》游戏中, 行为2 2 2 2,右移得 0 0 4 4, 再次右移得 0 0 0 8 。
=============================================
在maser分支中,编译代码( ubuntu系统中 ):
./configure make
再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(1) —— Firefox浏览器下自动运行游戏篇的更多相关文章
- 跟k8s工作负载Deployments的缘起缘灭
跟k8s工作负载Deployments的缘起缘灭 考点之简单介绍一下什么是Deployments吧? 考点之怎么查看 Deployment 上线状态? 考点之集群中能不能设置多个Deployments ...
- 再探JS数组原生方法—没想到你是这样的数组
最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)
1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- H5版俄罗斯方块(3)---游戏的AI算法
前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- Andorid游戏2048开发(一)
最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...
随机推荐
- 三月二十五日 安卓打卡app开发
今天完成了每月打卡次数统计功能 public static String count(String account) throws SQLException { Connection connecti ...
- 基于SQLite3的C学习总结
背景 针对 SQLite3 的学习总结 arm linux 移植 SQLite 3 如何在 Linux 上移植使用 SQLite3,标题虽然是在讲 arm linux,但实际上是跨平台的. 基于 SQ ...
- paraview安装
apt 安装 sudo apt install paraview 安装包安装 参考 https://blog.csdn.net/weixin_47492286/article/details/1272 ...
- vue大型电商项目尚品汇(前台篇)day03
堆积了两天一起发的,先祝大家节日快乐 后面任务很繁重,还有登录注册组件还有后台管理页面,真的繁重,我现在感觉每天全天时间都在学都不一定学得完,主要想在六月一号之前把整个项目过一遍.看看能不能创造奇迹 ...
- 深度学习领域的名词解释:SOTA、端到端模型、泛化、RLHF、涌现 ..
SOTA (State-of-the-Art) 在深度学习领域,SOTA指的是"当前最高技术水平"或"最佳实践".它用来形容在特定任务或领域中性能最优的模型或方 ...
- 4. 简明说一下 CSS link 与 @import 的区别和用法?
两者的基本语法 link语法结构 <link href="外部CSS文件的URL路径" rel="stylesheet" type="text/ ...
- 妙趣横生:利用Echarts实现SpreadJS引用从属关系的可视化魅力
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单 ...
- 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?
1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...
- [oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
进制转化 回忆上次内容 上次了解的是 整型数字类变量 integer 前缀为i 添加图片注释,不超过 140 字(可选) 整型变量 和 字符串变量 不同 整型变量 是 直接存储二进制形 ...
- oeasy教您玩转vim - 26 - 缩进设置
缩进设置 回忆上节课内容 这次了解了颜色的细节 设置 256 色模式 :set t_Co=256 然后确定了具体的各种颜色 还可以生成网页 :TOhtml 还有什么好玩的么? 缩进设置 在 ...