- CodeMos는 추락하는 우주선을 안전하게 착륙시키는 착륙 알고리즘을 작성하는 게임입니다. 🚀
- 우주선의 착륙 안정성과, 착륙 시간으로 다른 유저들과 경쟁할 수 있습니다.
- 우주선은 매 판 랜덤하게 추락하기 때문에 어떠한 상황에서도 안전하게 착륙하는 범용적인 알고리즘을 작성해보세요.
- lunar-lander프로젝트와 Elevator Saga, 그리고 BOJ로 부터 영감을 얻었습니다.
- Web Link
- Prerequisites
- Chromium 기반 웹 브라우저
$> npx http-server
- 좌측 하단의 Docs 버튼을 누르면 우주선의 상태를 받아오고 엔진을 조작하는 API 함수에 대한 설명을 제공합니다.
- 우측 하단의 Code 버튼을 누르면 코드 에디터가 열립니다. 코드 에디터에 우주선 착륙 알고리즘을 작성할 수 있습니다.
- 경계선을 드래그하여 크기를 조절할 수 있습니다.
- Apply 버튼을 클릭해 코드 에디터에 작성한 코드를 우주선에 적용할 수 있습니다. 이후부터 우주선은 적용된 알고리즘에 따라 제어됩니다.
- 착륙 속도 12.0 MPH, 착륙 각도 11.0° 미만일 때 착륙으로 간주합니다.
- 초과한 상태로 지면에 닿는다면 추락으로 간주합니다. 추락일 경우에는 점수가 음수로 환산되어 리더보드에 등록됩니다.
- 게임이 끝나면 이번 게임에 적용된 알고리즘과 결과를 서버에 저장할지 선택할 수 있습니다.(알고리즘을 통해 조작된 결과만 가능, 키보드 조작시 저장 불가)
- 저장하면 해당 코드와 결과는 서버에 저장되고, 내 프로필에서 코드들을 볼 수 있습니다.
- 프로필에 들어가면 저장한 알고리즘들을 확인할 수 있습니다.
- 이 중 마음에 드는 결과를 리더보드에 계정당 한 개 등록할 수 있습니다.
- 리더보드에는 플레이어가 등록한 알고리즘과 점수 순위를 표시합니다.
- 1등부터 10등까지는 알고리즘이 비공개됩니다.
- 11등 이후 기록은 어떤 알고리즘인지 직접 확인할 수 있습니다.
게임 내에서 우주선 착륙 알고리즘을 작성 할 때 사용 가능한 함수들에 대한 설명입니다.API Docs
- JS ES6의 모든 문법을 사용해 CodeMos 우주선 알고리즘을 작성할 수 있습니다.
- 알고리즘이 작동하지 않는다면 코드를 잘못 짠게 아닐지 고민해 보세요.
- 버그가 발견되었다면 이스터에그입니다.
CodeMos 알고리즘에서 main loop는 아래와 같이 "newInterval"에 할당되어야 합니다. "newInterval"에 할당하지 않고 setInterval을 호출할 시 초기화 오류가 발생할 수 있습니다. interval 간격은 수정할 수 있습니다.
// TODO:
newInterval = setInterval(() => {
// TODO:
}, 1); // 1ms loop
// TODO:
// Incorrect Example
setInterval(() => {
// something something
}, 1);
전역 스코프에서 함수와 변수를 정의할 수 있습니다. 아래는 착륙 알고리즘 예제 입니다.(고득점 불가)
var targetHeight = 0; // Landing altitude
function engineCtrl() { // Engine control depending on altitude
if (getVelocityY() * 5 > (getHeight() - targetHeight))
engineOn();
else
engineOff();
}
newInterval = setInterval(() => { // main loop
if (getAngle() > 0) { // Adjusting the angle of the spaceship
stopRightRotation();
rotateLeft();
} else {
stopLeftRotation();
rotateRight();
}
engineCtrl();
}, 1);
// 비밀 ~
이 함수는 우주선의 현재 수평 속도를 실수형으로 반환합니다.
- 음수 : 우주선이 좌로 이동 중
- 양수 : 우주선이 우로 이동 중
getVelocityX()
이 함수는 우주선의 현재 수직 속도를 실수형으로 반환합니다.
- 음수 : 우주선이 위로 이동 중
- 양수 : 우주선이 아래로 이동 중
getVelocityY()
이 함수는 우주선의 현재 각도를 실수형으로 반환합니다.(-180.0 ~ +180.0)
getAngle()
이 함수는 우주선의 현재 고도(ft, 피트)를 정수형으로 반환합니다. 착륙지점의 고도는 0ft 입니다.
getHeight()
이 함수는 우주선의 현재 각속도를 실수형으로 반환합니다.
- 음수 : 우주선이 반시계 방향으로 회전 중
- 양수 : 우주선이 시계 방향으로 회전 중
getRotationVelocity()
이 함수를 호출하면 우주선의 주 엔진을 작동시킵니다.
engineOn()
이 함수를 호출하면 우주선의 주 엔진을 정지합니다.
engineOff()
이 함수를 호출하면 우주선의 좌측 추진체을 작동합니다. (우주선의 각속도가 증가합니다.)
rotateLeft()
이 함수를 호출하면 우주선의 좌측 추진체을 정지합니다.
stopLeftRotation()
이 함수를 호출하면 우주선의 우측 추진체을 작동합니다. (우주선의 각속도가 감소합니다.)
rotateRight()
이 함수를 호출하면 우주선의 우측 추진체을 정지합니다.
stopRightRotation()
이 함수는 Get Method 들의 반환값을 console에 표시합니다.
logging()
/*
f12 -> [console output]
getVelocityX() : 11.39214005489352
getVelocityY() : 27.95145243876781
getAngle() : -60.2
getHeight() : 239
getRotationVelocity() : 0.37505750000014804
*/
- CodeMos 행성은 중력(4.29158 m/s²) 외에는 어떠한 힘도 작용하지 않습니다.
- 주 엔진 thrust : Δ10.729 m/s
- 좌, 우측 엔진 thrust: Δ1.2 rotational velocity/s
- 착륙 속도 0.0 MPH, 착륙 각도 0.0° 일 때, 100점을 획득합니다.
This project is licensed under the MIT License