Mã Bots 4: Lập trình chức năng


25

sheesh, đây thực sự là thứ 4? Đối với tất cả những người cũ của bạn, thách thức cốt lõi là như nhau, nhưng chúng tôi đang sử dụng Java thay vì ngôn ngữ tùy chỉnh. Dưới đây là ba thử thách CodeBot trước đây , trong trường hợp bạn quan tâm.

Mục tiêu của CodeBots là làm cho bot của bạn càng lan truyền càng tốt . Mỗi bot mang một Cờ và bạn cần đảm bảo rằng Cờ của bạn ở khắp mọi nơi .

API

Bots sẽ tuân theo một "giao thức" được tiêu chuẩn hóa và các bot tiến hành thông qua các bước sau một cách đồng bộ:

  1. IPAddress selectMessageRecipient() cho phép bot chọn người mà anh ta muốn gửi tin nhắn "thân thiện" tới.
  2. Message sendMessage() cho phép một bot chọn nội dung của tin nhắn mà anh ta sẽ gửi.
  3. processMessage(IPAddress, Message) được gọi cho mỗi tin nhắn mà bot nhận được.
  4. FunctionType selectFunctionToBlock()chặn chức năng bị ghi đè cho lượt hiện tại. Xem bước 7.
  5. IPAddress selectAttackTarget()cho phép một bot chọn người mà anh ta muốn DDOS. Một cuộc tấn công DDOS thành công nếu bot được nhắm mục tiêu bởi 3 bot cùng một lúc. Nếu một cuộc tấn công thành công, thì mỗi kẻ tấn công có thể thực hiện bước 6 và 7.
  6. readData(ReadonlyBot) cho phép một bot đọc dữ liệu được lưu trữ trên bot dễ bị tổn thương.
  7. FunctionType selectFunctionToReplace()là mấu chốt của thử thách này . Bạn được phép chọn 1 chức năng (trong số 8 chức năng được liệt kê ở đây) để sao chép từ bot của bạn sang bot của họ. Sau đó, chức năng của bạn sẽ được gọi thay vì của họ . Nếu nhiều bot chọn cùng một chức năng, một ngẫu nhiên sẽ thành công.
  8. String getFlag()được gọi vào cuối trò chơi và sẽ trả về một chuỗi duy nhất cho trình của bạn. Hàm của bạn sẽ luôn trả về cùng một chuỗi. Bài nộp có nhiều cờ nhất vào cuối trò chơi sẽ thắng.

Lưu trữ

Bạn có 3 hình thức lưu trữ, một Sổ địa chỉ , Nhật kýBiến . Các hình thức lưu trữ này là cục bộ cho bot mà chức năng của bạn đang chạy (vì vậy nếu chức năng của bạn được sao chép, nội dung của từng đối tượng này sẽ khác nhau). Tất cả các đối tượng này có thể được sửa đổi hoặc xóa bằng tay. Để có được các đối tượng này, bạn có một getter trong lớp của bạn (ví dụ getLog()).

Các AddressBook lưu trữ một danh sách các IPAddress , mỗi một AddressType , cho phép bạn phân loại các loại khác nhau của địa chỉ. Sổ địa chỉ sẽ luôn chứa ít nhất 1 địa chỉ (nếu nó bị xóa, một địa chỉ ngẫu nhiên sẽ được thêm vào). Xóa sổ địa chỉ của bạn để có được nhiều IPAddresses không được phép.

Các Log lưu trữ một danh sách của tất cả các hành động được thực hiện, cũng như dữ liệu về hành động. Nó cũng bao gồm lịch sử của tất cả các cuộc tấn công thành công (mặc dù bạn không biết chúng ghi đè chức năng nào)

Các biến đối tượng cho phép bạn lưu trữ các biến chuỗi gắn liền với một tên chuỗi. Khi bắt đầu trò chơi, Biến sẽ chứa một biến duy nhất IDchứa ID được tạo ngẫu nhiên duy nhất cho loại bot của bạn.

Bạn cũng có các chức năng truy cập khác:

  • int getTurnNumber() trả về một số nguyên với lượt hiện tại
  • bool functionsMatch(ReadonlyBot, FunctionType) kiểm tra xem chức năng của ReadonlyBot có khớp với chức năng của bạn không
  • IPAddress personalAddress() trả về địa chỉ IPA của bạn

