Đội bóng đồi!


27

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 , 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:

Một hình vuông màu đỏ duy nhất trong lưới 9x9, được bao quanh bởi các ô màu trắng.

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 để ontickxử 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:

Hình ảnh cá nhân của tôi

Sau đó tìm ID người dùng của bạn trong thanh địa chỉ:

Đó là giữa / users / và / yourusername

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 environmenttham số cho ontickhà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. numlà ô bạn muốn chuyển đến:

    0 là trên cùng bên trái, 1 là giữa trên cùng, 2 là trên cùng bên phải, 3 là giữa bên phải, 4 là giữa bên trái, 5 là dưới cùng bên trái, 6 là dưới cùng giữa và 7 là dưới cùng bên phải.

    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:

    0 là trên cùng, 1 là phải, 2 là xuống và 3 là trái

    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ụ:

    Các số giống như trên, ô 0 có màu xanh lá cây, 1 là màu xanh lam, 2 là màu cam và 3 là màu vàng

    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ụ:

    Có một lưới 9x9 với "x" s trong mỗi ô.

    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ụ:

    Một hình vuông màu đỏ duy nhất trong lưới 9x9, được bao quanh bởi các ô màu trắng.

    Sau đó, bạn gọi this.landMine(4):

    [Lưới 9x9, có chữ "M" màu đỏ ở giữa và ô màu đỏ ở giữa bên phải.

    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ụ:

    Hai lưới 9x9, một ô màu xanh ở giữa bên trái ở ô thứ nhất, chữ "M" màu đỏ ở giữa ô thứ nhất, chữ "x" màu đỏ ở giữa ô thứ hai và một mũi tên nằm giữa chúng.

    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 createBothà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 Promisecá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 đến onTickonMessage. 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ệ numhoặ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) recipientscó thể là một bot đơn (chuỗi), một mảng bot hoặc undefined/ null. Đó là người bạn muốn gửi tin nhắn. teamlà 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. datalà 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ào storageđố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ạn
  • y: Vị trí y của người chơi của bạn
  • gridWidth: 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:

    0 là trên cùng bên trái, 1 là giữa trên cùng, 2 là trên cùng bên phải, 3 là giữa bên phải, 4 là giữa bên trái, 5 là dưới cùng bên trái, 6 là dưới cùng giữa và 7 là dưới cùng bên phải.

    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 đỏ):

    Lưới 9x9, với màu xanh nhạt ở phía trên bên trái, chữ "M" màu xám ở phía trên bên phải, màu đỏ ở giữa, màu vàng ở giữa bên trái và chữ "M" màu đỏ ở phía dưới bên trái.

    Bạn aroundMesẽ 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:

0 là trên cùng bên trái, 1 là giữa trên cùng, 2 là trên cùng bên phải, 3 là giữa bên phải, 4 là giữa bên trái, 5 là dưới cùng bên trái, 6 là dưới cùng giữa và 7 là dưới cùng bên phải.

Bot của bạn thấy hiệu quả điều này:

Một hộp màu xanh nhạt ở phía trên bên trái có số 0 màu đen trong đó, hộp màu vàng ở cạnh trái có số 4 màu đen trong đó và chữ "M" màu đỏ ở phía dưới bên trái có 5 màu đen trên đó.

  • 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.

    dataDữ liệu được gửi từ người gửi. fromPlayerNgười chơi tin nhắn được gửi từ. fromTeamNhó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 ontickxử 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 Entertrướ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)

  • ontickMã 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ưng alert()không phải.
  • Bạn không được phép gọi createBothoặ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 đỏ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.


1
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Tôi có thể tạo nhiều hơn một bot không? (xin lỗi, tôi biết cuộc trò chuyện đã được chuyển đi, tôi chỉ là người trò chuyện nên vâng)
Matthew Roh

@SIGSEGV có, nhưng người khác phải đăng nó. Bạn có thể đăng một bot và đưa mã của người khác cho ai đó trong nhóm của bạn, nhưng bạn không thể đăng hai lần.
lập trình

Về định vị, ô được đặt ở đâu [0, 0], đây có phải là ô trên cùng bên trái không? Ngoài ra, nhắn tin có tiêu thụ hành động của bạn (mỗi lượt) không? Cảm ơn.
Thrax

