0

我知道stackoverflow中有一个非常相似的问题,但我无法弄清楚我的代码中的错误是什么。总而言之,我对 React 和 Javascript 很陌生(我对 redux 也一无所知),我正在Boardgame.io做一个项目。这个平台有自己的模板来定义游戏的状态和规则(回合/阶段等)。模板是这样的:

export const Catan = {
setup: (ctx) => createInitialState(),

turn: {
    moveLimit: 5, //realmente no tiene limite
  },

moves: {
    diceRoll: (G) => {
        let roll = diceRoll();
        G.diceValue = roll;
    },
    buildRoad, },

我正在做一个定义一个玩家可以做的可能动作之一的函数(buildRoad):

  function buildRoad (G, ctx, id){

let playerID = 'player_' + ctx.currentPlayer;
let cPlayer = G[playerID];

if(cPlayer.resources.lumber < 1 || cPlayer.resources.brick <1){
  alert("Not enough rss");
  return INVALID_MOVE;
}

if(G.roadCells[id].value !== -1){
  alert("Already owned road");
  return INVALID_MOVE;
}

if(checkRoadBuild(G, cPlayer, id) === false){
  alert("Cant build without conection");
  return INVALID_MOVE;
}

// 1 lumber adn 1 brick
G.roadCells[id] = ctx.currentPlayer;
cPlayer.resources.brick--;
cPlayer.resources.lumber--;

return 1;

}

此函数使用定义状态 G 的对象和其他具有相似信息的对象 ctx。我在这里用 cPlayer 做的是调用我在 G 中定义的对象之一:

        player_0: {
      name : 'player_0',
      color : 'red',
      points : 0,
      longestRoad : false,
      largestArmy : false,
      devCards : [],
      resources : {
          brick: 3,
          lumber: 2,
          ore: 0,
          grain: 0,
          wool: 0
      },
      ownedTiles : new Array(19 + 1).join('0').split('').map(parseFloat),
      settlements : [],
      cities : [],
    },

在最后一个 if 中,我调用了另一个检查函数,并且(我猜)错误来自哪里,或者至少我认为:

  function checkRoadBuild(G, cPlayer, id){

//search in settlements and cities
for(let i=0; i<cPlayer.settlements.length; i++){
  if(cPlayer.settlements[i] === G.roadCells[id].to || cPlayer.settlements[i] === G.roadCells[id].from)
    return true;
}
for(let i=0; i<cPlayer.cities.length; i++){
  if(cPlayer.cities[i] === G.roadCells[id].to || cPlayer.cities[i] === G.roadCells[id].from)
    return true;
}
//look for connected roads - TODO

return true;

}

这个函数还没有完成,这就是为什么它总是返回 true,但是当我尝试移动buildRoad时问题就来了。控制台显示此错误:

index.js:1 ERROR: Error: [Immer] An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.
at t (errors.ts:49)
at P (finalize.ts:27)
at e.i.produce (immerClass.ts:111)
at turn-order-ec34409c.js:169
at turn-order-ec34409c.js:547
at Object.processMove (reducer-fcd5a508.js:738)
at reducer-fcd5a508.js:903
at dispatch (redux.js:213)
at client-1ffa26ed.js:256
at client-1ffa26ed.js:300
at Object.dispatch (client-1ffa26ed.js:310)
at InteractiveFunction.dispatchers.<computed> (client-1ffa26ed.js:200)
at InteractiveFunction.Submit (Debug-753f485a.js:3852)
at Debug-753f485a.js:289
at Array.forEach (<anonymous>)
at Debug-753f485a.js:288
at Submit (Debug-753f485a.js:3646)
at HTMLSpanElement.OnKeyDown (Debug-753f485a.js:3657)

我一直在寻找可能是我在代码中的错误,但我没有看到任何奇怪的东西。我一直在阅读有关此错误的信息,但我对immerreducer了解不多(我认为错误来自于此)。我会感谢任何帮助。如果需要,我可以发送更多信息。

4

1 回答 1

1

我已经想通了,这是不应该存在的回报。

于 2021-05-09T21:21:02.730 回答