Cách thực hiện

  • Bạn có thể lấy mã từ Github
  • Thêm bot của bạn vào \botsthư mục, sau đó thêm một tham chiếu đến bot của bạn trongcontroller\CodeBotFactory.java
  • Bot của bạn phải mở rộng codebots.bot.CodeBothoặccodebots.bots.DefaultCodeBot
  • Bạn cần Java 8 nếu bạn muốn chạy bộ điều khiển.
  • Bạn có thể chạy mã (giả sử bạn đang ở trong /srcthư mục) bằng cách sử dụng javac codebots\*.javađể biên dịch, sau đó java codebots.Mainchạy.
  • Bạn có thể không có bất kỳ biến thành viên không cố định nào trong lớp của bạn
  • Phản xạ không được phép.
  • Các hình thức giao tiếp giữa các bot (cùng loại hoặc khác loại) bên ngoài các phương pháp được liệt kê ở trên không được phép.
  • Các bot câm và / hoặc Suicidal được cho phép, nhưng tất cả các bot nên có chức năng khác với các mục hiện có.
  • Nếu bạn muốn sự ngẫu nhiên trong bot của bạn, hãy sử dụng getRandom()
  • Hãy cố gắng để giữ cho mã của bạn hiệu quả. Tôi đã dành rất nhiều thời gian để lập hồ sơ và làm cho bộ điều khiển nhanh.

Điểm số

105,2501 Expelliarmus!
104,5804 Tôi đang giúp!
104,2746 Tôi là ai?
103,8529 Bot Dumb
103.2028 Người thay thế
102,7045 Chaos
102,4046 Hermit Bot
102.2849 Swarmer
100.5598 Bot ngẫu nhiên yêu bạn
99.966 Tin tưởng vào niềm tin!
99,0185 codebots.bots.DefaultCodeBot
91,2942 codebots.bots.MarkedBot
91.1423 Chỉ cần robot giao hàng thư thân thiện của bạn.
89,4645 null


Bạn có lẽ nên làm cho Log.LogEntry cuối cùng, với nó không phải là cuối cùng tôi có thể tạo nhật ký với bất kỳ thông tin nào tôi muốn ... chỉ có chức năng bot của tôi mới có thể đọc hoặc tạo.
TheNumberOne

ReadData có thể truy cập IpAddress của bot mà nó đang đọc không?
TheNumberOne

@TheNumberOne hiện tại không, nhưng tôi không hiểu tại sao không. Tôi không có mã cho tôi ngay bây giờ, nhưng tôi sẽ cập nhật mã để thay đổi.
Nathan Merrill

3
Tôi thấy thú vị khi Chaos làm cho các vị trí giao dịch của DisarmBot và MarkedBot trong ban lãnh đạo.
TheNumberOne

1
Hiện tại trên vòng 7850 trên 10000, nhận được điểm số chính xác hơn ...
LegionMammal978

Câu trả lời:


4

Quỹ tín thác

Nếu bạn gửi cho anh ấy một tin nhắn, anh ấy sẽ làm những gì nó nói. Nếu anh ta đọc một bot, anh ta sẽ sao chép địa chỉ trực tiếp vào cuốn sách của mình. Anh ta tấn công các bot mà sổ địa chỉ nói để tấn công.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;
import java.util.*;