@Thrax có, và không. Bạn thậm chí có thể nhắn tin để đáp lại một tin nhắn.
lập trình

Câu trả lời:


7

xscared (không cạnh tranh)

createBot({
    ontick: function(environment) {
        var reverse = [0, 1, 2, 3, 4, 5, 6, 7].reverse();
        return new Promise((resolve, reject)=>{
            (this.aroundMe || []).forEach((item,idx)=>{
                this.move(reverse[idx]);
                return resolve();
            });
            this.move(~~(Math.random() * 8));
            return resolve();
        });
    },
    onmessage: function() {
    },
    team: "none",
    name: "xscared",
    onkill: function(){
    }
});

Rất sợ mọi người. Đi từ người đầu tiên (hoặc bom mìn) mà nó nhìn thấy. Nếu không, nó di chuyển ngẫu nhiên. Lưu ý rằng đây không phải là cạnh tranh, chỉ là một ví dụ. Hãy cố gắng để đánh bại nó!


6

sao lưu, một bot xanh

Như đã cảnh báo trong trò chuyện, tôi chưa bao giờ viết bất cứ điều gì bằng javascript trong cuộc sống của mình, vì vậy nếu bạn tìm thấy bất kỳ sai lầm nào, xin vui lòng cho tôi biết! (Cảm ơn @ lập trình5000 đã giúp tôi với nó)
Khái niệm về bot này là nó giao tiếp với các bot khác trong cùng một nhóm và gửi cho họ vị trí của nó cùng với bản đồ của các mỏ mà nó tìm thấy. Nó cố gắng tham gia bot xanh gần nhất (nếu ai đó gửi dữ liệu vị trí của nó [được đưa ra dưới dạng [x, y]] và ở gần nó (quay lưng lại càng nhiều càng tốt), giết chết các bot đỏ hoặc tìm kiếm phía trước cho các mỏ.

createBot({
    team: 'blue',
    name: 'backup',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

Hey Bạn quan tâm nếu tôi cũng nhập cái này nhưng (với tên khác) Tôi cũng ở trên màu xanh
Christopher

@Christopher Không tôi không phiền, nhưng điều đó sẽ thú vị hơn một chút cho bạn và cho nhóm nếu bạn tạo một ít nhất một chút khác nhau (ít nhất là để bổ sung cho 2 bot đã tồn tại).
plannapus

Sẽ làm điều đó. Tôi sẽ thay đổi nó
Christopher

Nếu tôi cố chạy bot của bạn trong codepen thì nó không hoạt động vì bạn đang sử dụng this.xvà cứ thế nhưng environment.xtôi có sai không?
WasteD

@WasteD như tôi đã nói tôi hoàn toàn không biết Javascript, vì vậy điều đó là có thể. Nhưng nếu đó là trường hợp thì tôi đoán nó cũng nên environment.gridHeightenvironment.aroundMe? Trong trường hợp đó thì các bot khác không nên hoạt động kể từ khi chúng sử dụng this.aroundMe.
plannapus

5

Màu xanh, màu xanh, thế giới của tôi là màu xanh

createBot({
    team: 'blue',
    name: 'blue-blue-my-world-is-blue',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            var red = 0;
            // See who's around me
            (this.aroundMe || []).forEach((item, idx) => {
                if (item && item.team == 'red') red++;
            });
            // If surrounded, take one for the team
            if (red >= 6) this.bomb();
            else {
                // Translate direction into position
                var kill = [1, 4, 6, 3][this.direction];
                // Random values
                var move = Math.floor(Math.random() * 8);
                var nsew = Math.floor(Math.random() * 4);
                // Lay a landmine if possible
                if (this.landMines) this.landMine(move);
                // Kill if someone is in the way
                else if (this.aroundMe && this.aroundMe[kill] && this.aroundMe[kill].team == 'red' && this.aroundMe[kill].name) this.kill();
                else {
                    // Move somewhere if already in the requested direction
                    if (nsew == this.direction) this.move(move);
                    // Otherwise just rotate to the requested direction
                    else this.rotate(nsew);
                }
            }
            resolve();
        });
    },
    onmessage: function(data, from, fromBot) {},
    onkill: function() {}
});

