Silverback9

#야생으로

Creative Coding 독학 제199일 2024년10월12일(토)

오늘은 바닥에 알갱이가 가만히 있는 것을 표현하는 코드를 만들어 보겠습니다~^^* YEAH~^^*

음….알갱이가 바닥에 닿았을 때, 알갱이의 바로 아래 칸이 존재하지 않는 것 같아요.

그러면!

알갱이의 바로 아래 칸이 존재하지 않을 때, 즉 알갱이가 바닥에 닿았을 때, 알갱이의 색을 흰색으로 유지하는 거예요.

알갱이의 바로 아래 칸이 존재하지 않는다는 것은,

<알갱이의 바로 아래 칸이 존재하고 그 색이 검을 때>라는 조건 외의 조건들 중 하나일 것 같아요.

바로,

<알갱이의 바로 아래 칸이 존재하지 않거나, 알갱이의 바로 아래 칸이 존재하는 데 그 색이 흰색일 때>에 해당할 것 같아요.

어제 만든 코드를 이 알고리즘을 바탕으로 개선해 보겠습니다~^^*

  let nextGrid = make2DArray(cols, rows);
  //다음 단계 까만 모눈 종이 준비~~^^*

  for (let i = 0; i < cols; i++){
    for (let j = 0; j < rows; j++) {
      let state = grid[i][j]; //지금 단계 상태 저장~
      if (state === 1) { //이 칸이 하얗다면~~^^*
       let below = grid[i][j+1]; //바로 아래 칸을 찾아서~
       if ( below === 0) { //바로 아래 칸이 까맣다면~~^^*
         nextGrid[i][j + 1] = 1; //바로 아래 칸을 하얗게~^^*
       } else {
         //그렇지 않을 때, 즉, 
         //바로 아래 칸이 희거나, 바로 아래 칸이 존재하지 않을 때
         nextGrid[i][j] = 1; //알갱이의 현재 자리를 하얗게~^^*
      }
    }
  }
  
  grid = nextGrid; //다음 단계 모눈 종이 상태를 지금 단계 모눈 종이에 저장~

<우리의 알갱이>가 바닥에 얌전히 잘 머무르고 있나요~~?^^*

근데요~~~~^^*

어머, 근데요~~~~^^*

<else: 그렇지 않다면>에 해당하는 조건은 두 가지인데요~~^^*

(1) 바로 아래 칸이 존재하지 않을 때

(2) 바로 아래 칸이 흰 색일 때

<바로 아래 칸이 흰 색일 때> <우리의 알갱이>의 현재 위치가 흰색이 된다는 것은????

알갱이가 차곡차곡 쌓일 수도 있다는 뜻????

와우!!! 그럼 우리 오늘 공부하는 김에, 모래 성을 쌓아 볼까요?!!!

모래에 물을 적시면 모래 위에 모래가 쌓일 것 같은데요!!!!

우리 마우스로 젖은 모래를 뿌려 봅시다!!!!

마우스를 화면에 클릭하면 <우리의 알갱이>가 생성되도록 해 볼까요~~^^*

function mousePressed() {
  let col = floor(mouseX / resolution);
  let row = floor(mouseY / resolution);
  grid[col][row] = 1; 
}
//mouseX, mouseY가 위치하는 화면 위치 좌표를 resoultion으로 나눈 후 그 몫의 정수 부분만 취하면, 해당 위치에 자리한 grid배열의 구성요소를 알 수 있을 것 같아요~^^*
//그리고, 그 구성요소에 1의 값을 저장하면~~
//색칠하는 for 구문 안에서 흰 색으로 표현되겠지요~^^* 

이제 우리 전체 코드를 함께 볼까요~~^^*

function make2DArray(cols, rows) {
  let arr = new Array(cols);
  for (let i = 0; i < arr.length; i++) {
    arr[i] = new Array(rows);
    for (let j = 0; j < arr[i].length; j++) {
      arr[i][j] = 0;
    }
  }
  return arr;
  //새까맣게 채워진 모눈 종이를 return합니다. 
}

function mousePressed() {
  let col = floor(mouseX / resolution);
  let row = floor(mouseY / resolution);
  grid[col][row] = 1; 
  
  //마우스가 클릭되면 자동적으로 작동되는 함수입니다~~^^*
  //메인 함수에서 따로 호출할 필요가 없어요~~^^*
  //mouseX, mouseY가 위치하는 화면 위치 좌표를 resoultion으로 나눈 후 그 몫의 정수 부분만 취하면, 해당 위치에 자리한 grid배열의 구성요소를 알 수 있을 것 같아요~^^*
  //그리고, 그 구성요소에 1의 값을 저장하면~~
  //메인 함수의 색칠하는 for 구문 안에서 흰 색으로 표현되겠지요~^^* 
} 


let grid;
let cols;
let rows;
let resolution = 10;

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

  grid = make2DArray(cols, rows);
  //지금 단계 까만 모눈 종이 준비~~^^*
  
}

