Silverback9

#야생으로

Creative Coding 독학 제317일 2025년02월07일(금)

어제 하얀 눈이 하염없이 내렸는데요~^^* 그 눈의 하얀 자취가 남아있는 아침의 창가~^^*

서늘하면서도 온화한 눈꽃들의 소리로 채워진 이 아침과 공명하고 계시겠어요~^^*?

공부 정리해서 돌아올게요~^^* 쓩우웅~^^*

네~^^*

오늘은, 우리가 발견했었던 에러를 고쳐보겠습니다~^^*

무한 반복 함수인 draw()의 특성~^^*,

for 구문의 조건 사항~^^*,

배열 구성요소를 삭제하고 빈자리에 다음 구성요소들을 차례로 옮겨와 배열을 정돈하는 함수 splice()의 특성~^^*,

조건문 if (A) ~ else if(B) 의 구조~^^*

등을 잘 이해해 볼 수 있는 좋은 예시가 될 것 같기도 해요~^^*

class Vehicle {
   .
   .
   .  
  eat(list) {
    var record = Infinity;
    var closest = -1;
    for (var i = 0; i < list.length; i++) {
      var d = this.position.dist(list[i]);
      if(d < record) {
        record = d;
        closest = i;
      }
    }
    
    //this.seek(list[closest]);
    
    if(record < 5) {
      list.splice(closest, 1);
    } else if(closest > -1) {
        this.seek(list[closest]);  
    }
  }
 
  seek(target) {
    const desired = p5.Vector.sub(target, this.position); 
    desired.setMag(this.maxspeed);
    let steer = p5.Vector.sub(desired, this.velocity);
    steer.limit(this.maxforce); 
    this.applyForce(steer); 
  }  
   .
   .
   .
  
}
//가장 가까운 거리에 대한 신기록 record는 앞으로 점점 수치가 작아질 것이므로, 시작하기 전까지는 알 수 없는 가장 큰 값 Infinity 무한대 값으로 초기 설정하겠습니다~^^*
//배열 list[]의 첫 구성요소 list[0]도 살펴봐야 하기 때문에, 가장 가까운 list 구성요소의 인덱스를 표현할 closest는 -1로 초기 설정하겠습니다. 
//"IF"가장 가까운 거리에 대한 신기록 record가 5 pixel보다도 작다면, 정말 가까운 것이니까, "제가 한 번 먹어 보도록 하겠습니다~"
//list[]의 closest번째부터 구성요소 하나만을 제거하도록 하겠습니다. 즉, closest 번째 구성요소를 제거하겠습니다.
//함수 splice()에 의해 제거된 구성요소 다음의 구성요소들이 차례로 앞으로 한 칸씩 이동하여 배열이 정돈될 것입니다~^^*
//먹는 행동만 하고, 함수 eat()는 종료될 것입니다. 
//"ELSE IF" 즉, 5 픽셀 반경 안에 list[]의 구성요소가 없는 경우에는 
// else if의 조건에 따라~^^* cloest가 -1보다 큰 경우만 
//vehicle과 가장 가까운 거리에 있는 list의 구성요소인 list[closest]를 추구하도록 함수 seek를 호출하겠습니다~^^*
//무한 반복 함수 draw()에 의해 함수 eat()가 계속 호출될 것입니다. 
//더 이상 배열 list[]에 구성요소가 남아있지 않게 되면, for 구문이 작동되지 않습니다. "i = 0 < list.length == 0", 즉, "0 < 0" 조건이 만족될 경우가 없기 때문입니다.  
//그래서 closest는 -1의 상태를 유지하게 됩니다. 
//그러면 if문의 조건도 else if문의 조건도 해당되지 않아서, 먹지도 않고 탐색하지도 않고 함수 eat()는 종료합니다. 
function draw() {
   .
   .
   . 
  vehicle.eat(food);
   .
   .
   .
}

food가 5 픽셀 거리 보다 더 가까이 있으면, 그 food를 먹기만 하고, 즉 배열 food에서 그 food를 삭제만 하고 (그러면, 배열 food[]의 구성요소 총 갯수 food.length가 1 감소하게 되겠네요), 행동을 종료합니다.

함수 draw()는 무한 반복함수이기 때문에, 다시 food.eat()을 호출할 것입니다.

그러면, closest는 -1로 재세팅이 되겠네요.

이때, 모든 food들을 다 먹어버린 상태라면, food.length가 0이기 때문에, 가장 가까운 거리 신기록을 갱신하며 배열 food[]에서의 그 food의 순번을 찾는 for구문이 작동되지 않을 것입니다.

왜냐하면~^^*

food.length == 0 이라서~^^*,

맨 처음 i 가 0일 때부터~^^*,

i < food.length ( 즉, 0 < 0 , “0”이 “0”보다 더 작다) 라는 조건을~^^*

만족시킬 수 없어서~^^*,

for 구문은 처음부터 작동되지 않습니다~^^*.

그러면 closest는 여전히 -1 상태에 머물러 있을 것입니다.

그래서 closest가 -1보다 큰 경우에만, 즉 배열 food[]에 구성요소가 남아있을 경우에만, food의 위치를 파악하여 그 방향으로 몸을 트는 함수 seek()를 작동시킵니다.

poison의 경우도 함수 eat()를 호출하기 때문에, 같은 작용이 일어날 것 같습니다~^^*

그럼 우리, 에러를 고친 결과를 같이 확인해 볼까요~^^* 마지막 food가 먼저 사라졌을 때도 또는 마지막 poison이 먼저 사라졌을 떄도, 에러가 발생하지 않고, 모든 food와 poison이 사라질 때까지 프로그램이 안정적으로 잘 작동이 되나요~^^*?

네~^^* 구성요소가 더 이상 존재하지 않는 경우에는 탐색하지 않기 때문에, 존재하지 않는 구성요소를 찾아 거리를 계산하느라 컴퓨터가 힘들어서 에러 메시지를 내던 상황은 해결된 것 같습니다~^^*

네~^* 아주 간단하게 몇 자만 수정하였는데도 에러가 해결되니 신기하네요~^^*

네~^^* 몇 글자 되지 않는 수정 작업이 내포하고 있는 의미가 생각보다 방대하고 정교해서 또한 신기하기도 하네요~^^*

수정작업은 아주 간단하지만 되살펴보면 좋을 내용들을 아주 많이 가지고 있어서요~^^*

오늘은 여기까지만 하기로 할까요~^^*

네~^^* 좋아요~^^* 고마워요~^^*

오늘 저와 함께 간단하지만 심도 깊은 에러 수정 작업을 해내어 주셔서 감사합니다~^^*

마치 깊은 바다 속을 헤엄치는 듯한 이 신기함~~^^*

내일은 음식과 독약을 구분할 수 있는 지혜를 한 톨 한 톨 따라가는 과정을 우리 함께 시작해 볼까요~^^*

네~^^* 좋아요~^^* 고마워요~^^*

오늘도!!

맛있는 점심 냠냠!!!

보람찬 하루~YEAH!!!

따끈한 저녁 후루룩!!!

포근하고 깊은 밤 코~~^^* 하시기 바래요~~^^*

주말 동안의 반갑고 기쁜 만남에 설레어 하며 좋은 꿈 꾸시고요~^^*

네~^^* 꿈은 이루어 집니다~^^*

댓글 남기기