Chủ yếu là ngẫu nhiên, nhưng sẽ đánh bom nếu bị bao vây, và ưu tiên kiểm tra xung quanh và giết chết khi di chuyển.


Thông minh! Đẹp một.
lập trình

3
Nghe đây, đây là một câu chuyện, về một chàng trai nhỏ sống trong một thế giới màu xanh.
Matthew Roh

3

Thư giãn-Bomber

Bot này tìm kiếm một vị trí có ít nhất 1 ô miễn phí ở mỗi bên sau đó trồng một mỏ. Nó cắm trại trên đó cho đến khi kẻ thù đến gần. Khi ai đó đến gần, anh ta sẽ lùi lại trên mỏ của mình để mồi bot khác trên đó. Anh ta cũng sẽ xoay và giết nếu cần. Khi anh ta không còn của tôi, anh ta sẽ tìm nơi ẩn náu ở góc trên bên trái, quay lưng vào tường và trả thù nếu anh ta bị đe dọa.

Không có trò chơi nhóm đặc biệt nào ở đây, ngoài việc phát sóng vị trí của mình cho đội của mình bằng selftừ khóa.

createBot({
    team: 'red',
    name: 'relaxed-bomber',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            if (typeof this.storage['dropped'] == "undefined") {
                this.storage['dropped'] = false;
                this.storage['covered'] = false;
                this.storage['baited'] = false;
            }
            if (typeof environment.x != "undefined" && typeof environment.y != "undefined") {
                this.storage['pos'] = [environment.x, environment.y];
            }
            if (typeof environment.gridWidth != "undefined" && typeof environment.gridHeight != "undefined") {
                this.storage['grid'] = [environment.gridWidth, environment.gridHeight];
            }
            var x = this.storage['pos'][0];
            var y = this.storage['pos'][1];
            var x0 = this.storage['grid'][0];
            var y0 = this.storage['grid'][1];
            var source = [1, 4, 6, 3];
            var dest = [6, 3, 1, 4];
            var rot = [0, 1, 2, 3];
            var movex = [-1, 0, 1, -1, 1, -1, 0, 1];
            var movey = [-1, -1, -1, 0, 0, 1, 1, 1];
            var action = false;
            if (this.landMines > 0) { 
                var move = [false, false, false, false];
                var moveIndex = -1;
                if (x <= 0) { move[1] = true; }
                if (x >= x0 - 1) { move[3] = true; }
                if (y <= 0) { move[2] = true; }
                if (y >= y0 - 1) { move[0] = true; }    
                if (move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 0; }
                if (move[0] && !move[1] && !move[2] && !move[3]) { moveIndex = 1; }
                if (move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 2; }
                if (!move[0] && !move[1] && !move[2] && move[3]) { moveIndex = 3; }
                if (!move[0] && move[1] && !move[2] && !move[3]) { moveIndex = 4; }
                if (!move[0] && !move[1] && move[2] && move[3]) { moveIndex = 5; }
                if (!move[0] && !move[1] && move[2] && !move[3]) { moveIndex = 6; }
                if (!move[0] && move[1] && move[2] && !move[3]) { moveIndex = 7; }  
                if (moveIndex >= 0) {
                    this.storage['pos'] = [ x + movex[moveIndex], y + movey[moveIndex]];
                    this.move(moveIndex);
                } else {
                    this.storage['dropped'] = true;
                    this.storage['covered'] = false;
                    this.landMine(1);
                }
            } else {
                if (this.storage['dropped']) {
                    this.storage['dropped'] = false;
                    this.storage['covered'] = true;
                    this.storage['pos'] = [ x + movex[6], y + movey[6]];
                    this.move(6);
                } else if (this.storage['covered']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            this.storage['covered'] = false;
                            this.storage['baited'] = true;
                            this.storage['mine'] = this.storage['pos'].slice();
                            this.storage['reverse'] = source[dest[i]];
                            this.storage['pos'] = [ x + movex[dest[i]], y + movey[dest[i]]];
                            this.move(dest[i]);
                            action = true;
                        }
                    }
                    if (!action) {
                        this.dig();
                    }
                } else if (this.storage['baited']) {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (this.storage['mine'][0] == this.storage['pos'][0] && this.storage['mine'][1] == this.storage['pos'][1]) {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = source[this.storage['reverse']];
                        } else {
                            this.storage['pos'] = [ x + movex[this.storage['reverse']], y + movey[this.storage['reverse']]];
                            this.move(this.storage['reverse']);
                            this.storage['reverse'] = dest[this.storage['reverse']];
                        }
                    }
                } else {
                    for (var i = 0; i < source.length; i++) {
                        if (typeof environment.aroundMe[source[i]] != "undefined" && typeof environment.aroundMe[source[i]].team != "undefined" && environment.aroundMe[source[i]].team == "blue" && typeof environment.aroundMe[source[i]].name != "undefined") {
                            if (this.direction == rot[source[i]]) {
                                this.kill();
                                this.storage['baited'] = false;
                                action = true;
                            } else {
                                this.rotate(rot[source[i]]);
                                action = true;
                            }
                        }
                    }
                    if (!action) {
                        if (x > 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[0], y + movey[0]];
                            this.move(0);
                        } else if (x > 0 && y == 0) {
                            this.storage['pos'] = [ x + movex[3], y + movey[3]];
                            this.move(3);
                        } else if (x == 0 && y > 0) {
                            this.storage['pos'] = [ x + movex[1], y + movey[1]];
                            this.move(1);
                        } else {
                            this.rotate(1);
                        }
                    }
                }
            }
            this.sendMessage(undefined, "red", {'self': this.storage['pos'] });
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {},
    onkill: function() {}
});

