如何在Java中获取2048游戏中瓷砖的值

最近,我的朋友挑战我用Java编写一个玩2048游戏的人工智能。我成功编写了它,并且它在几分钟内运行良好,但随后卡住了。经过一些调试,我意识到它没有正确读取棋盘,并且它将32误认为是1024。为了解释为什么会这样,我必须首先解释它是如何获取屏幕上瓷砖的值的。

它首先让用户在游戏棋盘周围画一个方框。这是为了告诉程序游戏在屏幕上的位置。然后,它生成16个点,每个点位于一个单独的瓷砖上。使用Robot类,它将这16个点的颜色存储在一个数组中。

这是它的图片(小方块代表这些点):enter image description here

然后,它检查是否发现了新的颜色。如果发现了新的颜色,它会将下一个2的幂分配给该颜色。例如,第一个颜色(背景)被分配为0,接下来是白色被分配为2,然后是4,以此类推。问题是当瓷砖移动时,它们是动画化的,也就是说,它们不会直接传送到正确的位置,而是移动到正确的位置。这导致了错误的颜色在一瞬间通过16个点之一,程序错误地读取了那个瓷砖。

这让我提出了我的问题:有没有办法在不重新创建Java游戏的情况下读取2048游戏中的瓷砖值?

编辑:

更具体地说,我的疑问是如何在Java中获取2048游戏的实际棋盘数据?

我所询问的是如何在外部Java程序中获取瓷砖的值。

例如,假设有这样的棋盘:

enter image description here

从这个棋盘中,我希望获取数字的值并将它们存储在一个数组中,数组看起来像这样:{0,0,2,4,0,0,32,2,2,2,16,8,4,32,64,128}

提前感谢 🙂


回答:

一种方法是弄清楚每个瓷砖代表什么颜色。这假设你使用的是原始版本。

  • 无瓷砖:#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后,它们共享相同的颜色。

所以,如果你打算超过2048,你可能需要使用光学字符识别库。这会更慢,但可以支持潜在的任何最大值,只要它可以被解析。这里有不少相关的帖子

字体似乎是Clear Sans

所有颜色和字体信息均来自游戏的电子表格。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注