2012-07-31 2 views
1

현재 AI 용 전위 테이블을 만들어야하는 게임을하고 있습니다. 나는 Hashtable을 구현하여 Hashtable에 대한 key이 고려중인 상태이고 그에 해당하는 value이 최적의 다음 이동이되도록했습니다.안드로이드에서 데이터를 내부적으로 저장하면 데이터가 엉망입니다.

그러나 안드로이드의 내부 저장소에 Hashtable을 저장하고 다음 번에 복원 할 때 저장된 데이터가있는 것 같지만 게임 상태 인 keys은 이전 인스턴스에서 저장 한 keys과 다릅니다. 그것은 반복 같은 상태에 대해 같은 값을 반환 유지하기 때문에 나는 내 hashCode() 구현에 아무런 문제가 볼

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(); 
    } 

: 여기

내가 저장하고 내 데이터를 복원하는 방법입니다.

2 개의 런타임을 기록하고 첫 번째에 hashCode()이 3964 및 3029를 반환하여 테이블에 추가 된 2 개 상태에 대해 전환 표가 내 데이터를 엉망으로 만드는 것으로 의심됩니다. 그러나 파일에서 테이블을 읽는 동안 hashCode()은 9119를 두 번 반환했습니다.

데이터 저장/복원에 문제가 있습니까?

+0

아마도 BoardState가 올바르게 직렬화되지 않았습니까? 귀하가 파일을 작성하고 읽은 후에 회원들의 정확성을 확인 했습니까? – ekholm

+0

Hashtable을 직접 구현하셨습니까? 왜 HashMap을 사용하지 않습니까? 필자는 직렬화 문제가 없었습니다. 직렬화 프로세스의 일부 코드를 추가하십시오. – Martze

+0

@ekholm 방금 BoardState에'Serializable '을 추가했습니다. 그 외에도 내 보드 상태는 단지 몇 개의 인스턴스 변수, getter, setters, hashCode() 및 equals()로 구성됩니다. @Martze 아니요, Java 라이브러리 ([http] Hashtable (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Hashtable.html))에서 [Hashtable]). 나는 HashMap을 시도하지 않았다. – sk1ll3r

답변

0

내 직렬화와 해시는 완전히 괜찮습니다. 내 프로그램이이 같은 갔다 :

그러나 내부 저장 transpositionTable 저장 transpositionTable

  • 플레이의 다음 움직임
    1. 새로운 키 - 값 쌍을 추가를, 세심한 로깅 후에, 나는 것을 발견 내 transpositionTable가 2 단계 이후에 변경됨). 1 단계) 동안, 나는

      BoardState newKey = currentData.getBoardState();

      을 사용하고 내 transpositionTable에 저장하기 때문이었다. 그런 다음 2)에서 currentData이 변경되면 그에 따라 transpositionTable이 변경되었습니다. 나는

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

      를 사용하여 시도하지만 그 중 하나가 작동하지 않았다. 마지막으로 currentData.getBoardState()의 각 필드를 수동으로 newKey에 할당해야했습니다.

  • 관련 문제