四年前曾经写过一过博客:

对 游戏 《 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浏览器下自动运行游戏篇的更多相关文章

  1. 跟k8s工作负载Deployments的缘起缘灭

    跟k8s工作负载Deployments的缘起缘灭 考点之简单介绍一下什么是Deployments吧? 考点之怎么查看 Deployment 上线状态? 考点之集群中能不能设置多个Deployments ...

  2. 再探JS数组原生方法—没想到你是这样的数组

    最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...

  3. Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)

    1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...

  4. Android 带你玩转实现游戏2048 其实2048只是个普通的控件

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...

  5. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  6. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  7. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  8. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  9. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  10. Andorid游戏2048开发(一)

    最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...

随机推荐

  1. 如何将 iPhone 的照片同步到 windows 电脑上

    首先在电脑上,新建一个文件夹,并把共享权限打开. 文件夹 右键 属性,共享,添加 Everyone. 然后,让手机和电脑连接到同一个局域网,手机热点即可. 在手机端看 文件 app,找到电脑的共享文件 ...

  2. mysql case when使用

    ## mysql case when使用 SELECT order_no,case is_test when 0 then '否'when 1 then '是'end as '是否测试' from ` ...

  3. 基于Web3.0的区块链图片上传

    开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点 什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了) 需求:开发一个基于Python的Web 3.0图片上传系统.这个系 ...

  4. Nginx+Fail2ban 实现同一ip在一分钟内连续三次请求同一接口并响应成功时进行封禁

    1. 安装 Fail2Ban 和 Nginx 如果尚未安装 Fail2Ban 和 Nginx,可以使用以下命令进行安装: # CentOS默认的仓库中可能不包含Nginx,所以需要添加EPEL(Ext ...

  5. TRL(Transformer Reinforcement Learning) PPO Trainer 学习笔记

    (1)  PPO Trainer TRL支持PPO Trainer通过RL训练语言模型上的任何奖励信号.奖励信号可以来自手工制作的规则.指标或使用奖励模型的偏好数据.要获得完整的示例,请查看examp ...

  6. 图片接口JWT鉴权实现

    图片接口JWT鉴权实现 前言 之前做了个返回图片链接的接口,然后没做授权,然后今天键盘到了,也是用JWT来做接口的权限控制. 然后JTW网上已经有很多文章来说怎么用了,这里就不做多的解释了,如果不懂的 ...

  7. Linux 时间 与 定时器

    背景 在学习 Linux 信号 有关知识中,提到了 alarm函数. 进程时间 (原文地址:https://www.cnblogs.com/clover-toeic/p/3845210.html) 进 ...

  8. hive案例:hive对房产数据进行过滤

    数据: 天通苑北一区 3室2厅 510万 1.01101E+11 天通苑北一区 3-2厅 143.09 平米 南北 简装 有电梯 35642 510旗胜家园 2室1厅 385万 1.01101E+11 ...

  9. 【数据集】Maple-IDS——网络安全恶意流量检测数据集

    一.数据集介绍 Maple-IDS数据集是一个网络入侵检测评估数据集,旨在增强异常基础入侵检测系统(IDS)和入侵预防系统(IPS)的性能和可靠性.随着网络空间安全领域攻击的日益复杂化,拥有一个可靠和 ...

  10. oeasy 教您玩转 linux 之 010302 火狐浏览器 firefox

    我们来回顾一下 上一部分我们都讲了什么? oneko xeyes 这次看看这个火狐 火狐 看看当前版本 看看是否可以更新 如果需要更新就更新    firefox -v    apt search f ...