Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【参赛经验分享】含可以手玩的网页版(带AI)

【参赛经验分享】含可以手玩的网页版(带AI)

原创
作者头像
用户8875579
修改于 2021-08-23 03:32:44
修改于 2021-08-23 03:32:44
1.1K0
举报
文章被收录于专栏:竞赛与技术竞赛与技术

最终提交分数433550

游戏初步分析

简单看了一下游戏源代码,可以发现:(1)游戏里面共有10000块;(2)游戏里面每一块都是确定的,和操作无关。

然后再试试游戏的提交分数函数,又发现:(3)在后端的评分程序(下同),每一块移动时不能穿越其他块(横向和纵向都不能穿越);(4)可以中途悬停(即使前几天游戏界面没有悬停按钮)。

第一次尝试

知道这些之后,就用C++把游戏复刻出来。见https://pastebin.com/4mbSk8US(用里面的old_main函数替换main函数可以从标准输入读入操作序列并计算得分)。接着写了很简单的代码尝试自动搜索方块位置,但是这样的代码只能拿到7000余分,远远不够。考虑到C++不容易对游戏进行操作(“手玩”),因此放弃了。

第二次尝试

我想起了以前了解的一个俄罗斯方块AI。这个AI的介绍可以见这里

AI的原理

每个方块最多有4个方向(部分方块旋转180度后和原来相同,因此只有两个),先将旋转后的方块左右移动,最多有10种位置(通常会只有7-9种),然后往下移动到触底为止。考虑连续2个方块,最多有1600种不同放法。对每个放法,考虑以下4个指标:

  1. Aggregate Height:每一列最上面的格子(含)到底部的方块数称为每列的高度,这个指标是所有列高度的和。
  2. Complete Lines:就是可以消去的行数。
  3. Holes:上面有方格的空位(“洞”)的个数。
  4. Bumpiness:通常情况下相邻两列高度不应相差过大,考虑相邻两列高度差的绝对值,共有9个“相邻两列”,这个指标是9个绝对值的和。

然后对这4个指标加权求和,选择其中加权和最大的方块。原博客使用遗传算法优化4个权重。

遗传算法