Bạn thuộc đội nào?
lập trình

@ lập trình5000 Vì tên của các bot phải bắt đầu bằng chữ cái của đội, tôi đoán tôi là Đội Đỏ :)
Thrax

Bot đẹp quá Tôi đề nghị bạn brodcast những gì xung quanh bạn cho nhóm của bạn, quá.
lập trình

1

Sao lưu 1 bot xanh khác (quên làm điều này sớm hơn)

createBot({
    team: 'blue',
    name: 'backup1',
    ontick: function(environment) {
        return new Promise((resolve, reject) => {
            //if (typeof this.x != "undefined") this.storage['position'] = [this.x, this.y];
            if (typeof environment.x != "undefined") this.storage['position'] = [environment.x, environment.y]; //Modified according to @WasteD
            if (typeof this.storage['map'] == "undefined") { //Create empty map
                var map = [[]];
                //for(i=0;i<this.gridHeight;i++) map[i]=[];
                for(i=0;i<environment.gridHeight;i++) map[i]=[]; //Modified according to @WasteD
                this.storage['map'] = map;
            }
            var blue = []
            var red = []
            var x = this.storage['position'][0];
            var y = this.storage['position'][1];
            var dx = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
            var dy = [1, 1, 1, 0, 0, 0, -1, -1, -1]
            (this.aroundMe || []).forEach((item, idx) => { // Update map and list positions of surrounding blues and reds
                if (item && item.team == 'red' && typeof item.name != "undefined") red += idx;
                if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx[idx]][y+dy[idx]] = 'M';
                if (item && item.team == 'blue' && typeof item.name != "undefined") blue += idx;
            });
            this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']}); //Send to buddies my position and the map
            if (red.indexOf([1, 4, 6, 3][this.direction]) > -1) this.kill() ; //If red guy is in front of
            else if (red.indexOf([1,4,6,3]) > -1) this.rotate(red.indexOf([1,4,6,3])); //If red guy is next but not in front of
            else if (blue.indexOf(3) > -1){ //If blue buddy on the left
                if (blue.indexOf(4) > -1){ //If another one is on the right
                    if (blue.indexOf(1) > -1 && this.direction != 2) this.rotate(2); //...and a third one at the top
                    else var digging = this.dig();
                    }
                else if (this.direction != 1) this.rotate(1);
                else var digging = this.dig();
            }
            else if (blue.indexOf(1) > -1){
                if (blue.indexOf(6) > -1 && this.direction != 3) this.rotate(3);
                else if (this.direction != 2) this.rotate(2);
                else var digging = this.dig();
            }
            else if (blue.indexOf(4) > -1){
                if (this.direction != 3) this.rotate(3);
                else var digging = this.dig();
            }
            else if (blue.indexOf(6) > -1 && this.direction != 0) this.rotate(0);
            else if (blue.indexOf([0,2]) > -1){ //If no blue next to me but one in diagonal, move next
                this.move(1);
                this.storage['position'][1] = y+1; //Update position
            }
            else if (blue.indexOf([5,7]) > -1){
                this.move(6);
                this.storage['position'][1] = y-1;
            }
            else if (typeof this.storage['other_blue'] != "undefined"){ //Check if buddies said where they were, try to go near the closest one
                var dmin = 99999;
                var pos = []
                (this.storage['other_blue'] || {}).forEach((item, idx) => {
                    var d = Math.sqrt(Math.pow(item['position'][0]-x,2) + Math.pow(item['position'][1]-y,2));
                    if (d < dmin){
                        dmin = d;
                        pos = item['position'];
                        }
                });
                if (pos[0]-x > 0){
                    this.move(4);
                    this.storage['position'][0] = x+1
                }
                else if (pos[0] < 0){
                    this.move(3);
                    this.storage['position'][0] = x-1
                }
                else if (pos[1] > 0){
                    this.move(1);
                    this.storage['position'][1] = y+1
                }
                else{
                    this.move(6);
                    this.storage['position'][1] = y-1
                }
            }
            else var digging = this.dig();
            if (typeof digging != "undefined"){ //Check out surroundings if dig() was played and update the map accordingly
                var dx2 = [-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,0,1,2];
                var dy2 = [2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2];
                (digging || []).forEach((item, idx) => {
                    //if (item && item.team == 'red' && typeof item.name == "undefined") this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M';
                    if (item) this.storage['map'][x+dx2[idx]][y+dy2[idx]] = 'M'; //previously misread what dig() returned
                });
            }
            resolve();
        });
    },
    onmessage: function(data, fromTeam, fromBot) {
        if (typeof data['position'] != "undefined" && fromTeam == 'blue') { //If position sent by a blue bot
            if (typeof this.storage['other_blue'] == "undefined") this.storage['other_blue'] = [];
            for (i in this.storage['other_blue']){
                var found = false;
                if ('name' in i){
                    if (i['name'] == fromBot){
                        i['position'] = data['position'];
                        found = true; //Update if position already known from previous ticks
                        }
                }
            }
            if (!found) this.storage['other_blue'] += {'position':data['position'], 'name':fromBot}; //Add position if previously unknown
            this.sendMessage(fromBot, undefined, "roger.");
        }
    },
    onkill: function() {this.sendMessage(undefined, "blue", {"position": this.storage['position'], 'map': this.storage['map']});}
});

1

Máy bay chiến đấu màu xanh

createBot({
  team: "blue",
  name: "blue-fighter",
  ontick: function(environment) {
    return new Promise((resolve, reject)=>{
      let map = environment.aroundMe;
      let sides = [1, 4, 6, 3];
      let facing = sides[this.direction];
      let isTeam = (team,a) => a && a.team === team;
      let isRed = (a)=>isTeam("red",a);
      let isBlue = (a)=>isTeam("blue",a);
      let randomSquare = ()=>Math.floor(Math.random()*8);
      let redNum = map.filter(isRed).length;
      let blueNum =  map.filter(isBlue).length;
      if(redNum > blueNum && redNum > 2){
        this.bomb();
      }else if(isRed(map[facing])){
        this.kill();
      }else if(sides.includes(map.findIndex(isRed))){
        this.rotate(sides.indexOf(map.findIndex(isRed)));
      }else if(Math.random() < 0.5 && this.landMines > 0){
        this.landMine(randomSquare());
      }else{            
        this.move(randomSquare());
      }
      resolve();
    });
  },
  onmessage: function(data, from, fromBot) {},
  onkill: function(){}
});

Máy bay chiến đấu màu xanh di chuyển và bom mìn ngẫu nhiên và xoay về phía người chơi màu đỏ. Nếu các khối xung quanh có nhiều màu đỏ hơn màu xanh, nó sẽ đánh bom. Nếu nó đối mặt với một người chơi màu đỏ, nó sẽ giết chết nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.