컨테스트가 완료되었습니다! 점수를 보려면 얼룩에 대한 주석을 읽으십시오.
이 KoTH는 Primer의 Natural Selection Simulation에서 느슨하게 영감을 받았습니다 . 봇은 얼룩입니다. 생존하려면 에너지를 회복하기 위해 펠렛을 먹어야합니다. 여분의 에너지로 얼룩을 두 개로 나눌 수 있습니다.
에너지와 운동
Blob은 각 라운드마다 100 에너지로 시작하며, 수집 할 수있는 에너지 양에는 제한이 없습니다. 각 라운드는 차례대로 진행되며 각 블로 브는 주어진 차례마다 북쪽, 동쪽, 남쪽 또는 서쪽을 움직이거나 서있을 수 있습니다. 이동은 1 에너지를 사용하고서는 여전히 0.25 에너지를 사용합니다. 지도의 측면 길이는ceil(0.25 * blobCount) * 2 - 1최소 9 대 모든 블로 브는 맵의 가장자리에서 시작하며, 하나는 각 모서리에 배치되고 모든 후속 블로 브는 다른 장치로부터 2 단위 떨어진 곳에 배치됩니다. 매 30 턴마다, 펠릿 물결이 가장자리에서 최소 1 단위 떨어진 맵 주위에 무작위로 배치됩니다. 펠릿의 물결이 나타날 때마다 다음 물결의 펠릿 수량 (원래 블랍 수 또는 맵 너비 중 큰 쪽)이 1만큼 감소하여 블랍 수가 시간이 지남에 따라 감소합니다. 각 펠릿은 5와 15 사이의 에너지를 회복합니다. 얼룩의 에너지가 0보다 작거나 같으면 죽습니다.
먹기
두 개 이상의 얼룩이 같은 위치를 차지하려고하면 가장 많은 에너지를 가진 물방울이 다른 에너지를 섭취하여 에너지를받습니다. 둘 다 에너지가 같으면 사라집니다.
탐지 및 정보
블롭은 4 단위 거리 내에있는 펠릿 또는 다른 블랍을 볼 수 있습니다. 함수가 호출되면 Blob에는 다음이 제공됩니다.
- 지도의 측면 길이
- 지도에서 얼룩의 위치
- 검색 반경 내 모든 펠릿의 위치와 값
- 검색 반경 내 모든 Blob의 위치와 에너지 및 UID
- 기능이 실행되는 블롭의 에너지, UID 및 위치
- Blob에 고유 한 스토리지 객체
- 분할을 통해 Blob과 관련된 모든 Blob이 공유하는 스토리지 오브젝트
파편
Blob의 에너지가 50 개 이상인 경우 분할을 선택할 수 있습니다. 분할 비용은 50 에너지이며 나머지 에너지는 두 얼룩 사이에 균등하게 분배됩니다. 모든 얼룩은 원본이거나 분할 복사본이며 모든 복사본은 원본으로 다시 추적됩니다. 이들 모두는 "친척"입니다. 모든 친척에게는 하나의 공동 저장 개체가 있습니다. 친척들은 여전히 서로를 먹을 수 있으며, 다른 사람에게 영향을 미치지 않으면 서 분리하거나 자신의 저장 대상을 사용하거나 에너지를 수집 할 수 있습니다.
에너지 전송
두 블롭이 서로 이동 한 경우 (이동 후) 봇 중 하나가 다른 봇으로 에너지를 전송할 수 있습니다. 이것은 반환함으로써 수행된다 SendNorth(amt), SendEast(amt), SendSouth(amt), 또는 SendWest(amt)로 amt되는 양을 나타내는 숫자를 보냈다. 이것은 모든 에너지를 포함하여 발신자가 감당할 수있는 금액 일 수 있습니다. 에너지를받는 블롭은 공동 저장을 통해 계속 유지되도록 권장하여 에너지가 전송 될 때 이동하지 않도록합니다 (이 경우 에너지는 발신자의 총계에서 공제되지는 않지만).
기능, 스토리지 및 UID
보다 복잡한 학습 행동을 허용하기 위해 모든 블롭에 정수 UID (Unique Identifer)가 부여됩니다. 이 UID는 각 맵에 무작위로 생성되어 개별 목표에 따른 전략을 방지합니다. Blob의 함수가 호출되면 네 가지 인수가 전달됩니다.
- 지도의 측면 길이 (정수)
- 두 개의 배열이있는 객체 :
pellets및blobs. 두 배열에는 모두pos펠릿 또는 blob의 위치 형식이 포함 된 속성이 있는 객체가 포함 됩니다[x,y]. 펠렛에는energy속성이 있고, 블롭에는uid속성과energy속성이 있습니다 - 블롭의 다양한 속성을 포함하는 객체는 그것으로 전달된다 :
energy,uid, 및pos.pos배열로 포맷[x,y] - Blob의 두 스토리지 오브젝트를 포함하는 오브젝트입니다.
self속성하지만 블롭은 (전달 된 객체의 속성을 조작함으로써) 착용감을보고 수정할 수있는 개별 저장 객체를 포함하고communal있는 상대적으로 변형 될 수있는 속성.
Blob은 이전 / 이후 회전이 유리한 점을 방지하기 위해 즉시 이동되지 않습니다. 모든 동작은 그룹으로 처리됩니다 (모든 충돌 / 먹기, 모든 펠릿, 분할 등). 블롭이 펠릿 또는 작은 블롭에 떨어지고 프로세스에서 마지막 에너지를 사용하는 경우 블롭은 여전히 펠릿 / 총 에너지가 0보다 커질 지 여부에 관계없이
상대 Blob이 서로를 인식하려면 각 Blob에 공용 스토리지를 사용하여 해당 UID를 배열 또는 다른 시스템을 통해 기록해야합니다.
반환 값
이동 또는 분할하기 위해 함수의 반환 값이 사용됩니다. 첫째, 좌표 측면에서 기본 방향의 의미는 다음과 같습니다.
- 북쪽 = -Y
- 동쪽 = + X
- 남쪽 = + Y
- 서쪽 = -X
참고 [0,0]는 IS 왼쪽 상단 당신이 아래로 가서, 및 Y 증가한다. 함수의 반환 값은 다음 규칙을 따라야합니다.
- 아무것도하지 않으려면 : 아무것도 반환하지 않음, 0, null, undefined, false 또는 false와 같은 다른 값
- 이동 : "북쪽", "동쪽", "남쪽"또는 "서쪽"과 같은 네 개의 전역 변수 중 하나를 반환합니다 (반환 값으로도 사용 가능).
- 분할하려면 : 새 얼룩을 배치 할 위치를 나타내는 방향 인 전역 변수 SplitNorth, SplitEast, SplitSouth 또는 SplitWest를 반환합니다 .
분할 명령이 반환되고 필요한 에너지 량이 블롭의 에너지보다 크거나 같으면 아무 일도 일어나지 않습니다. Blob은지도를 떠날 수 없습니다.
사전 정의 된 라이브러리 함수
시간을 절약하기 위해 기본적으로 사용 가능한 몇 가지 기본 기능이 있습니다.
taxiDist (pt1, pt2)
두 지점 사이의 택시 거리 (X 거리 + Y 거리)를 반환합니다.
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
피타고라스 정리에 따라 두 점 사이의 거리를 반환합니다
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
입력 된 방향을 취하고 시계 방향으로 90도 회전 amt한 다음 새 값을 반환합니다.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
블롭 예제
이 얼룩은 근처에서 펠렛을 찾을 때까지 움직이지 않습니다. 그런 다음 보상 할 가능성이 가장 높은 방향으로 움직입니다. 에너지가 150을 넘으면 분리됩니다.
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
규칙
- 표준 허점 은 금지되어 있습니다. 또한 비표준 허점이 없습니다.
- Blob은 매개 변수를 통해 전달되지 않은 데이터를 수정하거나 읽으려고 시도 할 수 없습니다.
- Blob은 다른 Blob을 방해하기 위해 반환 값 변수를 수정하려고 시도 할 수 없습니다.
- 라운드는 남은 유일한 얼룩이 친척이 될 때까지 지속됩니다.
- Blob은
this키워드를 사용하여 값을 수정하는 매개 변수에 함수를 삽입하여 데이터를 수정할 수 없습니다. - 모든 제출물은 Javascript 또는 Javascript와 너무 다르지 않은 언어 (예 : Python) 여야합니다. 모든 답변은 경쟁을 위해 Javascript로 변환됩니다.
- 승자는 모든 라운드에서 총량의 에너지를 모은 블랍입니다 (펠릿 또는 친척이 아닌 작은 블롭을 소비 함)
컨트롤러 : https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
대화방 : https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth