0

좋아, 그래서 나는 p5.js에서 콘웨이의 삶의 게임을 만들려고 노력했고, 나는 어떤 이상한 버그에 갇혀있다. COL 및 행이P5.js에서 생명의 게임

if (col>-1 && col <grid.length && row>-1 && row < grid[0].length){ 
    //increase sum 
} 

하지만 더 악화처럼에게 배열 의 경계를하면 내가 확인 시도,

function make2DArray(cols, rows) { 
    let arr = new Array(cols); 
    for (let i = 0; i < arr.length; i++) { 
     arr[i] = new Array(rows); 
    } 
    return arr; 
} 

function countNeighbors(grid, x, y) { 
    let sum = 0; 
    for (let i = -1; i < 2; i++) { 
     for (let j = -1; j < 2; j++) { 
      let col = x + i; 
      let row = y + i; 
      if (grid[col][row] === undefined){ 
     sum += grid[col][row]; 
     } 
    } 
    } 
    sum-=grid[x][y] 
    return sum; 
} 

let grid; 
let next; 
let cols; 
let rows; 
let resolution = 20; 
let fr = 15; 

function setup() { 
    createCanvas(600, 400); 
    frameRate(fr); 
    cols = width/resolution; 
    rows = height/resolution; 

    next = make2DArray(cols, rows); 
    grid = make2DArray(cols, rows); 
    for (let i = 0; i < cols; i++) { 
     for (let j = 0; j < rows; j++) { 
      grid[i][j] = floor(random(2)); 
     } 
    } 
} 

function draw() { 
    background(0); 
    for (let i = 0; i < cols; i++) { 
     for (let j = 0; j < rows; j++) { 
      let x = i * resolution; 
      let y = j * resolution; 
      if (grid[i][j] == 1) { 
       fill(0); 
       stroke(150); 
       rect(x, y, resolution - 1, resolution - 1); 
      } else { 
       fill(255); 
       stroke(150); 
       rect(x, y, resolution - 1, resolution - 1); 
      } 
     } 
    } 
    for (let i = 0; i < cols; i++) { 
     for (let j = 0; j < rows; j++) { 
      let state = grid[i][j]; 
      let neighbors = countNeighbors(grid, i, j); 
      if (state == 0 && neighbors == 3) { 
       next[i][j] = 1; 
      } else if (state == 1 && (neighbors < 2 || neighbors > 3)) { 
       next[i][j] = 0; 
      } else { 
       next[i][j] = state; 
      }     
     } 
    } 
    grid = next; 
} 

은 김 기본적으로 나는 기능 countNeighbors을하고 난 버그가에 있다고 생각합니다. 난 내가 알아 낸 너무 JS에 새로운 오전 그 예를 들어

let x=new Array(10); 
//and then when i try this 
console.log(c[-1]) 
//it should give undefined 

하지만 프로그램이 여전히 실 거예요 작업 :(당신이 그것을 작동하게 할 수있는 몇 가지 변경으로 감사

+1

if (grid [col] [row] === undefined) {sum + = grid [col] [row];'값이 정의되지 않은 경우 합계에 추가한다고 말하는 것 같습니다. 그게 거꾸로되지 않니? –

+0

오, 내 잘못이 잘못 입력되었습니다 :/ – anakata

+0

하지만이 경우 (grid [col] [row]! == undefined) {sum + = grid [col] [row]; 여전히 작동하지 않습니다. – anakata

답변

0

!

1) let row = y + i;let row = y + j;으로 바꿉니다. 오타가 대부분을 줄였습니다.

2) grid[col]가 정의되지 않은 경우 다음 grid[col][row]이 이해가되지 않는, undefined[row] 점이다

if (0 <= col && col < cols && 0 <= row && row < rows){ 

하여 상태를 원래 상태의 문제를

if (grid[col][row] === undefined){ 

를 교체합니다.

for(let i = 0; i < grid.length; i++){ 
     grid[i] = next[i].slice(); 
    } 
: 일관성 위해서

3), 의도하지 않은 별칭을 만들 수 있도록, 당신이 뭔가에 의해 grid = next를 교체해야, 마지막으로 sum-=grid[x][y]

4)의 끝에 세미콜론을 추가

또는 nextdraw()에 해당하는 변수로 만들고 let next = make2DArray(cols, rows);draw()의 시작 부분에 배치하십시오.

+0

만약 내가 조건을 바꾸고 제거한다면 다음 = new Array (cols, rows); 설치 기능에서 그것을 그리기 기능에 배치하는 것이지만 작동하지 않는 것 같지만 논리는 나쁜 xd라고합니다. 여전히 작동하도록하는 방법을 찾고 있습니다. – anakata

+0

남아있는 유일한 버그는 작았습니다 (''당신이''j''가 필요한 곳). 'draw()'를 통해 각 패스마다 새로운'next '를 만드는 것이 맞습니다. –

+0

대단히 감사합니다! – anakata