p为某个权重向量(模归一化为1),取100个随机的方块序列(每次计算的方块序列重新生成),每个序列有500个方块,f(p)定义为该权重下AI能消去的总行数(在遗传算法中,称为“适应度")。遗传算法包括以下步骤:

  1. 初始化:生成1000个随机向量,并计算它们的适应度。
  2. 交叉:在1000个随机向量中随机取100个,然后取100个向量中最好的2个进行杂交(即按适应度加权平均,适应度高的权重大,然后将模归一化为1),如此生成300个新向量。
  3. 变异:每个新向量有5%的概率变异,变异会将随机一个分量的值加上-0.2至0.2间的随机数。变异后模再次归一化为1。
  4. 选择:所有1300个向量中,最差的300个被丢弃,其余回到第2步重新开始。

2-4三步可反复执行,直到效果足够好为止。最终原作者得到的四个权重分别为-0.510066、0.760666、-0.35663和-0.184483。如果7种方块等概率出现,该算法可消去至少200万行。

算法的应用

为了应用于本比赛,需要修改里面的计分函数和生成方块的函数,这样直接运行仍然只有8000多分。进一步对AI进行修改:

  1. 每一步不能在没有消除任何行的情况下占用顶行(按源代码中给出的规则)
  2. 增加消去行数的权重

这样分数就增加到了20000分,但是这仍然不够。

接着我对代码进行了修改,增加了存档的功能,每次消去一行都会存档,并且可以调出较早的存档。然后Game Over时自动往前退到倒数第10个存档,在那个存档任意操作一步(有时需要再往前退),然后启动AI,这个时候可能能取得更高的分数。把10000块都用完有280000分。

注意每次Game Over的时候都要人工操作,次数较多很麻烦,因此可以在最大高度大于15时搜索第三层(搜索3层最多有64000种放法,比搜索2层慢得多,因此高度小的时候没有必要),此时分数大约有300000分,但是Game Over需要手动干预的情况减少了。

接着修改评分函数,计算每一种放法组合可以得到的分数,用此替代上文4个指标中“可以消去的行数”。经过对权重的一些调整,可以拿到460000分(提交的是433550分的结果)。

修改后的游戏

https://tetrisai.gitlab.io/。和原版相比,除了算法外有以下不同:

  1. AI不使用的时候没有重力,这样方便操作。
  2. 使用AI的时候没有动画效果,也即每个方块都会直接出现在其最终位置。
  3. 增加了以下快捷键:,(逗号)和.(句号)键用于前后切换存档;/(斜杠)键用于显示可以用于提交的操作序列;Z键用于保存存档。这些键只有AI不活跃的时候才有效。另外Game Over的时候会自动显示操作序列(会丢弃10000个方块后的操作)。

一个坑是由于旋转的实现不同,这些操作序列不一定有效(例如旋转时碰上其他方块),因此提交的时候如果发现在中间某一步Game Over那么需要回退到Game Over前的状态手动操作几步(主要是把不合法操作涉及的方块重新放置),然后继续。

由于手动操作的存在,最终分数为400000至500000均为正常。

做到这里,总共用时不超过12小时,其中从第二次尝试开始共用了不超过6小时。由于自己的实习此后周一到周五都只关注排行榜变化,这个分数(433550分)从第5名掉到了第38名(因为后来一些选手不再计入排名,目前是第33名)。周末(8月7日至8日)我再尝试多次修改AI,可以达到预期分数540000分(使用1513块达到82324分),但是达到这个分数需要大量手动操作,而且即使600000分也进不了前20名,因此没有继续进行了。

总结

本次参加比赛仍然有很多不足。

就目前的AI来说,这些参数大部分仍然沿用原版俄罗斯方块AI,没有特意去调优(即重新跑一遍遗传算法)。目前用AI从0跑到100000分大约需要1分钟,用这个AI对1000种可能的参数测试是不现实的。事实上,代码中用JavaScript实现的grid和piece都不是最优的实现(C++代码给出了较优的),要进一步训练AI必须用C++(或至少WebAssembly)重写整个AI。

这个AI的算法也只考虑了先左右移动再往下移动这种操作方法,因此不完全封闭的“洞”无法填补。同时,有时悬停可以消去更多的行。但是,考虑更多情况会增加搜索状态数。我曾经把代码改成Beam Search(广度优先搜索然后丢弃掉每层分数较小的点,其他的报告称为集束搜索,但是在我的印象中称为柱型搜索),但是没有明显帮助。

文中的算法是Pierre Dellacherie算法的一个变种。但是对本问题来说这类算法的问题在于没有用到方块序列的确定性。因此我参赛时就知道这种方法不是正解(也即能达到1000000分的解法)。即使分段每段单独调参,也没有用到序列的确定性。但是我但是还以为正解是强化学习机器学习算法。

第一天时有人能拿到1000000分,注意任何步骤结束时(方块消去后)第一行必须是空的,且每行不能填满,因此最多有170个格子(显然格子数量为偶数),然后放了一个格子,有174个格子。另一方面,10000块共40000个格子,即使全部消去也只会消去4000行。每次消去一行,理论可得到的最大分数为696000;每次消去四行,理论可得到的最大分数为1740000。

以上全文按CC-BY 4.0协议释出。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2023年8月API漏洞汇总
随着网络信息安全边界不断弱化,安全防护对象不断增加,攻击面愈发放大,对数据安全、信息安全提出了巨大挑战,同时也为网络信息安全市场打开了新的增量空间。API已经成为其面向内外部持续提高能力输出、数据输出、生态维系的重要载体。API经济已是产业互联网中一个重要的组成部分,通过API经济,促进各行各业的数据变更和业务升级。
小阑本阑
2023/09/04
4760
2023年8月API漏洞汇总
腾讯安全威胁情报中心推出2024年4月必修安全漏洞清单
所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/05/14
7350
腾讯安全威胁情报中心推出2024年4月必修安全漏洞清单
腾讯安全威胁情报中心推出2024年2月必修安全漏洞清单
所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/04/03
5270
腾讯安全威胁情报中心推出2024年2月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年12月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年12月份必修安全漏洞清单,所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/01/19
3460
腾讯安全威胁情报中心推出2023年12月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年11月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年11月份必修安全漏洞清单,所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2023/12/17
6060
腾讯安全威胁情报中心推出2023年11月必修安全漏洞清单
腾讯安全威胁情报中心推出2024年9月必修安全漏洞清单
所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/10/21
2121
腾讯安全威胁情报中心推出2024年9月必修安全漏洞清单
腾讯安全威胁情报中心推出2024年5月必修安全漏洞清单
所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/06/26
6180
腾讯安全威胁情报中心推出2024年5月必修安全漏洞清单
API NEWS | API进化下的威胁升级:攻击速度刷新纪录
欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业、最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察。
小阑本阑
2023/07/06
2650
API NEWS | API进化下的威胁升级:攻击速度刷新纪录
腾讯安全威胁情报中心推出2024年3月必修安全漏洞清单
所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2024/04/28
7730
腾讯安全威胁情报中心推出2024年3月必修安全漏洞清单
赶快更新!Apple 出现多个安全漏洞
The Hacker News 网站披露,苹果公司近日推出了 iOS、iPadOS、macOS 的安全更新,以解决一个 0day 漏洞(追踪为 CVE-2023-23529)。 研究表明,CVE-2023-23529 漏洞与 WebKit 开源浏览器引擎中的类型混淆错误有关,一旦攻击者成功利用,便可在目标系统上执行任意代码。 WebKit 是一个主要用于 Safari,Dashboard,Mail 和其它一些 Mac OS X 程序的开源浏览器引擎,在手机上的应用十分广泛(例如 Android、iPhon
FB客服
2023/02/24
5300
赶快更新!Apple 出现多个安全漏洞
API NEWS | Money Lover爆出潜在API漏洞
欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业、最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察。
小阑本阑
2023/06/05
3020
API NEWS | Money Lover爆出潜在API漏洞
即将被零信任取代?企业VPN屡屡曝安全漏洞
你在日常工作生活中,是否曾使用过VPN?它或许曾帮助你轻松访问了一些突破地理限制的内容。但你知道吗?在使用的过程中,你很可能早已将自己的隐私暴露于“危险”之中。
FB客服
2023/09/19
1.5K0
即将被零信任取代?企业VPN屡屡曝安全漏洞
Web安全系列——越权访问(权限控制失效)
本文将介绍越权访问的原理、风险以及典型攻击场景,并为开发者提供有效的防范措施,帮助构建安全的Web应用。
windealli
2023/10/13
2.4K0
Web安全系列——越权访问(权限控制失效)
6月API安全漏洞报告
为了让大家的API更加安全,致力于守护数字世界每一次网络调用,小阑给大家整理了6月份的一些API安全漏洞报告,希望大家查漏补缺及时修复自己API可能出现的漏洞。
小阑本阑
2023/06/30
3110
6月API安全漏洞报告
9月重点关注这些API漏洞
漏洞详情:Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理,Yarn是Hadoop集群的资源管理系统。此次事件主要因Hadoop YARN 资源管理系统配置不当,导致可以未经授权进行访问,从而被攻击者恶意利用。攻击者无需认证即可通过REST API部署任务来执行任意指令,最终完全控制服务器。
小阑本阑
2023/10/09
2920
9月重点关注这些API漏洞
常规36个WEB渗透测试漏洞描述及修复方法--很详细
  apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作
Power7089
2021/09/15
2.7K0
漏洞库(值得收藏)
SQL注入漏洞 风险等级:高危 漏洞描述: SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验,即没有进行有效地特殊字符过滤,导致网站服务器存在安全风险,这就是SQL Injection,即SQL注入漏洞。 漏洞危害: 机密数据被窃取; 核心业务数据被篡改; 网页被篡改; 数据库所在服务器被攻击从而变为傀儡主机,导致局域网(内网)被入侵。 修复建议: 在网页代码中对用户输入的数据进行严格过滤;(代码层) 部署Web应用防火墙;(设备层) 对数据库操作进行监控。(
勤奋的思远
2021/03/03
4K0
漏洞库(值得收藏)
腾讯安全威胁情报中心推出2023年9月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年9月份必修安全漏洞清单,所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2023/11/09
7170
腾讯安全威胁情报中心推出2023年9月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年7月必修安全漏洞清单
腾讯安全威胁情报中心推出2023年7月份必修安全漏洞清单,所谓必修漏洞,就是运维人员必须修复、不可拖延、影响范围较广的漏洞,被黑客利用并发生入侵事件后,会造成十分严重的后果。
安全攻防团队
2023/11/09
5210
腾讯安全威胁情报中心推出2023年7月必修安全漏洞清单
API NEWS | 三个Argo CD API漏洞
欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业、最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察。
小阑本阑
2023/05/31
4220
API NEWS | 三个Argo CD API漏洞
推荐阅读
相关推荐
2023年8月API漏洞汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档