도시가 깡패들과 도둑들에 의해 지배 된 황폐하고 전쟁이 심한 세상에서, 문명은 이전의 무인도에 흩어져있는 작고 고립 된 산업 협동 조합의 형태로 재창조되었습니다. 이 공동체의 존재는 "스크래퍼 (scrappers)"라고 불리는 용병 노동자 팀에 의존하는데, 이들은 스탬프에게 팔릴 귀중한 재료를 찾기 위해 길들여지지 않은 영토를 찾는다. 이러한 재료가 점점 부족 해짐에 따라 폐기는 점점 더 어렵고 위험한 직업이되었습니다. 연약한 인간 작업자는 대부분 "봇"이라고하는 원격 로봇 스탠드로 대체되었으며 일반적인 용병은 무장 용접기보다 숙련 된 프로그래머 일 가능성이 높습니다. 폐기에 대한 인간의 존재가 감소함에 따라, 용병 그룹들 사이의 존중도 서로에 대한 존중을 가졌다. 봇은 스크랩을 수집 할뿐만 아니라이를 보호하기 위해 장착되며 경우에 따라 강제로 가져옵니다. 봇 프로그래머는 경쟁자 스크래퍼보다 앞서 나가기 위해 끊임없이 새로운 전략을 고안하여 점점 더 공격적인 봇을 만들고 커뮤니티 외부에서 모험을하는 인간에게는 또 다른 위험을 초래합니다.
(예, 로고가 유쾌하게 잘립니다)
Scrappers에 오신 것을 환영합니다!
스크랩 수집 및 팩토리가 구현되지 않은 초기 버전의 Scrapper입니다. 기본적으로 "촬영"입니다.
귀하는 경쟁 스크레이퍼 그룹에서 승리하기 위해 봇을 원격으로 수행하는 프로그램을 작성하는 임무를 맡은 용병 프로그래머입니다. 봇은 코어에 전력 및 실드 생성기로 구성된 스파이더와 유사한 기계로, 그립, 절단 및 공격 도구가 장착 된 많은 부속 장치로 둘러싸여 있습니다. 발전기는 틱 (스크래퍼의 시간 단위) 당 12 개의 전원 장치 (pu)를 생산할 수 있습니다. 봇의 3 가지 주요 요구 (이동, 방패, 화력)에이 힘이 어떻게 분배되는지 제어 할 수 있습니다.
스크래퍼 봇은 매우 민첩한 기계이며, 발생하는 모든 장애물 위로 쉽게 이동할 수 있습니다. 따라서 충돌은 프로그램에서 고려해야 할 사항이 아닙니다. 정수를 처리하는 한 12pu의 봇에 사용할 수있는 12pu 중 일부 또는 전부를 자유롭게 할당 할 수 있습니다. 봇의 이동 기능에 0pu를 할당하면 움직이지 않게됩니다. 2pu를 할당하면 봇이 틱당 2 개의 거리 단위 (du)를 이동할 수 있으며, 5pu는 5du / tick, 11pu는 11du / tick 등이됩니다.
봇의 쉴드 생성기는 몸 주위에 반사 에너지 거품을 투사합니다. 방패는 터지기 전에 최대 1의 피해를받을 수 있으므로 방패 생성기가 방패를 다시 제자리에 끼울 수있는 충분한 힘을 얻을 때까지 봇을 노출시킵니다. 봇이 방패를 향해 사용할 수있는 12pu 중 일부 또는 전부를 자유롭게 할당 할 수 있습니다. 봇의 방패에 0pu를 할당하면 방패가 생성되지 않습니다. 2pu를 할당하면 봇이 12 틱 중 또는 6 틱마다 한 번씩 새로운 방패를 생성 할 수 있습니다. 5pu는 12 틱마다 쉴드 재생 5를 초래합니다.
용접 레이저에 전하를 축적함으로써 봇은 근거리에서 정확한 정확도로 해로운 광선을 발사 할 수 있습니다. 방패 생성과 마찬가지로 봇의 발사 속도는 레이저에 할당 된 전력에 따라 다릅니다. 봇의 레이저에 0pu를 할당하면 절대로 발사되지 않습니다. 2pu를 할당하면 봇이 12 틱마다 2 개를 발사 할 수 있습니다. 봇의 레이저는 물체에 부딪 치거나 쓸모가 없어 질 때까지 이동하므로 친절한 화재에주의하십시오. 봇은 매우 정확하지만 완벽하지는 않습니다. +/- 2.5 도의 정확도 차이를 기대해야합니다. 레이저 빔이 이동함에 따라 빔은 충분한 거리로 빔이 효과적으로 무해해질 때까지 대기에 의해 점차적으로 편향됩니다. 레이저는 포인트 블랭크 범위에서 1의 피해를 입히고, 이동하는 봇 길이마다 2.5 %의 피해를줍니다.
스크래퍼 봇은 기본 기능을 처리 할 수있을만큼 자율적이지만, 프로그래머 인 당신에게 의존하여 그룹으로 유용하게 만듭니다. 프로그래머는 각 개별 봇에 대해 다음 명령을 발행 할 수 있습니다.
- 이동 : 봇이 이동할 좌표를 지정합니다.
- 목표 : 전력 할당이 허용 될 때 조준하고 발사 할 봇을 식별합니다.
- 전원 : 이동, 보호막 및 화력간에 전원을 재분배합니다.
기술 게임 정보
숙지해야 할 세 가지 프로그램이 있습니다. 게임 엔진은 무거운 리프터이며, 플레이어 프로그램에 연결하는 TCP API를 제공합니다. 플레이어 프로그램은 여러분이 작성할 것이며, 여기에 바이너리가 포함 된 예제가 있습니다 . 마지막으로 렌더러 는 게임 엔진의 출력을 처리하여 전투의 GIF를 만듭니다.
게임 엔진
여기에서 게임 엔진을 다운로드 할 수 있습니다 . 게임이 시작되면 플레이어 연결을 위해 포트 50000 (현재 구성 할 수 없음)에서 청취를 시작합니다. 두 개의 플레이어 연결이 수신되면 READY 메시지를 플레이어에게 보내고 게임을 시작합니다. 플레이어 프로그램은 TCP API를 통해 게임에 명령을 보냅니다. 게임이 끝나면 scrappers.json이라는 JSON 파일 (현재 구성 할 수 없음)이 생성됩니다. 렌더러가 게임의 GIF를 만드는 데 사용하는 것입니다.
TCP API
플레이어 프로그램과 게임 엔진은 줄 바꿈으로 끝나는 JSON 문자열을 TCP 연결을 통해 앞뒤로 전달하여 통신합니다. 보내거나받을 수있는 JSON 메시지는 다섯 가지뿐입니다.
준비 메시지
READY 메시지는 게임에서 플레이어 프로그램으로 전송되며 한 번만 전송됩니다. 이 메시지는 플레이어 프로그램에 플레이어 ID (PID)가 무엇인지 알려주고 게임의 모든 봇 목록을 제공합니다. PID는 친한 대 봇을 결정하는 유일한 방법입니다. 아래 봇 필드에 대한 자세한 정보.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
봇 메시지
BOT 메시지는 게임에서 플레이어 프로그램으로 전송되며 봇의 속성이 변경되면 전송됩니다. 예를 들어, 방패가 투사되거나 상태가 변경되면 BOT 메시지가 전송됩니다. 봇 ID (BID)는 특정 플레이어 내에서만 고유합니다.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
메시지 이동
MOVE 메시지는 플레이어 프로그램에서 게임까지의 명령입니다 (그러나 로봇에 대한 명령으로 생각하십시오). 이동하려는 봇과 좌표를 식별하면됩니다. 자신의 봇을 명령한다고 가정하므로 PID가 필요하지 않습니다.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
대상 메시지
타겟 메시지는 봇 중 하나에게 다른 봇을 타겟팅하도록 알려줍니다.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
전원 메시지
POWER 메시지는 봇이 사용할 수있는 12pu를 이동, 화력 및 방패 사이에 재 할당합니다.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
경쟁
길들여지지 않은 땅을 탐험하기에 용감하다면 용병들과의 더블 엘리 미 네이션 토너먼트에 참가하게됩니다. 제출에 대한 답변을 작성하고 코드를 붙여 넣거나 git repo, gist 등의 링크를 제공하십시오. 모든 언어는 허용되지만 언어에 대해 전혀 모른다고 가정하고 프로그램 실행 지침을 포함해야한다고 가정해야합니다. 원하는만큼 제출물을 작성하고 이름을 지정하십시오!
샘플 플레이어 프로그램은 내가보기 엔 그들에 대하여 당신의 로봇을 테스트하는 것이 좋습니다 그래서 대회에 포함됩니다. 토너먼트는 4 번의 독특한 프로그램 제출 후 대략 2 주 후에 시작됩니다. 행운을 빕니다!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
다른 중요한 정보
- 게임은 12 틱 / 초로 실행되므로 83 밀리 초 정도마다 메시지를 더 자주받지 않습니다.
- 각 봇의 직경은 60du입니다. 방패는 추가 공간을 차지하지 않습니다. +/- 2.5 % 정확도에서 특정 거리에서 봇을 칠 확률은이 그래프로 표시됩니다.
- 거리에 따른 레이저 손상의 붕괴는 다음 그래프로 표시됩니다.
- 봇의 정확도와 레이저 붕괴가 결합하여 샷당 평균 손상을 계산합니다. 즉, 로봇이 특정 거리에서 발사 할 때 발생하는 평균 피해량입니다. 샷당 데미지는이 그래프로 표시됩니다.
- 봇의 레이저는 봇의 중심과 가장자리 사이의 반쯤에서 시작됩니다. 따라서 봇을 쌓아두면 우호적 인 화재가 발생합니다.
- 적 봇은 약 1440du 간격으로 생성됩니다.
- 120 틱 (10 초)이 지나치지 않으면 게임이 종료됩니다.
- 승자는 봇이 가장 많은 플레이어이며 게임이 끝날 때 가장 건강합니다.
렌더링 된 이미지 이해
- 플레이어 1은 원으로, 플레이어 2는 육각형으로 표시됩니다.
- 봇의 색상은 전력 할당을 나타냅니다. 빨간색이 많을수록 발사에 더 많은 전력이 할당되었음을 의미합니다. 파란색이 많을수록 더 많은 방패를 의미합니다. 더 많은 녹색은 더 많은 움직임을 의미합니다.
- 봇 본체의 "구멍"은 손상을 나타냅니다. 구멍이 클수록 더 많은 데미지를 입었습니다.
- 봇을 둘러싼 흰색 원은 방패입니다. 턴 끝에 봇에 방패가 있으면 표시됩니다. 방패가 데미지를 입어 튀어 나오면 보이지 않습니다.
- 봇 사이의 빨간색 선은 촬영 된 장면을 나타냅니다.
- 봇이 죽으면 큰 빨간색 "폭발"이 표시됩니다.