俄罗斯方块进阶--AI俄罗斯方块

news/2024/10/19 0:20:00/

前文回顾:

致青春--Python实现俄罗斯方块

人工智能大火的今天,如果还是自己玩俄罗斯方块未免显得太LOW,为什么不对游戏升级,让机器自己去玩俄罗斯方块呢?有了这个想法之后利用周六周日两天的时间去搜集了大量的资料,在电脑死机好多次之后终于将AI俄罗斯方块实现了。

 

程序介绍

所谓让机器自己去玩俄罗斯方块,就是让机器计算当前方块的所有形态可放置的所有位置,然后根据统一的评价标准,计算出最优的位置进行放置。这个评价的标准简单的来说就是:板块放置的位置越靠下越好,方块之间越紧密越好,自身对消除行的方块贡献数量越多越好,但是这里还要注意的是不可为了追求消除行数,而去造成过多的空洞,这样也是不合理的。

关于AI算法主要有两种:一种是经典的Pierre Dellacherie算法,一种基于基于深度搜索的算法。深度搜索需要优化的地方很多,假如计算的层数不够、没有高效的剪枝,一不小心容易写成人工智障,时间复杂度也不好。Pierre Dellacherie算法更加清晰,复杂度更低。但是该算法只考虑当前,不对未来的情况进行计算,注重的是“不死性”,追求方块的“密集”,有时就算可以一次性消除 3 行,却会使全局方块更加“疏”,即过多的空洞。

代码由三部分组成Tetris.py,AI.pyUtils.py游戏的主要逻辑由Tetis控制,Utils定义了方块的样式,AI顾名思义实现了主要的AI算法。

具体介绍

Pierre Dellacherie算法

 

只考虑当前方块,不对未来的情况进行计算,注重的是“不死性”,算法每次生成一个方块,便穷举该方块所有旋转的所有落点。一种方块最多有 4 种旋转,并且由于游戏界面是10*20的,所以对于每个旋转形状,只需要考虑10种落点。算法的核心是一个评估函数,对穷举出的每一种下落情况,计算 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

 

 

评估函数如下 (首字母简写):

 

关于方块形态

 

相对于上次文章中的俄罗斯方块,这里对AI俄罗斯方块的形态做一下特别说明,各个方块都是根据中心点的坐标来生成的,以(0,0)为中心点,在x、y轴加减1则是其他方格的坐标,这个好处就是只要确定中心点坐标,其他的方格位置就能随即生成。看图就懂↓ 

 

 1# 每种块包含的四个小方块相对坐标分布2        self.shapes_relative_coords = [3                                         [[0, 0], [0, 0], [0, 0], [0, 0]],4                                         [[0, -1], [0, 0], [0, 1], [0, 2]],5                                         [[0, -1], [0, 0], [0, 1], [1, 1]],6                                         [[0, -1], [0, 0], [0, 1], [-1, 1]],7                                         [[0, -1], [0, 0], [0, 1], [1, 0]],8                                         [[0, 0], [0, -1], [1, 0], [1, -1]],9                                         [[0, 0], [0, -1], [-1, 0], [1, -1]],
10                                         [[0, 0], [0, -1], [1, 0], [-1, -1]]
11                                      ]

 

 

基于深度搜索

 

暂时不对此方法作介绍。

代码并没有贴出来,关注公众号【Ahab杂货铺】后台回复【人工智障】获取

 

【推荐阅读】

除了画佩奇我们还要玩点更高级的

【LeetCode】贪心算法--划分字母区间(763)

机器学习实战--住房月租金预测(3)

 


http://www.ppmy.cn/news/394755.html

相关文章

俄罗斯方块代码

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include "pch.h" #include <iostream> #include <easyx.h> #include <conio.h> #include <time.h>/ // 定义常量、枚举量、结构体、全局变…

【牛掰】日本人制作汉字俄罗斯方块游戏,看哭一票中国人

俄罗斯方块对于各位玩家来说一定是童年难忘的记忆&#xff0c;一位日本大学生ARAMA在社交媒体发布了一段演示视频“汉字版俄罗斯方块”&#xff0c;在这个视频中&#xff0c;经典俄罗斯方块中的图形全部都替换成了汉字&#xff0c;游戏难度更加变态......公众号后台回复&#x…

Mac终端好玩的事情俄罗斯方块

很有儿时上学时候玩的味道&#xff1a;

俄罗斯方块(Tetris)

《俄罗斯方块》&#xff08;Tetris&#xff0c; 俄文&#xff1a;Тетрис&#xff09;是一款由俄罗斯人阿列克谢帕基特诺夫于1984年6月发明的休闲游戏。 我将其作为我课程设计的题目&#xff0c;重温程序设计的基础。由于课设时间有限&#xff0c;本想用OpenGL弄个3D效果的…

学生用计算机怎么玩俄罗斯方块,回忆小霸王童年 如何在电脑上玩俄罗斯方块环游记...

《俄罗斯方块环游记》11月3日最后一次开启远航测试&#xff0c;这是中国首款正版俄罗斯方块手游。很多小伙伴小时候应该都玩过俄罗斯方块&#xff0c;那么要如何在电脑上体验俄罗斯方块环游记呢&#xff1f;接下来小编就给大家带来俄罗斯方块环游记电脑版模拟器下载的教程&…

51 nod 1851 俄罗斯方块

1851 俄罗斯方块 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 160 难度&#xff1a;6级算法题 玩过俄罗斯方块&#xff1f;那你知道俄罗斯方块共有七种吧&#xff08;其实只有五种&#xff09; 给一个黑白图&#xff0c;每次能将某些区域的格子黑白反转…

基于51单片机的俄罗斯方块游戏

俄罗斯方块游戏算法 请参考俄罗斯方块游戏的算法 1.概述 俄罗斯方块是一款风靡全球的益智游戏。它规则简单&#xff0c;容易上手&#xff0c;且游戏过程变化无穷&#xff0c;使用户在游戏中得到乐趣。  本设计是采用单片机来实现的智能俄罗斯方块游戏&#xff0c;该设计选用的…

俄罗斯方块。

目录 零. 直接上代码代码运行截图 一. 基本的游戏知识1.1 下面是这7种基本方块&#xff1a;1.2.游戏规则&#xff1a; 二. 思路2.1游戏大体思路2.2 main()函数主要结构 三. 编译环境&#xff1a;四. 关于一些函数的解释4.1关于控制台、游戏界面、颜色、光标设置、菜单函数4.1.1…