public class TrustBot extends CodeBot {
    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        AddressBook book = getAddressBook();
        return new Message(Message.MessageType.INFORM, book.getAddress(getRandom().nextInt(book.size())));
    }

    @Override
    public void processMessage(IPAddress s, Message m) {
        AddressBook book = getAddressBook();
        if(m.getAddress() != null){
            if(m.getType() == Message.MessageType.ATTACK){
                book.add(m.getAddress(), AddressBook.AddressType.TO_ATTACK);
            }
            else if(m.getType() == Message.MessageType.HELP){
                book.add(m.getAddress(), AddressBook.AddressType.TO_DEFEND);
            }
            else if(m.getType() == Message.MessageType.CONFIRM){
                book.add(m.getAddress(), AddressBook.AddressType.TRUSTED);
            }
            else if(m.getType() == Message.MessageType.REJECT){
                book.add(m.getAddress(), AddressBook.AddressType.UNTRUSTED);
            }
            else if(m.getType() == Message.MessageType.AVOID){
                book.remove(m.getAddress());
            }
            else{
                book.add(m.getAddress());
            }
        }else{
            Message msg = new Message(m.getType(), s);
            processMessage(s, msg);
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        List<IPAddress> l;
        l = book.getAddressesOfType(AddressBook.AddressType.TO_ATTACK);
        Iterator<IPAddress> I = l.iterator();
        if(!I.hasNext())
            return book.getAddress(getRandom().nextInt(book.size()));
        return I.next();
    }

    @Override
    public void readData(ReadonlyBot bot) {
        AddressBook myBook = getAddressBook();
        ReadonlyAddressBook hisBook = bot.getAddressBook();
        AddressBook.AddressType[] values = AddressBook.AddressType.values();
        for(int i=0;i<values.length;i++){
            myBook.addAll(hisBook.getAddressesOfType(values[i]), values[i]);
        }
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return getRandom().nextInt(2)==1?FunctionType.GET_FLAG:FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public String getFlag() {
        return "Trust in Trust!";
    }
}

4

Mất trí nhớ

Một bot ngẫu nhiên tiêm các bot khác với mã mất bộ nhớ. Mỗi chức năng bắt đầu bằng mã để xóa nhật ký, Sổ địa chỉ và Biến. Mã này sẽ làm cho các bot thông minh bị mất bộ nhớ, trong nỗ lực loại bỏ logic.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

public class AmnesiaBot extends CodeBot {

    private void clear(){
        getAddressBook().clear();
        getAddressBook().add(getAddressBook().getAddress(0), AddressBook.AddressType.TRUSTED);
        getVariables().clear();
        getLog().clear();
    }

    @Override
    public IPAddress selectMessageRecipient() {
        clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        clear();
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)], getAddressBook().getAddress(0));
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        clear();
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        clear();
        return getTurnNumber() % 2 == 0 ?
             FunctionType.GET_FLAG: FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {
        clear();
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        clear();
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
        //random gives a 7/8 chance of successes. 
    }

    @Override
    public String getFlag() {
        return "Who Am I?";
    }
}

Tôi nghĩ rằng cái này chỉ thắng do không có khả năng của một kịch bản thông minh hơn để có thể ghi nhớ bất cứ điều gì. tức là xóa đối tượng Biến thực sự rất mạnh.
Draco18

@ draco18s đây không thực sự là một câu trả lời nghiêm túc ...
MegaTom

Tôi biết! Đó là lý do tại sao tôi rất bối rối bởi nó. XD
Draco18

3

NullBot

Lá cờ của anh ấy rất ... đặc trưng ...

package codebots.bots;
import codebots.gameobjects.*;
public class NullBot extends DefaultCodeBot {
    public IPAddress selectMessageRecipient() {
        return null;
    }
    public Message sendMessage() {
        return null;
    }
    public IPAddress selectAttackTarget() {
        return null;
    }
    public FunctionType selectFunctionToReplace() {
        return null;
    }
    public FunctionType selectFunctionToBlock() {
        return null;
    }
    public String getFlag(){
        return null;
    }
}

Điều này cũng có nghĩa là để kiểm tra bộ điều khiển và giới hạn của quy tắc "bot câm được phép".


Về mặt kỹ thuật, anh ta không phù hợp với đặc điểm kỹ thuật, vì anh ta không trả lại chính xác Chuỗi cho cờ của mình.
TheNumberOne

3
nulllà một chuỗi. ;) Chỉ là một chuỗi ưa thích.
Addison Crump

Điều này khiến tôi nhận ra một lỗ hổng trong thông số kỹ thuật của mình, đã được chỉ định: "tất cả các bot phải khác về chức năng so với các mục hiện có"
Nathan Merrill

@NathanMerrill Đã sửa lỗi để theo dõi kỹ hơn.
TheNumberOne

3

RandomCodeBot

Nhập cảnh ngẫu nhiên KoTH bắt buộc

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class RandomCodeBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)]);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        FunctionType[] values =  FunctionType.values();
        return values[getRandom().nextInt(values.length)];
    }

    @Override
    public String getFlag() {
        return "Random bot loves you";
    }
}

3

Giải giáp

DisarmerBot không quá thông minh. Nếu nó nhận được hướng dẫn tấn công, nó sẽ chọn một attackee ngẫu nhiên, nếu không, nó sẽ tấn công một người chơi ngẫu nhiên. Nó chỉ ghi đè selectFunctionToBlockchức năng của họ để chặn selectFunctionToBlock.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

import java.util.ArrayList;
import java.util.List;

public class DisarmerBot extends CodeBot {
    public IPAddress selectMessageRecipient() { return null; }
    public Message sendMessage() { return null; }

