我很想知道,这是最常用的算法,用于寻找符合细胞网格的益智游戏中的模式。
我知道这取决于很多因素,例如你想要检测的模式类型,或游戏规则......但我想知道哪种算法在这类问题中最常用...
例如,像柱子,珠宝,甚至俄罗斯方块等游戏。
我还想知道,通过“强力”检测模式(比如,扫描所有网格试图找到相同颜色的三个相邻单元格)是非常差的,在非常小的网格中使用特定算法,如4 X 4例如(我知道这取决于游戏类型和规则......)
在这种游戏中常用哪种结构?
答案 0 :(得分:5)
它总是依赖于域。但是还有两种情况你会进行这类搜索。一个移动(玩家改变游戏区域)的情况是另一个情况,另一个是整个董事会发生变化的时候。
在俄罗斯方块中,你不需要在掉落一块后扫描整块板。你只需要搜索该片所触及的行。
在像Bejeweled这样的第三场比赛中,你一次交换两个相邻的棋子,你首先在每个方格周围的每个方向上进行一次本地化搜索,以查看是否有任何棋子被触发。然后,如果他们有,游戏将把一些新的,随机的碎片扔到板上。现在,您可以在每个已更改的方块周围运行相同的本地化搜索,但这可能涉及大量if
语句,实际上从左上角到右下角扫描整个板可能会更慢。这取决于您的实现,并需要进行性能分析。
正如阿德里安所说,一个简单的二维阵列就足够了。但是,通常,您可以在此数组周围添加像素的“边框”,以简化模式搜索方面。没有边框,你必须在边缘方块上有if
个语句,这些语句表示“好吧,如果你在顶行,不要向上搜索(并离开数组)”。通过它周围的边框,您可以安全地搜索所有内容:保存自己的if
语句,节省自己的分支,节省管道问题,更快地搜索。
致Jon:如果您正在制作搜索算法来玩/解决游戏,那么这些事情在高性能设置中确实很重要,即使在现代机器上也是如此。如果您愿意,您希望您的基础模拟尽可能快地运行,以便在最少的周期内尽可能深地进行搜索。
答案 1 :(得分:2)
关于算法:它当然取决于游戏。例如,对于俄罗斯方块,如果它具有相同的颜色,则只需扫描每一行。在这种情况下,我甚至无法想到一些不等于蛮力方法的东西。但对于大多数休闲游戏来说,暴力应该是完美的。与图形和声音处理相比,模式识别应该可以忽略不计。
关于结构:简单的2D阵列应该足以代表电路板。
答案 2 :(得分:0)
鉴于这些天的平均电脑速度,如果它是用户正在玩游戏的实时,它可能无关紧要(编辑:仅适用于非常小的游戏板)。当然,这取决于游戏逻辑的复杂性,还取决于代码在目标机器上运行的速度(即,这是一个JavaScript网页游戏,还是用C ++编写的Windows应用程序)。
如果这是为了模拟游戏策略,那么使用更有效的算法。
更有效的策略可能涉及跟踪游戏板的增量变化,而不是每次都重新扫描整个板。