我目前正在开发一个游戏,我需要为我的AI创建一个换位表。我实现了Hashtable
,以便对 Hashtable 的key
是一个正在考虑的状态,其相应的value
是最佳的下一步行动。
但是,当我将哈希表保存在 Android 的内部存储中并下次恢复时,它似乎有一些保存的数据,但keys
(即游戏状态(与我在上一个实例中保存的keys
不同。
以下是我保存和恢复数据的方法:
private void readTranspositionTableFromFile() {
FileInputStream fis = openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
transpositionTable = (Hashtable<BoardState, NextMove>) ois.readObject();
ois.close();
deleteFile(FILENAME);
}
private void writeTranspositionTableToFile() {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(transpositionTable);
oos.close();
}
我认为我的hashCode()
实现没有问题,因为它一遍又一遍地为相同的状态返回相同的值。
怀疑保存/恢复转置表会弄乱我的数据,因为我记录了 2 个运行时,在第一个运行时,我hashCode()
返回 3964 和 3029 用于要添加到表中的 2 个状态。但是,在从文件中读取表时,hashCode()
返回了两次 9119。
保存/恢复数据有任何问题吗?
我的序列化和哈希完全没问题。我的程序是这样的:
- 向
transpositionTable
添加新的键值对 - 玩下一步
- 将
transpositionTable
保存到内部存储
但是,经过细致的记录,我发现我的transpositionTable
在步骤 2( 之后发生了变化(。这是因为在步骤 1( 中,我使用了
BoardState newKey = currentData.getBoardState();
并将其保存到我的transpositionTable
.然后在步骤 2( 中,当我的currentData
发生变化时,我的transpositionTable
也相应更改。我试过使用
BoardState newKey = currentData.getBoardState().clone();
但这也没有用。最后,我必须手动将每个currentData.getBoardState()
字段分配给newKey
,这很有效。