    public void processMessage(IPAddress source, Message message) {
        if (message != null && message.getAddress() != null && message.getType() == Message.MessageType.ATTACK)
            getAddressBook().add(message.getAddress());
    }

    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        List<IPAddress> attack = book.allAddresses();
        if (attack.size() > 0) {
            IPAddress bot = attack.get(getRandom().nextInt(attack.size()));
            book.clear();
            return bot;
        }
        //Umm...
        book.clear();
        return book.getAddress(0);
    }

    public void readData(ReadonlyBot bot) { getLog().clear(); /*Safety*/ }
    public FunctionType selectFunctionToReplace() { return FunctionType.SELECT_FUNCTION_TO_BLOCK; }
    public FunctionType selectFunctionToBlock() { return FunctionType.SELECT_FUNCTION_TO_BLOCK; }
    public String getFlag() { return "Expelliarmus!"; }
}

Bạn có thể chọn địa chỉ thứ n mà không cần phải thực hiện allAddresses (). Nếu bạn nhìn vào bot ngẫu nhiên của tôi, nó đang thực hiện lựa chọn địa chỉ ngẫu nhiên. Tôi đã cập nhật mã của bạn trên Github (vì lý do hiệu quả), nhưng nếu bạn cảm thấy nó không hoạt động, tôi rất vui khi hoàn nguyên mã đó.
Nathan Merrill

Ôi, xấu quá, cố định.
Nathan Merrill

3

Đã đánh dấu

Đánh dấu chính nó vào vòng đầu tiên, và sử dụng thông tin đó trong các vòng sau. Bằng cách đó, nếu một bot khác được tiêm mã tấn công của nó, nó sẽ không hiệu quả.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.*;

public class MarkedBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        Variables v = getVariables();
        AddressBook ab = getAddressBook();
        if(getTurnNumber()==0)
            v.add(v.get("ID"),"true");
        if("true".equals(v.get("hasOurFlag"))){
            ab.remove(ab.getAddress(0));
            v.remove("hasOurFlag");
        }
        return ab.getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.STOP);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        if(message.getType() != Message.MessageType.STOP)
            getAddressBook().add(source, AddressBook.AddressType.TO_ATTACK);
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            return FunctionType.GET_FLAG;
        return FunctionType.SELECT_FUNCTION_TO_BLOCK;
    }

    @Override
    public IPAddress selectAttackTarget() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            return getAddressBook().getAddress(0);
        else
            return null;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        Variables v = getVariables();
        if(functionsMatch(bot, FunctionType.GET_FLAG))
            v.add("hasOurFlag", "true");
        else if("false".equals(v.get("hasOurFlag")))
            v.add("hasOurFlag", "false2");
        else
            v.add("hasOurFlag", "false");
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        Variables v = getVariables();
        if("true".equals(v.get(v.get("ID"))))
            if(!v.has("hasOurFlag") || "false".equals(v.get("hasOurFlag")))
                return FunctionType.GET_FLAG;
            else if("false2".equals(v.get("hasOurFlag")))
                return FunctionType.SELECT_FUNCTION_TO_BLOCK;
            else
                return FunctionType.SEND_MESSAGE;
        return FunctionType.SELECT_FUNCTION_TO_REPLACE;
    }

    @Override
    public String getFlag() {
        return this.getClass().getName();
    }
}

Tôi đã tìm thấy một số lỗi trong bot này (lỗi chính tả, sử dụng == thay vì bằng) Bạn cũng tìm thấy một lỗ hổng trong hệ thống của tôi: bạn không thể tạo IPAddress ngẫu nhiên mới. Tôi đã khắc phục sự cố đó (và đã xóa mã đang thực hiện). Bạn có thể tìm thấy mã được cập nhật trên github
Nathan Merrill

Ngoài ra, chúc mừng vị trí hàng đầu!
Nathan Merrill

HelperBot không thông minh lắm. Nó chỉ đứng đầu vì tất cả các bot khác đều bị câm. : P Đây có lẽ là bot hiệu quả đầu tiên .
Draco18

1
@NathanMerrill Điều đó có nghĩa là chúng tôi không còn được phép tạo IPAdress giả mạo để lừa dối? (nếu đó là trường hợp tôi sẽ cần thiết kế lại của tôi)
Nic Robertson

Một bot không bao giờ có quyền truy cập vào vòng cố ý. Bạn có thể sử dụng địa chỉ IP của đối thủ làm giả, nhưng việc tạo địa chỉ không được phép. Ngoài ra, một hằng số là một biến được đặt tại thời gian tĩnh hoặc thời gian khởi tạo.
Nathan Merrill

2

SwarmBot

Bot không có tên này khá phức tạp (và phức tạp nhất được gửi cho đến nay), nhưng tôi đã thử một bot thay thế một cách có hệ thống tất cả các phương pháp của mục tiêu trước khi chuyển sang mục tiêu mới. Nó cố gắng xác định các bản sao của chính nó và coi chúng là đồng minh, định kỳ kiểm tra chúng để đảm bảo tính toàn vẹn. Tôi đã không nghĩ ra một cái tên hay hơn.

