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