最近,我的朋友挑战我用Java编写一个玩2048游戏的人工智能。我成功编写了它,并且它在几分钟内运行良好,但随后卡住了。经过一些调试,我意识到它没有正确读取棋盘,并且它将32误认为是1024。为了解释为什么会这样,我必须首先解释它是如何获取屏幕上瓷砖的值的。
它首先让用户在游戏棋盘周围画一个方框。这是为了告诉程序游戏在屏幕上的位置。然后,它生成16个点,每个点位于一个单独的瓷砖上。使用Robot类,它将这16个点的颜色存储在一个数组中。
然后,它检查是否发现了新的颜色。如果发现了新的颜色,它会将下一个2的幂分配给该颜色。例如,第一个颜色(背景)被分配为0,接下来是白色被分配为2,然后是4,以此类推。问题是当瓷砖移动时,它们是动画化的,也就是说,它们不会直接传送到正确的位置,而是移动到正确的位置。这导致了错误的颜色在一瞬间通过16个点之一,程序错误地读取了那个瓷砖。
这让我提出了我的问题:有没有办法在不重新创建Java游戏的情况下读取2048游戏中的瓷砖值?
编辑:
更具体地说,我的疑问是如何在Java中获取2048游戏的实际棋盘数据?
我所询问的是如何在外部Java程序中获取瓷砖的值。
例如,假设有这样的棋盘:
从这个棋盘中,我希望获取数字的值并将它们存储在一个数组中,数组看起来像这样:{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
。
所有颜色和字体信息均来自游戏的电子表格。