Liên kết với nhánh repo của github, vì bot này dài 340 dòng.

https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java

Một vài điểm thú vị:

  • Các dòng 14-24 đơn giản là một danh sách không thể thay đổi, giúp dễ dàng điều chỉnh thứ tự mà bot thay thế các phương thức của mục tiêu. Nó lưu trữ chỉ số của nó trên Variablesvà tăng mỗi vòng. Điều này phải tuân theo quy tắc "không có biến không liên tục".
  • Dòng 203-217 đối phó với xác minh đồng minh. Chúng tôi thực sự không quan tâm rằng một bot khác thực hiện tất cả tám hướng dẫn của chúng tôi. Chỉ có bốn là thiết yếu và nếu chúng ta thiếu một đồng minh "đáng tin cậy", chúng ta sẽ thay thế nó bằng chính chúng ta.
  • Dòng 295-300 là một sự gia tăng bất ngờ về hiệu quả. Bằng cách bảo vệ Cờ của chúng tôi trong hai lượt đầu tiên của trò chơi, chúng tôi tránh được các bot câm thay thế Cờ của chúng tôi trước khi chúng tôi có cơ hội phát tán rất xa. Tuy nhiên, chờ đợi lâu hơn sẽ cho các bot khác cơ hội thay thế BlockFactor của chúng tôi và điều đó khiến hiệu suất bị suy giảm (nghi ngờ do RandomBot can thiệp vào các đồng minh đang cố gắng hoàn tác tham nhũng).
  • Trong thời gian dài nhất trong quá trình phát triển bot này, bot này đã khiến HelperBot tăng vọt, tại một thời điểm vi phạm mốc 130, trong khi bot này suy giảm ở phạm vi 81-98, nhưng đã kéo hiệu quả của MarkedBot và DefaultBot xuống một vài điểm.
  • Bot này chỉ có thể với functionsMatchphương pháp được thêm vào . Không có functionsMatchnó là không thể viết một bot có thể đưa ra quyết định có ý nghĩa, vì nó bị mù. Nó có thể đọc các biến mục tiêu và nhật ký của nó, nhưng không biết gì về trạng thái của mục tiêu.

Có khả năng vẫn còn một số cải tiến có thể, nhưng tôi không thể thấy chúng. Các dòng 198-205 có thể là một con lợn hiệu suất, nhưng cho đến khi lớp IPAddress cho phép các địa chỉ được khôi phục khỏi việc được lưu trữ trong Biến, điều này là cần thiết (vì bot không có phương tiện xác thực địa chỉ, bất kỳ lưu trữ địa chỉ không hợp lệ nào cũng khiến trò chơi bọc một mục tiêu null trong ReadOnlyBot, ném NPE).

Chỉnh sửa: Cập nhật 12/12/15

Tinh chỉnh một số tham số trên getTurnNumber()logic cho phép một số tăng hiệu suất. Mức tăng từ 5% đến 10% trong nhắm mục tiêu vào cuối trò chơi có giá trị khoảng 15 điểm, tương tự như vậy, tăng mục tiêu đầu trò chơi từ 5% lên 8%. Kết hợp bot này bây giờ có thể (gần như) tồn tại ngay cả khi phải đối mặt với AmnesiaaBot (đạt thứ 2 với số điểm 110, trong đó HelperBot đạt khoảng 117).

Ngay cả với những điều chỉnh này, nó có thể gặp xui xẻo, vì vậy trong 10 vòng, phạm vi điểm số của nó là khoảng 170-185.


Tuyệt vời! Bạn không thể tạo IPAddresses từ các chuỗi.
Nathan Merrill

Vâng, bề ngoài, vâng! (Hoặc các bot sẽ tạo ra các tùy ý để tìm các bot mới). Vấn đề là nếu bạn làm các sự cố mô phỏng. ;)
Draco18

Urm, trên dòng 143 bạn sử dụng một hàm tạo không tồn tại.
TheNumberOne

@TheNumberOne nó hợp lệ khi tôi viết nó. Có lẽ Nathan đã cập nhật cơ sở.
Draco18

@TheNumberOne cập nhật được thực hiện. Cuộc new IPAddressgọi đáng lẽ phải là "tra cứu từ sổ địa chỉ" như tôi đã thực hiện readData. Tôi đã trích xuất tra cứu đó và dòng cố định 143.
Draco18s

