1

我目前正在开发一款游戏,我需要为我的 AI 创建一个转置表。我实现HashtablekeyHashtable 是一个正在考虑的状态,它对应value的是最优的下一步。

但是,当我将 Hashtable 保存在 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()为要添加到表中的 2 个状态返回 3964 和 3029。但是,在从文件中读取表时,hashCode()返回 9119 两次。

保存/恢复数据有什么问题吗?

4

1 回答 1

0

我的序列化和散列完全没问题。我的程序是这样的:

  1. 添加新的键值对到transpositionTable
  2. 下一个动作
  3. 保存transpositionTable到内部存储

但是,经过细致的记录后,我发现我transpositionTable在第 2 步之后发生了变化)。这是因为在步骤 1) 中,我使用了

BoardState newKey = currentData.getBoardState();

并将其保存到我的transpositionTable. 然后在步骤 2)中,当我currentData改变时,我transpositionTable相应地改变。我尝试使用

BoardState newKey = currentData.getBoardState().clone();

但这也没有用。最后我不得不手动分配每个字段,这很有效currentData.getBoardState()newKey

于 2012-08-01T12:16:54.327 回答