2017-04-25 48 views
0

ERROR:如何为生命游戏生成随机起始位置?

SyntaxError: pathToFiles/Board.jsx: Unexpected token, expected , (32:20) while parsing file: pathToFiles/Board.jsx 

CODE:

Board.jsx

generateRandomBoard() { 
     for (var i = 0; i < this.state.cells.length ; i++) { 
      var currentAlive; 
      if(Math.random() < 0.5) { 
       currentAlive = false; 
      } 
      else { 
       currentAlive = true; 
      } 
      this.setState({ 
       cells[i].alive : currentAlive 
      }) 
     } 
    }, 

问题:

如何为ife游戏生成随机起始位置?

我想上面的代码,但没有奏效。

Lorem存有Lorem存有Lorem存有Lorem存有Lorem存有Lorem存有Lorem存有Lorem存有


全码:

游戏

var Game = createReactClass({ 

    getInitialState() { 
     return { 
      start: false 
     }      
    }, 

    handleStartClick() { 
     this.setState({ 
      start: true 
     }) 
    }, 

    handleStopClick() { 
     this.setState({ 
      start: false 
     }) 
    }, 

    render() { 
     return (
      <div> 
       <h1>React.js Game of Life</h1> 
       <div className="buttons"> 
        <button className="btn btn-danger" onClick={this.handleStopClick}>Stop</button> 
        <button className="btn btn-success" onClick={this.handleStartClick}>Start</button> 
       </div> 
       <Board start={this.state.start}/> 
      </div> 
     ) 
    } 

}); 

var Board = createReactClass({ 

getInitialState() { 
    var array = []; 
    for (var i = 0; i < 400; i++) { 
     array.push(<Cell key={i} id={i} cells={array} />); 
    } 

    return { 
     cells: array , 
     started: false, 
     generations: 0 
    };    

    this.generateRandomBoard(); 
}, 

generateRandomBoard() { 
    for (var i = 0; i < this.state.cells.length ; i++) { 
     var currentAlive; 
     if(Math.random() < 0.5) { 
      currentAlive = false; 
     } 
     else { 
      currentAlive = true; 
     } 

     cells[i].setState({ 
     alive: currentAlive 
     }) 
    } 
}, 

componentWillReceiveProps(nextProps) { 

    var evolution; 

    if(nextProps.start && this.state.started == false) { 

     let evolution = setInterval(() => { 
     this.state.cells.forEach(cell => cell.life()); 
     this.state.cells.forEach(cell => cell.nextLife()); 
     this.setState({ 
      generations: this.state.generations + 1 
     }); 
     }, 500); 

     this.setState({ 
     started: true, 
     evolution 
     }); 
    } 

    else { 
     clearInterval(this.state.evolution); 
     this.setState({ 
     started: false 
     }) 
     if (nextProps.delete) { 
      this.state.cells.forEach(cell => cell.setState({alive: false})); 
      this.state.cells.forEach(cell => cell.setState({nextAlive: false})); 
      nextProps.stopClear(); 
      this.setState({ 
      generations: 0 
      }); 
     } 
    } 

}, 

render() { 

    var that = this; 

    return (
     <div> 
      <div className="board"> 
       { 
        this.state.cells.map(function(item, i) { 
         return <Cell key={i} id={i} cells={that.state.cells} start={that.props.start}/> 
        }) 
       } 
      </div> 
      <div className="generations">Generations: {this.state.generations}</div> 
     </div> 
    ); 
} 

});

细胞