function draw() {
  background(0);
   
  let nextGrid = make2DArray(cols, rows);
  //다음 단계 까만 모눈 종이 준비~~^^*

  for (let i = 0; i < cols; i++){
    for (let j = 0; j < rows; j++) {
      let state = grid[i][j]; //지금 단계 상태 저장~
      if (state === 1) { //이 칸이 하얗다면~~^^*
        let below = grid[i][j+1]; //바로 아래 칸을 찾아서~
        if ( below === 0) { //바로 아래 칸이 까맣다면~~^^*
          nextGrid[i][j + 1] = 1; //바로 아래 칸을 하얗게~^^*
        }
        else {
        //그렇지 않을 때, 즉, 
        //바로 아래 칸이 희거나, 바로 아래 칸이 존재하지 않을 때
        nextGrid[i][j] = 1; //알갱이의 현재 자리를 하얗게~^^*
        }
      } 
    }
  }
  
  grid = nextGrid; //다음 단계 모눈 종이 상태를 지금 단계 모눈 종이에 저장~

  for (let i = 0; i < cols; i++) {
    for (let j = 0; j < rows; j++) {
      
      let x = i * resolution;
      let y = j * resolution;
      
      fill(grid[i][j] * 255); 
      //grid[i][j]값이 1이면 1*255 = 255 즉, 흰색으로 채웁니다.
      //grid[i][j]값이 0이면 0*255 = 0 즉, 검은색으로 채웁니다.
      stroke(255);
      square(x, y, resolution); 
       
    }
  }
  //마우스 클릭 한 곳의 알갱이가 하양게 변하나요? ^^*
  //그리고 그 아래칸들이 차례로 하양게 까맣게 변화되나요?^^*
  //하얀 알갱이가 까만 하늘에서 내려오는 것처럼 보이나요?^^*
  //하얀 알갱이가 바닥에 가만히 머무르나요?^^*
}

물에 적신 모래를 한 알갱이 한 알갱이를 공중에 톡톡 뿌려 볼까요? 모래성을 정성껏 클릭클릭 쌓아 보셔요~~^^* 넓게~~ 높게~~^^*

오늘 저와 함께 해변에 놀러가서 바닷물로 모래를 적셔 한 알갱이 한 알갱이 모래성을 정성껏 쌓아 올려 주셔서 감사합니다~~^^*

내일은 동네 놀이터의 모래사장으로 가서 마른 모래 쌓기 놀이를 함께 해볼까요~~^^*

넵!! 우리의 도전! 계속 함께 하면 좋겠어요~~~^^*

오늘도 멋진 아침! 멋진 하루! 보내시고요~~^^*

내일 우리 또 만나요~~~^^*

네~~~!!! 꿈은 이루어 집니다~~~!!!

댓글 남기기