我正在建造一个河内游戏塔以习惯于做出反应。我有一个名为“ disks”的状态属性,该属性是一个由3个长度为N的数组组成的数组(N为磁盘总数)。我还定义了一个状态属性“ history”,该属性应包含如下所示的磁盘阵列的历史记录:
但是,在M移动之后,历史记录数组如下所示:
history = [磁盘(M个移动后),磁盘(M个移动后),...,磁盘(M个移动后)]。
我找不到我的错误。如果有人知道出了什么问题,将不胜感激。以下是相关代码:
@Override
protected void onPostExecute(Void result)
{
progressBarSubject.setVisibility(View.GONE);
//CumplesListView.setVisibility(View.VISIBLE);
if(temasHomeList != null)
{
ListAdapterClassTemasHome adapter = new ListAdapterClassTemasHome(temasHomeList, context);
TemasListView.setAdapter(adapter);
TemasListView.setClickable(true);
TemasListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String nombre_tema = temasHomeList.get(position).nombre_tema ;
String materia = temasHomeList.get(position).materia ;
String id_tema = temasHomeList.get(position).id_tema ;
String tema_seleccionado = temasHomeList.get(position).seleccionado ;
mPref = getActivity().getSharedPreferences(MIEXAMEN, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mPref.edit();
String num_examen = randomString(8);
editor.putString("id_tema",id_tema);
editor.apply();
// SendData();
// InicioFragment firstFragment = new InicioFragment();
// ((MainActivity)getActivity()).getSupportFragmentManager().beginTransaction()
// .replace(R.id.frame, firstFragment).commit();
}
});
}
}
请注意,游戏还可以正常工作,这意味着磁盘阵列正在正确更新等。这仅仅是历史记录阵列的更新以某种方式出了问题。我尝试将disks.slice()放入history.concat,因为在我看来,历史记录以某种方式存储了对disks阵列的引用,但这无济于事。
答案 0 :(得分:0)
问题来自于此:
Go to your project folder and run:
rm -rf node_modules
yarn install or npm install
这会适当改变索引disks[i].push(disks[selected].pop());
处的disk
并变异所选的i
。
因为您将这些引用存储在disk
中,并继续添加引用
这些history
物体中,您观察到的就是您的游戏稳定度。
为了更好地了解正在发生的事情,您可以尝试拆分history
方法分为几部分。
handleClick
您看到我为function getNewState (oldState, selectedIndex) {
if (oldState.selected === selectedIndex) {
return oldState;
}
if (isLegalMove(oldState, selectedIndex)) {
return {
...oldState,
selected: selectedIndex, //updated the index
disks: updateDisk(oldState.disks, selectedIndex),
move: oldState.move + 1
};
}
return {
...oldState,
selected: null
};
}
和isLegalMove
的不同部分引入了几个功能,
这些是为了分离问题,并使测试更容易。
关于使用updateDisk
的注意事项:如您所见,它仅对
一个数组,这意味着如果您有一个嵌套对象,并且只对外部对象进行浅表复制
然后在其中进行变异,原始副本也会被变异。您可能想创建一个Array.prototype.slice
。