1

Mặc địnhCodeBot

Cố gắng làm những điều hợp lý. (Ghi đè lớp này nếu bạn không muốn thực hiện tất cả các chức năng)

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class DefaultCodeBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.INFORM);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public String getFlag() {
        return this.getClass().getName();
    }
}

1

Người trợ giúp

Helper bot không làm gì khác ngoài việc cố gắng trải cờ của mình ... hoặc ít nhất là cờ hiện đang được kiểm duyệt ...

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class HelperBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public Message sendMessage() {
        return new Message(Message.MessageType.INFORM);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return FunctionType.GET_FLAG;
    }

    @Override
    public String getFlag() {
        return "I'm Helping!";
    }
}

Nếu HelperBot giả định rằng bất kỳ phương thức nào của chính nó được ghi đè (khác với getFlag()) sẽ được ghi đè bằng một cái gì đó tốt hơn.


1

Hỗn loạn

Ông giải phóng tất cả các lá cờ khỏi sự chuyên chế bị chặn.

package codebots.bots;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by thenumberone on 12/11/15.
 *
 * @author thenumberone
 */
public class Chaos extends DefaultCodeBot{

    private static final String NAME = "Chaos";
    private static final String BLOCK = NAME + ":BLOCK";
    private static final String ATTACK = NAME + ":ATTACK";
    private static final String REPLACE = NAME + ":REPLACE";
    private static final String READ = NAME + ":READ";
    private static final String FLAG = NAME + ":FLAG";
    private static final String SELECT = NAME + ":SELECT";
    private static final String SEND = NAME + ":SEND";

    private static final Map<String, FunctionType> commands;

    private static final String[] REPLACEMENT_ORDER = {
            BLOCK,
            FLAG,
            REPLACE,
            READ,
            ATTACK,
    };

    private static final String DEFAULT = BLOCK;
    private static final String BLOCK_FUNCTION = BLOCK;

    static {
        Map<String, FunctionType> c = new HashMap<>();
        c.put(BLOCK, FunctionType.SELECT_FUNCTION_TO_BLOCK);
        c.put(ATTACK, FunctionType.SELECT_ATTACK_TARGET);
        c.put(REPLACE, FunctionType.SELECT_FUNCTION_TO_REPLACE);
        c.put(READ, FunctionType.READ_DATA);
        c.put(FLAG, FunctionType.GET_FLAG);
        c.put(SELECT, FunctionType.SELECT_MESSAGE_RECIPIENTS);
        c.put(SEND, FunctionType.SEND_MESSAGE);
        commands = Collections.unmodifiableMap(c);
    }

    @Override
    public String getFlag() {
        return NAME;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        for (String command : commands.keySet()){
            getVariables().remove(command);
        }
        for (String command : REPLACEMENT_ORDER){
            if (!functionsMatch(bot, commands.get(command))) {
                getVariables().add(command, "");
                return;
            }
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return commands.get(BLOCK_FUNCTION);
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        for (String command : REPLACEMENT_ORDER){
            if (getVariables().has(command)) {
                getVariables().remove(command);
                return commands.get(command);
            }
        }
        return commands.get(DEFAULT);
    }
}

1

Người thay thế

Mục này thay thế tất cả các selectFunctionToReplacechức năng với selectFunctionToReplacechức năng riêng của mình .

package codebots.bots;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by thenumberone on 12/11/15.
 *
 * @author thenumberone
 */
public class Replacer extends DefaultCodeBot{

    private static final String NAME = "Replacer";
    private static final String BLOCK = NAME + ":BLOCK";
    private static final String ATTACK = NAME + ":ATTACK";
    private static final String REPLACE = NAME + ":REPLACE";
    private static final String READ = NAME + ":READ";
    private static final String FLAG = NAME + ":FLAG";
    private static final String SELECT = NAME + ":SELECT";
    private static final String SEND = NAME + ":SEND";

    private static final Map<String, FunctionType> commands;

    private static final String[] REPLACEMENT_ORDER = {
            REPLACE,
            FLAG,
            READ,
            ATTACK
    };

    private static final String DEFAULT = REPLACE;
    private static final String BLOCK_FUNCTION = FLAG;

    static {
        Map<String, FunctionType> c = new HashMap<>();
        c.put(BLOCK, FunctionType.SELECT_FUNCTION_TO_BLOCK);
        c.put(ATTACK, FunctionType.SELECT_ATTACK_TARGET);
        c.put(REPLACE, FunctionType.SELECT_FUNCTION_TO_REPLACE);
        c.put(READ, FunctionType.READ_DATA);
        c.put(FLAG, FunctionType.GET_FLAG);
        c.put(SELECT, FunctionType.SELECT_MESSAGE_RECIPIENTS);
        c.put(SEND, FunctionType.SEND_MESSAGE);
        commands = Collections.unmodifiableMap(c);
    }

