Thách thức này được lấy cảm hứng từ @HelkaHomba 's thách thức tuyệt vời Red vs Blue - Pixel Đội Battlebots . Thử thách đó có lẽ là thử thách tốt nhất tôi từng thấy trên trang này. Không bao giờ.
Thử thách của tôi vẫn khác rất nhiều, nhưng @HelkaHomba xứng đáng nhận được sự truyền cảm hứng.
Tổng quan
Đây là một đội bóng vua , nơi đội của bạn chiến thắng bằng cách cho tất cả người chơi còn sống trong đội của bạn. Nói cách khác, đội đứng cuối chiến thắng. Vẽ sẽ được thực hiện lại.
Bạn đang ở trên một bảng. Bạn biết vị trí của bạn trên vòng đầu tiên (đánh dấu 0). Bạn cũng biết ai đang ở trong khu vực xung quanh bạn:
Trong trường hợp này, bạn chỉ có một mình (hoặc vì vậy bạn nghĩ) không có ai xung quanh bạn. Bạn có thể thấy các mục xung quanh trong đối số đầu tiên để ontick
xử lý. Tìm hiểu thêm về API sau.
Đội của bạn
Nhóm của bạn được xác định bởi ID người dùng của bạn. Để tìm ra điều đó, bấm vào hình ảnh hồ sơ của bạn:
Sau đó tìm ID người dùng của bạn trong thanh địa chỉ:
Nếu đó là số lẻ, bạn thuộc nhóm màu xanh.
Nếu là số chẵn, bạn thuộc nhóm màu đỏ.
Bạn được chào đón cho các vòng tròn vẽ tay.
Tên (bot) của bạn
Tên bot của bạn bắt đầu bằng chữ cái đầu tiên của nhóm của bạn ("r" hoặc "b"). Nó phải phù hợp với regex /^(r|b)[A-Za-z_-]$/
. Ngoài ra, bạn có thể chọn tên bot của bạn. Vui lòng không sử dụng một cái đã tồn tại.
Bắt đầu
Người chơi màu đỏ sẽ bắt đầu ở gần đầu bản đồ và màu xanh sẽ bắt đầu ở gần cuối. Bạn được cung cấp thông tin đặc biệt về đánh dấu (lượt) đầu tiên trong environment
tham số cho ontick
hàm. Tôi khuyên bạn nên lưu trữ đó. Xem API để biết chi tiết.
Đến lượt bạn
Thứ tự lần lượt được chọn ngẫu nhiên, nhưng sau đó giữ nguyên.
Biến hành động
Bạn chỉ có thể thực hiện một hành động mỗi lượt.
Di chuyển
Khi bạn muốn di chuyển, bạn gọi
this.move(num)
API.num
là ô bạn muốn chuyển đến:Vị trí tương đối của các số bạn có thể di chuyển đến được lưu trữ trong hằng số toàn cầu
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Nếu bạn di chuyển vào tường, hoặc người chơi khác, không có gì xảy ra.
Quay
Để xoay, bạn gọi
this.rotate(num)
. Num là hướng bạn muốn xoay:Xoay là tuyệt đối.
Giết chết
Nếu một người chơi khác (từ một đội khác) đang ở trong phòng giam mà bạn đang đối mặt, bạn có thể gọi
this.kill()
và giết họ. Nếu không có ai ở đó, hoặc họ ở trong đội của bạn, điều này không có gì. Thí dụ:Nếu bạn được chuyển sang
0
, bạn có thể giết màu xanh lá cây. Nếu bạn bị biến thành 1, bạn có thể giết màu xanh. Nếu bạn bị biến thành 2, bạn có thể giết chết cam. Nếu bạn bị biến thành 3, bạn có thể giết chết màu vàng.Bom
Ném bom giết chết tất cả người chơi bao gồm cả bạn và đồng đội trong 9 ô vuông xung quanh bạn. Thí dụ:
Tại sao bạn muốn làm điều này? Kamikaze . Nếu có nhiều người chơi không thuộc đội của bạn trong 9 ô xung quanh bạn thì có đội của bạn, bạn có thể cân nhắc ném bom. (Tôi đề nghị bạn thông báo cho đồng đội của mình trước!)
Đặt một quả mìn
Điều này tạo ra một hình vuông chết cho những người khác không thuộc nhóm của bạn. Khi bạn đặt một mỏ đất, bạn cũng di chuyển để bạn không bước lên nó. Bạn gọi
this.landMine(num)
nơi num là hình vuông bạn muốn đến. Thí dụ:Sau đó, bạn gọi
this.landMine(4)
:Thấy "M" không? Đó là một quả mìn. Những người khác có thể thấy nó ... bây giờ. Bất cứ ai, ngay cả những người không thuộc nhóm của bạn, đều có thể thấy một quả mìn trên tích tắc được đặt. Nhưng sau khi đánh dấu xong, không ai, thậm chí bạn không thể nhìn thấy nó. Nhưng nó sẽ phát nổ ngay khi kẻ thù bước qua nó. Thí dụ:
Blue di chuyển trên bom mìn của bạn và BÙM! Bạn vừa bị giết.
Cứ sau 2 lần giết bạn nhận được (từ giết trực tiếp hoặc khai thác trên mặt đất), bạn sẽ có thêm 1 quả mìn. Bạn cũng có được một khi bắt đầu.
Đào
Khi bạn đào, bạn tìm kiếm mìn trong khu vực 5x5 tập trung quanh bạn. Điều này không cho thấy đội bot đã đặt bom mìn. (Hãy nhớ rằng bạn không thể bị giết bởi một quả mìn được đặt bởi ai đó trong nhóm của bạn.) Ví dụ: nếu đây là lưới xung quanh bạn:
Sau đó, giá trị trả về
this.dig()
sẽ là:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
Các chỉ mục mảng là từ bắt đầu ở phía trên bên trái, đi bên phải, hơn là xuống, không bao gồm chính bạn:
Có tổng cộng 23 và vị trí tương đối của chúng được lưu trữ trong hằng số toàn cầu fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Lưu ý rằng đào cho thấy các mỏ được đặt trên bọ ve trước đó, không giống như aroundMe
.
Giao tiếp
Khi bạn muốn nói chuyện với ai đó, bạn gọi this.sendMessage(recipients, team, data)
. Dữ liệu có thể là bất cứ điều gì bạn muốn và bạn có thể gửi nó cho bất cứ ai bạn muốn, ngay cả những người chơi trong các đội khác. Điều này có thể được sử dụng để lừa các bot được lập trình kém, nhưng tất cả người chơi có thể biết ai đã gửi tin nhắn và nhóm của họ.
Thí dụ:
Gửi một cái gì đó đến một bot có tên là "redvdest":
this.sendMessage("redisbest", undefined, "Hi!");
Gửi một cái gì đó đến một bot có tên là "redvdest" và "blueiscool":
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
Gửi một cái gì đó cho toàn bộ đội đỏ
this.sendMessage(undefined, "red", {hello: "red"});
Gửi một cái gì đó cho mọi người
this.sendMessage(undefined, "*", {hello: "everyone"});
Gửi một cái gì đó cho toàn bộ đội màu đỏ và một bot có tên "blueiscool":
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
Mã của bạn phải bao gồm một lệnh gọi đến createBot
hàm. Không có gì khác. Mã mẫu:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(Bạn có thể tự do sao chép-dán này. Chỉ cần sửa đổi nó cho nhóm của bạn, v.v.)
Phương pháp
ontick(environment)
Được gọi khi đến lượt của bạn. Phải trả lại một
Promise
cái mà giải quyết trong 1 giây hoặc ít hơn nếu không nó sẽ bị bỏ qua. Điều này là vì lý do hiệu suất và có tác dụng phụ tốt đẹp của việc không có tab treo.this
(khi ở ontick)landMines
Bạn còn lại bao nhiêu mỏ đất. Bạn càng giết nhiều, bạn càng nhận được nhiều mỏ đất. Cứ 2 bot bạn giết, bạn sẽ có thêm 1 quả mìn. Bạn cũng nhận được 1 để bắt đầu.direction
Hướng bạn đang đối mặt.storage
Lưu trữ vẫn tồn tại giữa các cuộc gọi đếnonTick
vàonMessage
. Một đối tượng trống khi bắt đầu. Sửa đổi cho bất kỳ mục đích nào, nhưng đảm bảo rằng đó là một mảng hoặc đối tượng luôn luôn để đảm bảo nó tồn tại chính xác.move(num)
Di chuyển đến vị trí được chỉ định. Không có gì nếu không hợp lệ. Xem ở trên để biết chi tiết.rotate(num)
Xoay đến vị trí đã chỉ định. Không có gì nếu không hợp lệ. Xem ở trên để biết chi tiết.kill()
Giết người chơi mà bạn đang đối mặt, nếu tồn tại và không thuộc về đội của bạn. Xem ở trên để biết chi tiết.bomb()
Giết bất cứ ai trong 9 ô vuông xung quanh bạn, bao gồm cả chính bạn.landMine(num)
Đặt một mỏ đất nơi bạn đang ở, và sau đó di chuyển đến vị trí được chỉ định. Không có gì nếu không hợp lệnum
hoặc bạn không còn lại. Xem ở trên để biết chi tiết.dig()
Mới! Trả về một mảng thông tin về các quả mìn trong khu vực 5x5 tập trung quanh bạn. Xem ở trên để biết chi tiết.sendMessage(recipients, team, data)
recipients
có thể là một bot đơn (chuỗi), một mảng bot hoặcundefined
/null
. Đó là người bạn muốn gửi tin nhắn.team
là một chuỗi của nhóm bạn muốn gửi tin nhắn. Sử dụng"*"
để gửi tin nhắn cho mọi người.data
là bất cứ điều gì có thể được truyền cho hàm JS. Nó được gửi đến người nhận. Nếu nó là một đối tượng hoặc mảng, nó được truyền bằng tham chiếu , vì vậy bạn và người nhận có thể lưu nó vàostorage
đối tượng của họ và mọi sửa đổi đối với ảnh hưởng đến cả hai bản sao của bot. Lưu ý rằng người nhận có trong cả hai danh sách các chương trình, bot chính xác theo quy định tại chuỗi, hoặc một bot trong nhóm mà bạn chỉ định, nó sẽ nhận được thông báo.
environment
Trên đánh dấu đầu tiên
x
: Vị trí x của người chơi của bạny
: Vị trí y của người chơi của bạngridWidth
: Chiều rộng của lưới (trong các ô)gridHeight
: Chiều cao của lưới (trong các ô)Trên tất cả các dấu tick
aroundMe
: Một loạt người chơi và bom mìn. Các cầu thủ là những đối tượng trông giống như{name: "bot name", team: "bot team"}
, và các quả mìn là{team: "team of bot who placed mine"}
. Các chỉ mục của mảng:Lưu ý rằng mìn được đặt trên một đánh dấu khác với hiện tại sẽ không được hiển thị.
aroundMe
thí dụ:Giả sử đây là lưới (bạn màu đỏ):
Bạn
aroundMe
sẽ trông như thế này:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
Các chỉ mục của mảng được giải thích ở đây:
Bot của bạn thấy hiệu quả điều này:
onmessage(data, fromBot, fromTeam)
this
(khi đang hoạt động)sendMessage(recipients, team, data)
Chức năng gửi tin nhắn tiêu chuẩn.storage
Lưu trữ tiêu chuẩn.
data
Dữ liệu được gửi từ người gửi.fromPlayer
Người chơi tin nhắn được gửi từ.fromTeam
Nhóm tin nhắn được gửi từ.onkill()
this
(khi ở trên)sendMessage(recipients, team, data)
Chức năng gửi tin nhắn tiêu chuẩn.
Mảng toàn cầu thuận tiện (không đổi):
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Hữu ích cho việc truyền dữ liệu đến chức năng di chuyển cũng như diễn giải aroundMe
. Xem ở trên.
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Hữu ích cho các this.dig()
chức năng trong ontick
xử lý.
Hãy thử nó!
Bộ điều khiển sẽ được chạy từ máy của tôi trên localhost vì lý do hiệu suất, nhưng bạn có thể sử dụng CodePen để kiểm tra bot của mình.
Lưu ý rằng bạn phải dán mã của mình vào bảng điều khiển và nhấn Enter
trước khi nhấp vào chạy. Bạn có thể dán vào bao nhiêu bot tùy thích. "Bot thử nghiệm" là ví dụ để bạn kiểm tra. Nếu bạn có thể đánh bại hoặc trói tất cả bọn chúng, bạn có ít nhất một bot tốt.
Đệ trình
Quy tắc
Các quy tắc (được thực thi bởi bộ điều khiển)
ontick
Mã chính của bạn không được mất hơn 1 giây. Chúng tôi không muốn vòng đấu mãi mãi. Nếu mã của bạn mất> 1 giây, nó sẽ bị dừng.- Nếu bạn cố gắng thực hiện nhiều hơn 1 hành động mỗi lượt hoặc thực hiện một hành động không hợp lệ (ví dụ:
this.move(-1)
hoặc di chuyển vào tường), nó sẽ bị bỏ qua. - Nhiều hơn nữa có thể đến sớm ...
Các quy tắc (do tôi thi hành, có thể dẫn đến DQ)
- Đừng viết các biến toàn cục ( đọc là tốt ).
- Mã của bạn phải hoạt động trong Nodejs (trong trường hợp bộ điều khiển được chuyển sang Nodejs), vậy
JSON.parse(...)
là tốt, nhưngalert()
không phải. - Bạn không được phép gọi
createBot
hoặc can thiệp vào bộ điều khiển bằng mọi cách . - Không sử dụng mã của người khác mà không được phép và thay đổi đáng kể. Không có bản sao.
- Xin vui lòng, không có sơ hở!
- Nhiều hơn nữa có thể đến sớm ...
Bot của tôi
Dưới đây là một số bot:
Bot này chọn ngẫu nhiên một hành động. Vâng, đó là một ngẫu nhiên có trọng số, nhưng vẫn khá ngẫu nhiên. Nếu bạn có thể giết bot này (cuối cùng nó sẽ tự giết, điều đó không được tính), thì ít nhất bạn có một bot tốt. Đăng nó và xem những gì xảy ra!
Các bot của tôi có tên bắt đầu bằng "x" và một nhóm "không". Bạn được hoan nghênh sử dụng một số mã này, nhưng vui lòng thực hiện ít nhất một số sửa đổi. Nếu bạn không thể bị làm phiền ít nhất là điều chỉnh một số, bạn sẽ không thắng.
Định dạng bài nộp của bạn
Vui lòng sử dụng định dạng này:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
Yêu cầu tính năng, lỗi, câu hỏi, vv?
Bình luận dưới đây! Vui lòng kiểm tra xem đã có một bình luận với điều đó. Nếu đã có, hãy nâng cấp nó.
Bạn muốn nói chuyện với nhóm của bạn?
Sử dụng các phòng chat cho màu đỏ và màu xanh .
Ngôn ngữ
Hiện tại, chỉ có JS và một cái gì đó biên dịch thành JS được hỗ trợ, nhưng nếu bạn biết cách để các ngôn ngữ khác hoạt động với Nodejs, tôi sẽ rất vui khi chuyển bộ điều khiển sang Nodejs.
Ghi chú cuối cùng
Ý tưởng chiến lược
Giúp đội của bạn! Tạo một bot được thiết kế để giúp một bot khác và làm việc cùng nhau. Chiến lược này hoạt động tốt cho Red vs. Blue - Pixel Team Battlebots
Người tìm kiếm đại diện
Tôi sẽ chấp nhận câu trả lời được bình chọn cao nhất trong đội chiến thắng. Hãy nhớ rằng các câu trả lời trước có xu hướng nhận được nhiều phiếu hơn, nhưng điểm yếu của chúng có nhiều khả năng được tìm thấy và khai thác.
Ngoài ra, nếu bạn trả lời sớm, bạn có thể nhận được tiền thưởng +100.