如何在Java中获取2048中瓷砖的值[关闭]

Posted

技术标签:

【中文标题】如何在Java中获取2048中瓷砖的值[关闭]【英文标题】:How to get the values of tiles in 2048 in Java [closed] 【发布时间】:2016-06-13 12:37:40 【问题描述】:

最近,我的朋友向我提出挑战,让我制作一个用 Java 玩著名的 2048 游戏的 AI。我做到了,它工作了几分钟,然后卡住了。经过一点调试,我意识到它没有正确读取板,它认为 32 是 1024。为了解释它为什么这样做,我必须先解释它是如何获取屏幕上瓷砖的值的。

它首先让用户在游戏板周围画一个正方形。这样做是为了告诉程序游戏在屏幕上的哪个位置。然后它会生成 16 个点,每个点位于一个单独的图块中。使用 Robot 类,它将这 16 个点的颜色存储在一个数组中。

这是一张图片(小方块代表点):

然后它检查是否找到了新颜色。如果它找到了一种新颜色,那么它将下一个 2 的幂分配给该颜色。例如,第一种颜色(背景)分配给 0。下一种颜色(白色)分配给 2,然后下一种颜色分配给 4,依此类推。问题是,当瓷砖移动时,它们是动画的,也就是说,它们不仅会传送到正确的位置,还会移动到正确的位置。这会导致错误的颜色通过 16 个点之一,并且程序错误地读取了该图块。

这让我想到了我的问题:有什么方法可以读取游戏 2048 中的图块值,而无需用 Java 重新创建游戏?

编辑:

更具体地说,我的问题是如何在 java 中获取 2048 年的实际游戏板数据?

我要问的是一种在外部 java 程序中获取图块值的方法。

以这个板子为例:

我想从这个板上获取数字的值并将它们存储在一个看起来像这样的数组中:0,0,2,4,0,0,32,2,2,2, 16,8,4,32,64,128

提前致谢:)

【问题讨论】:

您的问题应该是:“有什么方法可以读取磁贴并确保我没有错误地读取错误的临时颜色?” 非常有趣的问题。可惜太宽泛了。 @Dropout 你能告诉我如何让问题不那么广泛吗? @Kayaman 这就是我解决问题的方法。我还问是否有另一种/更好的方法来解决它。 重复采样并稍作延迟,直到 3(?) 个采样在每个单元格中返回相同的值?我不知道,到达。 【参考方案1】:

可以做到这一点的一种方法是确定每个图块代表哪种颜色。这假设您使用的是原始版本。

无磁贴:#cdc1b4 2:#eee4da 4:#ede0c8 8:#f2b179 16:#f59563 32:#f67c5f 64:#f65e3b 128:#edcf72 256:#edcc61 512:#edc850 1024:#edc53f 2048+:#edc22e

正如您可能看到的,这最多只能工作到 2048 年。之后,它们共享相同的颜色。

因此,如果您打算超过 2048,您可能需要使用光学字符识别库。这会更慢,但可能允许任何最大值,只要它可以被解析。 There are quite a few posted here.

字体似乎是Clear Sans

所有颜色和字体均取自 the game 的电子表格。

【讨论】:

这与我迄今为止所做的类似,问题是瓷砖正在移动,这导致程序认为瓷砖位于不应该出现的位置。跨度> 如果您在每次移动后重新计算每个图块的位置,那应该不是问题。除非您可以访问实际的棋盘数据,否则无论如何您都需要计算新值。 @obicerce 问题是它移动得太快,在评估下一步移动时,瓷砖已经部分移动,导致程序将瓷砖放置在错误的位置。这只会影响棋盘的每一步,因为每一步都会重新计算棋盘,但它可能会导致程序执行导致失败的移动。 那么可能是多个样本或延迟?当然,它可能会减慢每一步的速度。如果它成为一个大问题,那么游戏实现起来相当简单,even being the subject to code golf! @obicerce 刚刚尝试并延迟了 1 秒,它在再次搞砸之前达到了 512。再长一点,玩的时间就太长了。另外,如果我使用了多个样本,那么我将如何选择正确的样本来使用?

以上是关于如何在Java中获取2048中瓷砖的值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Imagemagick 裁剪成瓷砖并强制所有尺寸相同?

2048视频游戏的EV功能[关闭]

如何将scrollPane设置为所需的值?

如何在字符串中获取字符串数组的值? [关闭]

如何通过 swiftUI 制作 2048 游戏 [关闭]

如何让php获取session的值