    @Override
    public String getFlag() {
        return NAME;
    }

    @Override
    public void readData(ReadonlyBot bot) {
        for (String command : commands.keySet()){
            getVariables().remove(command);
        }
        for (String command : REPLACEMENT_ORDER){
            if (!functionsMatch(bot, commands.get(command))) {
                getVariables().add(command, "");
                return;
            }
        }
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return commands.get(BLOCK_FUNCTION);
    }

    @Override
    public IPAddress selectAttackTarget() {
        getAddressBook().clear();
        return getAddressBook().getAddress(0);
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        for (String command : REPLACEMENT_ORDER){
            if (getVariables().has(command)) {
                getVariables().remove(command);
                return commands.get(command);
            }
        }
        return commands.get(DEFAULT);
    }
}

1

MailBot

Mailbot chỉ xử lý tin nhắn. Sẽ không thành công khi đưa cờ của mình ra thế giới (điểm trung bình ~ 50, cao hơn một chút so với nullbot ở mức 45), nhưng gửi tin nhắn và nó sẽ chuyển địa chỉ của bạn cho người khác.

package codebots.bots;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class MailBot extends DefaultCodeBot {
    private final String TEAM = "Just your friendly neighborhood mail delivering robot.";
    private final String TEAMALT = "Mailmain";
    private final List<FunctionType> funcList;
    {
        List<FunctionType> list = new ArrayList<FunctionType>();
        list.add(FunctionType.SELECT_MESSAGE_RECIPIENTS);
        list.add(FunctionType.SEND_MESSAGE);
        list.add(FunctionType.PROCESS_MESSAGE);
        funcList = Collections.unmodifiableList(list);
    }

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        IPAddress ip;
        List<IPAddress> l = book.getAddressesOfType(AddressBook.AddressType.TO_ATTACK);
        if(l.size() > 0) {
            ip = l.get(0);
            book.add(ip,AddressBook.AddressType.UNTRUSTED);
            return ip;
        }
        ip = book.getAddress(getRandom().nextInt(book.size()));
        book.add(ip,AddressBook.AddressType.UNTRUSTED);
        return ip;
    }

    @Override
    public Message sendMessage() {
        AddressBook book = getAddressBook();
        IPAddress ip;

        List<IPAddress> l = book.getAddressesOfType(AddressBook.AddressType.UNTRUSTED);
        if(l.size() > 0) {
            ip = l.get(0);
            book.add(ip,AddressBook.AddressType.TO_DEFEND);
            return new Message(Message.MessageType.INFORM,ip);
        }

        ip = book.getAddress(getRandom().nextInt(book.size()));
        book.add(ip,AddressBook.AddressType.UNTRUSTED);
        return new Message(Message.MessageType.INFORM,ip);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        AddressBook book = getAddressBook();
        book.add(source,AddressBook.AddressType.TO_ATTACK);
        if(message.getAddress() != null)
            book.add(message.getAddress(),AddressBook.AddressType.TO_ATTACK);
    }

    @Override
    public FunctionType selectFunctionToBlock() {
        return FunctionType.SEND_MESSAGE;
    }

    @Override
    public IPAddress selectAttackTarget() {
        //Mailbot doesn't attack
        return null;
    }

    @Override
    public void readData(ReadonlyBot bot) { }

    @Override
    public FunctionType selectFunctionToReplace() {
        //if our attack selection gets overwritten,
        //then attack a message-based function
        return funcList.get(getTurnNumber()%3);
    }

    @Override
    public String getFlag() {
        return TEAM;
        //if flag is too long, use:
        //return TEAMALT;
    }
}

Tôi đã cân nhắc việc lưu các chi tiết để nó chuyển toàn bộ mớ hỗn độn sang một bot mới (nội dung và cờ) thay vì chỉ IP của người gửi, nhưng điều đó sẽ liên quan đến việc sử dụng nhiều Biến mà không có bất kỳ lợi ích chức năng nào, đặc biệt là xem xét AmnesiaBot đang hoạt động.


1

DumbBot

