Nếu bạn đã từng chơi Spacewar! , bạn biết đó là một trò chơi thú vị. Nếu bạn chưa biết, hãy biết điều này: đó là (và là) một trong những trò chơi máy tính đầu tiên và quan trọng nhất. Và nó vẫn vui! Bản sao mà tôi lớn lên là cái này , rõ ràng và không may, chỉ có Windows. Vì vậy, tôi đã tạo lại nó!
KotH được lưu trữ tại đây: PPCG - Spacewar! Vua đồi . Tôi khuyến khích bạn chơi như một con người chống lại ít nhất một bot khác để cảm nhận về cách trò chơi hoạt động.
Tro choi
- Một khung hình là 30 mili giây (do đó, khoảng 33 khung hình mỗi giây).
- Trường rộng 800 pixel và cao 600 pixel.
- Trường này là hình xuyến, có nghĩa là tàu vũ trụ và tên lửa di chuyển bên ngoài trường xuất hiện ở phía đối diện.
- Có hai tàu vũ trụ, đỏ và xanh.
- Màu đỏ được định vị ở x = 50 và y ngẫu nhiên trong khoảng 50, (chiều cao trường - 50) pixel.
- Màu xanh được định vị ở x = (chiều rộng trường - 50) và y ngẫu nhiên trong khoảng từ 50, (chiều cao trường - 50) pixel.
- Cả hai mặt x = (chiều rộng trường) / 2.
- Các điều khiển có sẵn là:
- Rẽ trái - 5 độ mỗi khung hình ngược chiều kim đồng hồ.
- Rẽ phải - 5 độ mỗi khung theo chiều kim đồng hồ.
- Tên lửa lửa - di chuyển với tốc độ thêm 10 pixel mỗi khung hình ngoài vận tốc của con tàu, theo hướng con tàu đang chỉ.
- Động cơ chữa cháy - tăng tốc tàu vũ trụ ở 0,30 pixel mỗi khung hình theo hướng tàu vũ trụ đang chỉ.
- Nhảy siêu không gian - dịch chuyển đến một số tọa độ ngẫu nhiên trong trường, với 25% cơ hội phát nổ. Các tọa độ ngẫu nhiên này có thể nằm trên đỉnh của mặt trời.
- Tốc độ tối đa cho tàu là 15 pixel mỗi khung hình dưới công suất động cơ và 40 pixel mỗi khung hình khi được tăng trọng lực.
- Khi di chuyển nhanh hơn 15 pixel mỗi khung hình, lực đẩy của động cơ chỉ có thể thay đổi hướng hoặc giảm tốc độ.
- Về tên lửa:
- Tên lửa đi theo một đường thẳng.
- Tên lửa có thể được bắn với tốc độ tối đa 1 trên 0,1 giây.
- Tên lửa có thời gian tồn tại 2,25 giây.
- Tàu có tối đa 20 tên lửa mỗi tên.
- Tên lửa là các hạt điểm bên trong.
- Có một mặt trời ở chính trung tâm cực kỳ nguy hiểm cho tàu của bạn. Tiếp xúc nhẹ nhất là gây tử vong. Mặt trời này cũng phá hủy tên lửa.
- Mặt trời có trọng lực. Gia tốc kết quả là 5000 / (khoảng cách ^ 2) pixel / khung ^ 2, trong đó khoảng cách tính bằng pixel. Tàu vũ trụ và tên lửa bị ảnh hưởng.
- Cả hai tàu đều có ba vùng tấn công: mũi, cánh trái và cánh phải.
- Một cú đánh vào mũi là chết ngay lập tức.
- Một cú đánh vào một trong hai cánh làm giảm tốc độ quay của tàu vũ trụ và tăng tốc động cơ xuống một nửa.
- Nếu cả hai cánh bị phá hủy, tàu vũ trụ không thể được điều động và chỉ có thể bắn tên lửa.
- Tàu có thể va chạm với nhau.
- Một tác động mũi-mũi gây tử vong cho cả hai tàu.
- Một tác động cánh mũi phá hủy cánh.
- Một tác động cánh phá hủy cả hai cánh.
- Tàu chết là rắn và đóng băng cho đến khi chúng phát nổ 1 giây sau đó.
- Sau khi ít nhất một tàu đã chết, trường được đặt lại 3 giây sau đó. Cho đến lúc đó, mặt trời và bất kỳ tên lửa nào còn lại vẫn nguy hiểm.
Trò chơi ban đầu cũng có các tiểu hành tinh chết người và không thể phá hủy, nhưng tôi sẽ không bao gồm những tiểu hành tinh đó.
Những quy định
- Bot của bạn phải được viết bằng JavaScript.
- Bot của bạn nên giới hạn quyết định của nó trong khoảng 10 mili giây. Nếu tôi nhận thấy độ trễ phù hợp vì bot của bạn , tôi sẽ loại bỏ nó và cho bạn biết để bạn có thể khắc phục nó.
- Bots sẽ có quyền truy cập vào sau:
- Chiều rộng trường và chiều cao trường
- Vị trí mặt trời và bán kính
- Vị trí, góc quay, vận tốc, hình dạng, kho tên lửa và trạng thái không gian siêu tốc của cả hai tàu
- Vị trí và vận tốc của tất cả các tên lửa
- Khi được nhắc, bot của bạn sẽ trả về một danh sách các chuỗi.
- Những chuỗi nên là một trong các nội dung sau:
turn left
,turn right
,fire engine
,fire missile
,hyperspace
. Bất kỳ chuỗi nào khác sẽ bị bỏ qua. - Nếu có bất kỳ bản sao, chỉ có cái đầu tiên sẽ được ghi chú.
hyperspace
được ưu tiên hơn tất cả những người khác.turn left
vàturn right
đồng thời sẽ không có hiệu lực.fire engine
sẽ không có tác dụng nếu con tàu chỉ có mũi hoặc đã chết.fire missile
sẽ không có tác dụng nếu một tên lửa bị bắn quá gần đây.
- Những chuỗi nên là một trong các nội dung sau:
- Trong một thay đổi so với thông thường, bot của bạn được phép khai thác hành vi của các bot khác. Tôi muốn khuyến khích một metagame.
- Bots có thể không mô phỏng các bot khác. (Tức là không đọc tâm trí.)
- Bots có thể không đặt bất kỳ biến nào được sử dụng bởi mã trò chơi và vật lý. (Tức là không gian lận.)
Chi tiết triển khai Bot
Tôi sẽ lưu trữ bot của bạn trong tệp JavaScript của riêng nó được bao gồm tự động, với tên tệp bot_<name>.js
. Vì vậy, đừng đặt bất kỳ khoảng trắng hoặc ký tự nào có thể can thiệp vào điều này hoặc đặt tên hàm trong JavaScript. Đó là bởi vì bạn nên xác định các chức năng sau: <name>_setup(team)
và <name>_getActions(gameInfo, botVars)
. Tiếp tục xuống trang, tồn tại các textareas cho userbot , bạn có thể chỉnh sửa để kiểm tra mã của mình.
<name>_setup(team)
Hàm này dành cho bạn để xác định bất kỳ biến nào bạn muốn duy trì. team
sẽ hoặc là "red"
hoặc "blue"
. Hàm này phải trả về một đối tượng. Xác định các biến như vậy:
var vars = {};
vars['example'] = "example";
return vars;
Đây vars
đối tượng sẽ được thông qua vào chức năng khác:
<name>_getActions(gameInfo, botVars)
botVars
là đối tượng được trả về bởi <name>_setup(team)
. gameInfo
là một đối tượng chứa các biến sau:
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
Bot của bạn có toàn quyền truy cập vào. Tôi khá chắc chắn rằng bạn có thể viết thư cho họ và không ảnh hưởng đến các biến ban đầu, nhưng dù sao thì đừng làm điều đó. Một lưu ý về các vòng quay: tàu chỉ theo hướng + y, hướng xuống dưới, do đó, bất cứ điều gì bạn muốn căn chỉnh với tàu cần phải được bù 90 độ. Ngoài ra, xoay tích cực là theo chiều kim đồng hồ.
Hàm này phải trả về một danh sách các chuỗi, thể hiện hành động của bot của bạn. Ví dụ , ["turn right","thrust"]
. Thông tin chi tiết về điều này nằm trong phần Quy tắc .
Chi tiết bổ sung
Bạn cũng có thể sử dụng những điều sau đây:
LineIntersection(L1, L2)
L1 và L2 là mảng hai phần tử của mảng hai phần tử. Đó là, L1 := [[x1,y1],[x2,y2]]
và L2 := [[u1,v1],[u2,v2]]
. Hàm này tính toán giao điểm của hai dòng và trả về điều này : [[x,y], [a,b]]
. [x,y]
là tọa độ của điểm giao nhau và [a,b]
là một cặp tỷ số biểu thị khoảng cách dọc theo mỗi đường của điểm giao nhau. Như trong, a = 0.25
có nghĩa là điểm giao nhau là một phần tư quãng đường từ [x1,y1]
đến [x2,y2]
, và tương tự như vậy cho b
. Nếu không có giao điểm, một mảng trống được trả về.
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]]
};
Đây là tọa độ của đa giác của tàu. Để làm cho tọa độ hiện tại dễ dàng hơn, bạn cũng có thể sử dụng ...
getShipCoords(<color>)
getShipCoords("red")
sẽ trả về tọa độ hiện tại của các đỉnh của tàu Red, và tương tự cho getShipCoords("blue")
và Blue. Các tọa độ này nằm trong một danh sách như vậy : [[x1,y1],[x2,y2],[x3,y3],...]
. Đa giác được đóng hoàn toàn, do đó, có một đường giữa cặp tọa độ đầu tiên và cuối cùng.
Bạn không được truy cập hoặc thay đổi bất kỳ biến hoặc chức năng nào khác được sử dụng bởi trò chơi / trang web. Và chắc chắn không đặt tên cho chức năng của bạn giống nhau. Tôi không thấy trước rằng đây sẽ là một vấn đề, nhưng nếu bot của bạn phá vỡ mã trò chơi, đó là một khả năng. Không có đăng nhập hoặc bắt ngoại lệ.
Chiến thắng
- Mỗi cặp bot sẽ được chơi ít nhất 10 lần, cả hai cách. (Vì vậy, tổng cộng ít nhất 20 trò chơi.)
- Nhằm mục đích để có tỷ lệ thắng / thua cao nhất nói chung . Nếu bot của bạn làm rất tốt với một bot khác, nhưng thua ba người kia, điều đó không tốt bằng chiến thắng trước hai và thua hai (như một quy tắc chung).
- Đối với mỗi bot, các tỷ lệ (thắng + 1) / (thua + 1) sẽ được tính toán, sau đó độ lệch trung bình và độ lệch chuẩn của các tỷ lệ này sẽ được tính. Một giá trị trung bình cao hơn sẽ có mức độ ưu tiên và trong trường hợp các phương tiện nằm trong 1 đơn vị của nhau, phương sai thấp hơn sẽ có mức độ ưu tiên.
- Ghi điểm sẽ bắt đầu hoặc trong một tuần kể từ hôm nay hoặc sau ba ngày không có bài nộp mới. Điều này là do đó tôi không phải lặp lại bất kỳ cặp bot nào.
Trên hết, hãy vui vẻ!
Bảng xếp hạng (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
Lưu ý: Điều này có thể thay đổi khi tôi chạy nhiều trò chơi hơn. Thêm vào đó, thứ tự xếp hạng 9-13 làm phiền tôi, vì vậy tôi có thể điều chỉnh phương pháp tính điểm để phù hợp hơn với trực giác của một người về cách họ nên được xếp hạng.
(Phương tiện và độ lệch chuẩn được làm tròn đến ba chữ số thập phân Ngoài ra,. Hyper
Nên HYPER
nhưng điều đó messes lên nổi bật:. P)
LineIntersection
các phân đoạn không giao nhau trả về một mảng trống.