var Cell = createReactClass ({ 

getInitialState() { 
    return { 
     alive: false, 
     nextAlive: false, 
    }      
}, 

isAlive(r, c){ 

    var size = Math.sqrt(this.props.cells.length) 

    if (r == -1) { 
     r = size - 1 
    } 
    if (r == size) { 
     r = 0 
    } 
    if (c == -1) { 
     c = size - 1 
    } 
    if (c == size) { 
     c = 0 
    } 
    var id = r * size + c 
    return this.props.cells[id].state.alive 

}, 

life() { 

    var neighbours = 0 
    var size = Math.sqrt(this.props.cells.length) 
    var row = Math.floor(this.props.id/size) 
    var col = this.props.id - row * size 

    if (this.isAlive(row - 1, col)) { 
     neighbours++ 
    } 
    if (this.isAlive(row - 1, col + 1)) { 
     neighbours++ 
    } 
    if (this.isAlive(row - 1, col - 1)) { 
     neighbours++ 
    } 
    if (this.isAlive(row, col + 1)) { 
     neighbours++ 
    } 
    if (this.isAlive(row, col - 1)) { 
     neighbours++ 
    } 
    if (this.isAlive(row + 1, col)) { 
     neighbours ++ 
    } 
    if (this.isAlive(row + 1, col + 1)) { 
     neighbours ++ 
    } 
    if (this.isAlive(row + 1, col - 1)) { 
     neighbours ++ 
    } 

    this.state.nextState = false 

    if (this.state.alive){ 
     if(neighbours < 2) { 
      this.setState ({ 
      nextAlive: false 
      }) 
     } 
     if (neighbours > 3) { 
      this.setState ({ 
      nextAlive: false 
      })  
     } 
     if (neighbours == 3 || neighbours == 2) { 
      this.setState ({ 
      nextAlive: true 
      }) 
     } 
    } 
    else{ 
     if (neighbours == 3) { 
      this.setState ({ 
      nextAlive: true 
      }) 
     } 
    } 
}, 

nextLife() { 
    this.setState({ 
     alive: this.state.nextAlive 
    })  
}, 

componentDidMount() { 
    this.props.cells[this.props.id] = this; 
}, 

toggleLife() { 
    this.setState({ 
     alive: !this.state.alive 
    }) 
}, 

render() { 
    return (
     <div className={this.state.alive ? "cell alive" : "cell"} onClick={this.toggleLife}></div> 
    ); 
} 

});

+0

为什么你不也使用'this.state.cells [i] .alive:currentAlive'吗? “细胞”可能在这个范围内。无论如何,我一眼就看不到板子代码有什么问题,错误输出是什么,或者在你的代码之后板子是什么样的? – Matthias

+0

@Matthias语法错误,并且代码无法编译 – Coder1000

+0

请问您可以在您的问题 – Matthias

回答

1

它看起来像你的函数有一个语法错误Board组件的generateRandomBoard()

generateRandomBoard() { 
    for (var i = 0; i < this.state.cells.length ; i++) { 
    var currentAlive; 
    if(Math.random() < 0.5) { 
     currentAlive = false; 
    } 
    else { 
     currentAlive = true; 
    } 

    // Buggy code from here ... 
    // this.setState({ 
    //  cells[i].alive : currentAlive 
    // }) 
    // ... to here 

    // correct code from here ... 
    cells[i].setState({ 
     alive: currentAlive 
    }) 
    // ... to here 
    } 
} 

贝娄是主板完全正确的代码:

var Board = React.createClass({ 

    getInitialState() { 
     var array = []; 
     for (var i = 0; i < 400; i++) { 
      array.push(<Cell key={i} id={i} cells={array} start={this.props.start} />); 
     } 

     return { 
      cells: array 
     }; 
    }, 

    generateRandomBoard() { 
     for (var i = 0; i < this.state.cells.length ; i++) { 
      var currentAlive; 
      if(Math.random() < 0.5) { 
       currentAlive = false; 
      } 
      else { 
       currentAlive = true; 
      } 

      cells[i].setState({ 
      alive: currentAlive 
      }) 
     } 
    }, 

    render() { 

     var that = this; 

     return (
      <div className="board"> 
       { 
        this.state.cells.map(function(item, i) { 
         return <Cell key={i} id={i} cells={that.state.cells} start={that.props.start}/> 
        }) 
       } 
      </div> 
     ); 
    } 

}); 

你报告的错误是不是很清楚:

SyntaxError: pathToFiles/Board.jsx: Unexpected token, expected , (32:20) while parsing file: pathToFiles/Board.jsx 

还有(32:20)可能意味着行32列20

也许你目前的环境并不理想。我个人使用的WebPack(服务器端编译)与源地图(这样告诉我,我的错误的位置):这是几个小时来配置的第一次,但它是非常方便的,一旦它的工作原理...

+0

谢谢你的回答。错误消失了,但是当我加载页面时,板子不会产生随机位置,嗯,也许它与我放置this.generateRandomBoard有关? – Coder1000

+0

首先,您发布的代码是破损的代码,在单元格中使用setInterval而不是Board。 –

+0

我使用的是正确的代码。但是我把错误的代码放在问题中。纠正。 – Coder1000