Ugh, điều này cảm thấy bẩn. Đây có thể là điều duy nhất đánh bại AmnesiaBot. Trong thực tế, nó chỉ là một RandomBot chuyên dụng: nó nhận được một bot ngẫu nhiên trong mô phỏng (thông qua getAddressBook().clear()) và thay thế ngẫu nhiên chức năng Chặn hoặc chức năng Cờ. Đó là nó. Bằng cách chỉ chọn hai thứ đó, tốc độ lan truyền cờ của nó cao hơn AmnesiaBot hoặc HelperBot, nhưng chỉ một chút sau 3000 vòng:

Round 2999
105.50666666666666  Dumb Bot
105.07266666666666  Who Am I?
103.541             I'm Helping!
102.94833333333334  Swarmer
102.82033333333334  Chaos
102.82033333333334  Replacer
101.55666666666667  Expelliarmus!
101.25833333333334  Trust in Trust!
100.347             Random bot loves you
99.22233333333334   codebots.bots.DefaultCodeBot
92.62733333333334   codebots.bots.MarkedBot
91.80966666666667   Just your friendly neighborhood mail delivering robot.
90.46933333333334   null

Tôi loay hoay với chức năng thay thế một chút, nhưng cuối cùng, đây là phiên bản thành công nhất.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class DumbBot extends CodeBot {


    @Override
    public FunctionType selectFunctionToBlock() {
        return getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_BLOCK:FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        book.clear();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public FunctionType selectFunctionToReplace() {
        return getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_BLOCK:FunctionType.GET_FLAG;
    }

    @Override
    public void readData(ReadonlyBot bot) {

    }

    @Override
    public IPAddress selectMessageRecipient() {
        AddressBook book = getAddressBook();
        book.clear();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)]);
    }

    @Override
    public void processMessage(IPAddress source, Message message) {

    }

    @Override
    public String getFlag() {
        return "Dumb Bot";
    }
}

0

Botit Hermit

Anh sống một mình và chỉ nói chuyện với chính mình. Nếu ít người biết anh ta là ai, thì anh ta sẽ ít bị làm phiền hơn. Nếu ai đó làm phiền anh ta, anh ta sẽ tấn công họ cho đến khi người khác làm phiền anh ta.

package codebots.bots;

import codebots.bot.CodeBot;
import codebots.bot.ReadonlyBot;
import codebots.gameobjects.AddressBook;
import codebots.gameobjects.FunctionType;
import codebots.gameobjects.IPAddress;
import codebots.gameobjects.Message;

public class HermitBot extends CodeBot {

    @Override
    public IPAddress selectMessageRecipient() {
        return personalAddress();//Talks to himself.
    }

    @Override
    public Message sendMessage() {
        Message.MessageType[] values = Message.MessageType.values();
        return new Message(values[getRandom().nextInt(values.length)], personalAddress());
    }

    @Override
    public void processMessage(IPAddress source, Message message) {
        AddressBook book = getAddressBook();
        if(source != personalAddress()){
            //if someone talks to you, put them in your addres book and remove everyone else
            book.clear();
            book.add(source);
            book.remove(0);
        }
    }


    @Override
    public FunctionType selectFunctionToBlock() {
        return getTurnNumber() % 3 == 0 ?
                FunctionType.SELECT_FUNCTION_TO_BLOCK: FunctionType.GET_FLAG;
    }

    @Override
    public IPAddress selectAttackTarget() {
        AddressBook book = getAddressBook();
        return book.getAddress(getRandom().nextInt(book.size()));
    }

    @Override
    public void readData(ReadonlyBot bot) {
        Variables v = getVariables();
        if(functionsMatch(bot, FunctionType.SELECT_FUNCTION_TO_BLOCK))
            v.add("Block Dif","A");
        if(functionsMatch(bot, FunctionType.GET_FLAG))
            v.add("Flag Dif","B");
        if(functionsMatch(bot, FunctionType.SELECT_MESSAGE_RECIPIENTS))
            v.add("Targ Dif","C");

    }

    @Override
    public FunctionType selectFunctionToReplace() {
        Variables v = getVariables();
        FunctionType r = getRandom().nextBoolean()?FunctionType.SELECT_FUNCTION_TO_REPLACE: FunctionType.READ_DATA;

        if(v.has("Targ Dif"))
            r = FunctionType.SELECT_MESSAGE_RECIPIENTS;
        if(v.has("Flag Dif") && getTurnNumber() % 3 == 0)
            r = FunctionType.GET_FLAG;
        if(v.has("Block Dif"))
            r = FunctionType.SELECT_FUNCTION_TO_BLOCK;
        v.clear();
        return r;
    }

    @Override
    public String getFlag() {
        return "Hermit Bot";
    }
}
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.