Spacewar 를 해본 적이 있다면 ! 재미있는 게임이라는 것을 알고 있습니다. 당신이 모르는 경우, 이것은 가장 중요하고 가장 중요한 컴퓨터 게임 중 하나였습니다. 그리고 여전히 재미 있습니다! 내가 자란 복제본은 이것 입니다. 분명히 불행히도 Windows 만입니다. 그래서 나는 그것을 다시 만들었습니다!
KotH는 여기에서 호스팅됩니다 : PPCG-Spacewar! 언덕의 왕 . 게임이 어떻게 작동하는지 느끼기 위해 적어도 하나의 다른 봇과 대결하여 인간으로 플레이하는 것이 좋습니다.
게임
- 한 프레임은 30 밀리 초 (즉, 초당 약 33 프레임)입니다.
- 필드의 너비는 800 픽셀, 높이는 600 픽셀입니다.
- 이 필드는 토 로이드 형으로, 필드 밖으로 이동하는 우주선과 미사일이 반대편에 다시 나타납니다.
- 빨간색과 파란색의 두 우주선이 있습니다.
- 빨간색은 x = 50에, 임의의 y는 50 (필드 높이-50) 픽셀 사이에 위치합니다.
- 파란색은 x = (필드 너비-50) 및 임의의 y에서 50, (필드 높이-50) 픽셀 사이에 위치합니다.
- 양면 x = (필드 너비) / 2.
- 사용 가능한 컨트롤은 다음과 같습니다.
- 프레임 당 시계 반대 방향으로 5도 왼쪽으로 돌립니다.
- 오른쪽으로-프레임 당 5도 시계 방향으로 돌립니다.
- 파이어 미사일-선박이 가리키는 방향으로 선박의 속도와 함께 프레임 당 추가 10 픽셀로 이동합니다.
- 소방차-우주선이 가리키는 방향으로 프레임 당 0.30 픽셀의 우주선을 가속화합니다.
- 초 공간 점프-25 %의 확률로 현장에서 임의의 좌표로 순간 이동합니다. 이 임의의 좌표는 태양 위에있을 수 있습니다.
- 선박의 최대 속도는 엔진 출력에서 프레임 당 15 픽셀, 중력 증폭시 프레임 당 40 픽셀입니다.
- 프레임 당 15 픽셀보다 빠르게 이동할 경우 엔진 스러스트는 방향 만 변경하거나 속도를 늦출 수 있습니다.
- 미사일에 관하여 :
- 미사일은 직선으로 이동합니다.
- 미사일은 0.1 초당 최대 1의 속도로 발사 될 수 있습니다.
- 미사일의 수명은 2.25 초입니다.
- 선박은 각각 최대 20 개의 미사일을 보유하고 있습니다.
- 미사일은 내부적으로 점 입자입니다.
- 중앙에 태양이있어 배에 매우 위험합니다. 가장 작은 접촉은 치명적입니다. 이 태양은 또한 미사일을 파괴합니다.
- 태양에는 중력이 있습니다. 결과 가속은 5000 / (거리 ^ 2) 픽셀 / 프레임 ^ 2이며, 여기서 거리는 픽셀 단위입니다. 우주선과 미사일이 영향을받습니다.
- 두 선박 모두 코, 왼쪽 날개 및 오른쪽 날개의 세 가지 타격 구역이 있습니다.
- 코에 부딪 치면 즉시 사망합니다.
- 어느 한 쪽 날개를 치면 우주선의 회전 속도와 엔진 가속이 절반으로 줄어 듭니다.
- 두 날개가 모두 파괴되면 우주선을 조종 할 수 없으며 미사일 만 발사 할 수 있습니다.
- 선박이 서로 충돌 할 수 있습니다.
- 코 코의 충격은 두 선박 모두에게 치명적입니다.
- 코 날개 충격은 날개를 파괴합니다.
- 날개 날개 충격은 두 날개를 모두 파괴합니다.
- 죽은 배는 1 초 후에 폭발 할 때까지 견고하고 동결됩니다.
- 적어도 한 척의 선박이 사망 한 후 3 초 후에 필드가 재설정됩니다. 그때까지 태양과 남은 미사일은 여전히 위험합니다.
원래 게임에는 치명적이고 파괴 할 수없는 소행성이 있지만 포함하지는 않습니다.
규칙
- 봇은 JavaScript로 작성해야합니다.
- 봇은 약 10 밀리 초로 결정을 제한해야합니다. 귀하의 봇으로 인해 일관된 지연이 발견되면 실격 처리하여 문제를 해결할 수 있도록 알려 드리겠습니다.
- 봇은 다음에 액세스 할 수 있습니다.
- 필드 너비 및 필드 높이
- 태양의 위치와 반경
- 두 선박의 위치, 회전, 속도, 모양, 미사일 재고 및 우주 공간 상태
- 모든 미사일의 위치와 속도
- 메시지가 표시되면 봇이 문자열 목록을 반환해야합니다.
- 이러한 문자열은 다음 중 하나이어야한다 :
turn left
,turn right
,fire engine
,fire missile
,hyperspace
. 다른 문자열은 무시됩니다. - 중복이 있으면 첫 번째 만 기록됩니다.
hyperspace
다른 모든 것보다 우선합니다.turn left
그리고turn right
같은 시간에 아무런 영향을주지 않습니다.fire engine
배에 코만 있거나 사망 한 경우에는 효과가 없습니다.fire missile
미사일이 너무 최근에 발사 된 경우 아무런 효과가 없습니다.
- 이러한 문자열은 다음 중 하나이어야한다 :
- 평소와 다른 방식으로 변경하면 봇은 다른 봇의 행동을 이용할 수 있습니다. 메타 게임을 장려하고 싶습니다.
- 봇 은 다른 봇을 모방 하지 않을 수 있습니다 . (즉, 마음을 읽지 않습니다.)
- 봇 은 게임 및 물리 코드에서 사용하는 변수를 설정할 수 없습니다 . (즉, 부정 행위 없음)
봇 구현 세부 사항
봇을 filename과 함께 자동으로 포함 된 자체 JavaScript 파일에 저장합니다 bot_<name>.js
. 따라서 이것을 방해하거나 JavaScript의 함수 이름 지정을 방해하는 공백이나 문자를 넣지 마십시오. 즉, 다음과 같은 기능을 정의해야하기 때문이다 : <name>_setup(team)
와 <name>_getActions(gameInfo, botVars)
. 페이지 아래에는 userbot에 대한 텍스트 영역이 있으며 코드를 테스트하기 위해 편집 할 수 있습니다.
<name>_setup(team)
이 함수는 유지하려는 변수를 정의하기위한 것입니다. team
이 될 것입니다 "red"
또는 "blue"
. 이 함수는 객체를 반환해야합니다. 다음과 같이 변수를 정의하십시오.
var vars = {};
vars['example'] = "example";
return vars;
이 vars
객체는 다른 함수로 전달됩니다.
<name>_getActions(gameInfo, botVars)
botVars
에서 반환 한 객체 <name>_setup(team)
입니다. gameInfo
다음 변수를 포함하는 객체입니다.
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
봇은 이것들에 대한 모든 권한을 가지고 있습니다. 나는 당신 이 그것들에 쓸 수 있고 원래 변수에 영향을 미치지 않을 것이라고 확신 하지만 어쨌든하지 마십시오. 회전에 참고 사항 : 배송 포인트 는 배와 정렬 할 아래로,의 + y 방향으로, 그래서 아무것도 90 개도에 의해 상쇄 될 필요가있다. 또한 양의 회전은 시계 방향입니다.
이 함수는 봇의 동작을 나타내는 문자열 목록을 반환해야합니다. 예를 들면 다음과 같습니다 ["turn right","thrust"]
. 이에 대한 자세한 내용은 규칙 섹션에 있습니다.
추가 세부 사항
다음을 사용할 수도 있습니다.
LineIntersection(L1, L2)
L1 및 L2는 2 요소 배열의 2 요소 배열입니다. 즉, L1 := [[x1,y1],[x2,y2]]
하고 L2 := [[u1,v1],[u2,v2]]
. 이 함수는 두 줄의 교집합을 계산하여 다음을 반환합니다 [[x,y], [a,b]]
. [x,y]
는 교점의 좌표이며 교점의 [a,b]
각 선을 따라 얼마나 멀리 있는지를 나타내는 한 쌍의 비율입니다. 마찬가지로, a = 0.25
교차점 길의 4 분에서 것을 의미 [x1,y1]
에 [x2,y2]
, 마찬가지로위한 b
. 교차가 없으면 빈 배열이 반환됩니다.
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
이것들은 선박의 다각형 좌표입니다. 현재 좌표를 쉽게 얻기 위해 다음을 사용할 수도 있습니다.
getShipCoords(<color>)
getShipCoords("red")
Red 's ship 정점의 현재 좌표와 마찬가지로 getShipCoords("blue")
Blue 의 좌표를 반환합니다 . 이 좌표는 다음과 같은 목록에 [[x1,y1],[x2,y2],[x3,y3],...]
있습니다. 다각형은 암시 적으로 닫혀 있으므로 첫 번째 좌표 쌍과 마지막 좌표 쌍 사이에 선이 있습니다.
게임 / 웹 사이트에서 사용중인 다른 변수 나 기능에 액세스하거나 변경할 수 없습니다. 그리고 함수 이름을 동일하게 지정하지 마십시오. 이것이 문제가 될 것이라고 예상하지는 않지만 봇이 게임 코드를 위반하면 그 가능성이 있습니다. 예외를 기록하거나 포착하지 않습니다.
승리
- 봇의 모든 페어링은 두 가지 방식으로 최소 10 회 플레이해야합니다. (최소 20 게임 이상)
- 전반적으로 가장 높은 승 / 패 비율을 가지도록 노력하십시오 . 만약 당신의 봇이 다른 봇에 대해서는 아주 잘 맞지만 다른 봇에 대해서는지는 경우, 두 사람에 대해 이기고 두 사람에 대해지는 것 (일반적으로)입니다.
- 모든 봇에 대해 비율 (wins + 1) / (losses + 1)이 계산 된 다음 이러한 비율의 평균 및 표준 편차가 계산됩니다. 평균이 높을수록 우선 순위가 높고 평균이 서로 1 단위 이내 인 경우 분산이 낮을수록 우선 순위가 높습니다.
- 채점은 오늘부터 일주일 이내에 또는 새로 제출하지 않은 3 일 후에 시작됩니다. 따라서 봇 쌍을 반복 할 필요가 없습니다.
무엇보다 재미있게 보내십시오!
리더 보드 (2016-01-08 05:15) :
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
참고 : 더 많은 게임을 실행하면 변경 될 수 있습니다. 또한 9-13 등급의 순서가 나를 귀찮게하므로 점수 방법을 조정하여 순위를 매기는 방법에 대한 직관에 더 잘 맞출 수 있습니다.
(평균과 표준 편차는 소수점 이하 세 자리로 반올림되었습니다. 또한 강조 표시를 망쳐 Hyper
놓아야합니다 HYPER
. : P)
LineIntersection
교차하지 않는 세그먼트 를 호출 하면 빈 배열이 반환되도록 지정해야합니다 .