코드 봇 4 : 기능 프로그래밍


25

esh,이게 진짜 4 일까? 모든 이민자들에게있어 핵심 과제는 동일하지만 사용자 정의 언어 대신 Java를 사용하고 있습니다. 관심이있는 경우를 대비 하여 지난 3 가지 CodeBot 과제 가 있습니다.

CodeBots의 목표는 봇을 가능한 한 바이러스 성으로 만드는 것 입니다. 각 봇은 깃발을 가지고 있으며, 깃발이 어디에나 있는지 확인해야합니다 .

API

봇은 표준화 된 "프로토콜"을 따르며 봇은 다음 단계를 동 기적으로 진행합니다.

  1. IPAddress selectMessageRecipient() 봇이 "친근한"메시지를 보낼 사람을 선택할 수 있습니다.
  2. Message sendMessage() 봇이 그가 보낼 메시지의 내용을 선택할 수 있도록합니다.
  3. processMessage(IPAddress, Message) 봇이받는 각 메시지에 대해 호출됩니다.
  4. FunctionType selectFunctionToBlock()현재 턴에 대한 함수 덮어 쓰기를 차단합니다. 7 단계를 참조하십시오.
  5. IPAddress selectAttackTarget()봇이 DDOS를 원하는 사람을 선택할 수 있습니다. 봇이 동시에 3 개의 봇을 대상으로하는 경우 DDOS 공격이 성공합니다. 공격이 성공하면 각 공격자는 6 단계와 7 단계를 수행 할 수 있습니다.
  6. readData(ReadonlyBot) 봇이 취약한 봇에 저장된 데이터를 읽을 수 있도록합니다.
  7. FunctionType selectFunctionToReplace()이 도전의 핵심입니다 . 봇에서 봇으로 복사하려면 1 개의 기능 (여기에 나열된 8 개 중 하나)을 선택할 수 있습니다. 그런 다음 함수 대신 함수가 호출됩니다. . 여러 봇이 동일한 기능을 선택하면 임의의 봇이 성공합니다.
  8. String getFlag()게임이 끝날 때 호출되며 제출에 고유 한 문자열을 반환해야합니다. 함수는 항상 같은 문자열을 반환해야합니다. 게임이 끝날 때 가장 많은 깃발을 가진 제출이 승리합니다.

저장

저장 영역에는 AddressBook , LogVariables의 3 가지 형식이 있습니다. 이러한 스토리지 형식은 함수가 실행중인 봇에 대해 로컬입니다 (따라서 함수가 복사되면 각 오브젝트의 내용이 다름). 이러한 모든 개체는 수동으로 수정하거나 지울 수 있습니다. 이러한 객체를 얻으려면 클래스에 getter가 있습니다 (예 :) getLog().

주소록은 목록을 저장 하여 IPAddress A를 각 인 AddressType 당신이 주소의 다른 유형을 분류 할 수 있습니다. 주소록 에는 항상 최소 1 개의 주소가 포함됩니다 (삭제 된 경우 임의 주소가 추가됨). 여러 IP 주소 를 얻기 위해 주소록 지우기 것은 허용되지 않습니다.

로그 작업에 대한 모든 취한 조치뿐만 아니라 데이터의 목록을 저장합니다. 또한 모든 성공적인 공격에 대한 이력도 포함합니다 (어떤 기능을 덮어 썼는지 모르지만)

변수 객체는 문자열 이름에 부착 된 문자열 변수를 저장할 수 있습니다. 게임 시작시 변수 에는 단일 변수가 포함됩니다.ID 여기에는 봇 유형에 고유하게 임의로 생성 된 ID가 포함됩니다.

다른 액세스 기능도 있습니다.

  • int getTurnNumber() 현재 턴과 정수를 반환
  • bool functionsMatch(ReadonlyBot, FunctionType) ReadonlyBot의 기능이 사용자의 기능과 일치하는지 테스트
  • IPAddress personalAddress() IP 주소를 반환

구현하는 방법

  • Github 에서 코드를 얻을 수 있습니다
  • \bots폴더에 봇을 추가 한 다음 봇에 대한 참조를controller\CodeBotFactory.java
  • 당신의 봇은 연장 codebots.bot.CodeBot하거나codebots.bots.DefaultCodeBot
  • 컨트롤러를 실행하려면 Java 8이 필요합니다.
  • 컴파일 하고 실행 /src하는 javac codebots\*.java데 사용하여 코드를 ( 폴더 에 있다고 가정) 실행할 수 있습니다 java codebots.Main.
  • 당신은 할 수 있지 어떤 상수가 아닌 멤버 변수를 클래스에
  • 반사는 허용되지 않습니다.
  • 위에 나열된 방법 이외의 봇 (동일 또는 다른 유형) 간의 통신 형태는 허용되지 않습니다.
  • Dumb 및 / 또는 Suicidal 봇은 허용되지만 모든 봇은 기능적으로 기존 항목과 달라야합니다.
  • 봇에서 임의성을 원한다면 getRandom()
  • 코드를 효율적으로 유지하십시오. 컨트롤러를 빠르게 프로파일 링하고 만드는 데 많은 시간을 보냈습니다.

점수

105.2501 Expelliarmus!
104.5803 도와 드리겠습니다!
104.2746 나는 누구입니까?
103.8529 Dumb Bot
103.2028 Replacer
102.7045 Chaos
102.4046 Hermit Bot
102.2849
Swarmer 100.5598 랜덤 봇은 당신을 사랑합니다
99.966 Trust in Trust!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 친절한 동네 우편 배달 로봇.
89.4645 null


Log.LogEntry를 최종으로 만들어야합니다. 최종이 아니므로 원하는 정보로 로그를 만들 수 있습니다 ... 내 봇 기능 만 읽거나 만들 수 있습니다.
TheNumberOne

readData가 읽고있는 봇의 IpAddress에 액세스 할 수 있습니까?
TheNumberOne

@TheNumberOne은 현재는 아니지만 왜 그런지 모르겠습니다. 지금은 코드가 없지만 코드를 업데이트하여 변경하겠습니다.
Nathan Merrill

3
카오스가 DisarmBot과 MarkedBot을 리더 보드에서 거래하는 곳이 흥미 롭습니다.
TheNumberOne

1
현재 라운드 7850 만 중,보다 정확한 점수를 얻기에 ...
LegionMammal978

답변:


4

TrustBot

당신이 그에게 메시지를 보내면, 그가 말하는 것을 할 것입니다. 봇을 읽으면 주소를 자신의 책에 직접 복사합니다. 그는 주소록에서 공격한다고 말하는 봇을 공격합니다.

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

기억 상실

메모리 손실 코드로 다른 봇을 주입하는 임의의 봇. 각 기능은 로그, 주소록 및 변수를 지우는 코드로 시작합니다. 이 코드는 스마트 봇이 논리를 없애기 위해 메모리를 잃게 만듭니다.

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?";
    }
}

나는 이것이 똑똑한 스크립트가 아무것도 기억할 수 없기 때문에 이길 것이라고 생각합니다. 즉, Variables 객체를 지우는 것은 실제로 강력합니다.
Draco18s December

@ ...이 심각한 대답을 할 정말, 표준 아니었다 draco18s
MegaTom

알아! 그렇기 때문에 내가 너무 혼란스러워합니다. XD
Draco18s

3

널봇

그의 깃발은 매우 ... 특징입니다 ...

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;
    }
}

또한 컨트롤러와 "덤봇 봇 허용"규칙의 한계를 테스트하기위한 것입니다.


기술적으로 그는 플래그에 대해 String을 정확하게 반환하지 않기 때문에 사양에 맞지 않습니다.
TheNumberOne

3
null문자열입니다. ;) 단지 멋진 문자열입니다.
Addison Crump

"내 봇은 기능적으로 기존 항목과 달라야합니다"
Nathan Merrill

@NathanMerrill 사양을보다 면밀히 따르도록 수정되었습니다.
TheNumberOne

3

RandomCodeBot

의무적 인 무작위 KoTH 항목

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

DisarmerBot

DisarmerBot은 너무 똑똑하지 않습니다. 공격 지시를 받으면 무작위 공격자를 선택하고, 그렇지 않으면 무작위 플레이어를 공격합니다. 그냥 selectFunctionToBlock차단 하는 기능을 재정의합니다 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!"; }
}

allAddresses ()를 수행 할 필요없이 n 번째 주소를 선택할 수 있습니다. 내 랜덤 봇을 보면 임의의 주소 선택입니다. 효율성을 이유로 Github에서 코드를 업데이트했지만 작동하지 않는다고 생각되면 되돌릴 수 있습니다.
Nathan Merrill

아, 나쁘고 고쳐 졌어
Nathan Merrill

3

MarkedBot

첫 번째 라운드에서 자신을 표시하고 나중에 라운드에서 해당 정보를 사용합니다. 이렇게하면 다른 봇에 공격 코드가 주입되면 효과가 없습니다.

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();
    }
}

이 봇에서 몇 가지 버그를 발견했습니다 (타이프, == 대신 등호 사용). 시스템에서 결함을 발견했습니다. 새로운 임의의 IP 주소를 만들 수 없어야합니다. 그 문제를 해결하고 코드를 제거했습니다. 업데이트 된 코드는 github
Nathan Merrill

또한 최고 자리에 축하합니다!
Nathan Merrill

HelperBot은 그리 똑똑하지 않습니다. 다른 모든 봇은 멍청했기 때문에 최고였습니다. : P 이것은 아마도 첫 번째 효과적인 봇일 것입니다.
Draco18s

1
@NathanMerrill 더 이상 속임수를 위해 위조 된 IPAdress를 만들 수 없다는 의미입니까? (경우에 먹으 렴 난 거 필요 해요 경우 내 재 설계)
닉 로버트슨에게

봇은 의도적으로 라운드에 액세스 할 수 없습니다. 상대방의 IP 주소를 위조로 사용할 수 있지만 만들 수는 없습니다. 또한 상수는 정적 시간 또는 초기화 시간에 설정된 변수입니다.
Nathan Merrill

2

스웜 봇

이름이 지정되지 않은이 봇은 다소 복잡하지만 지금까지 제출 된 가장 복잡한 봇이지만 새로운 대상으로 이동하기 전에 대상의 모든 방법을 체계적으로 대체하는 봇을 시도했습니다. 자신의 사본을 식별하고 동맹국으로 취급하며 무결성을 보장하기 위해 정기적으로 점검합니다. 나는 더 나은 이름을 내놓지 않았다.

이 봇의 길이는 340 줄이므로 github repo 브랜치에 연결됩니다.

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

몇 가지 흥미로운 점 :

  • 14-24 행은 단순히 수정 불가능한 목록으로, 봇이 대상의 방법을 대체하는 순서를 쉽게 조정할 수 있습니다. 인덱스를 저장합니다.Variables 하고 매 라운드마다 증가합니다. 이는 "일정하지 않은 변수 없음"규칙을 따라야합니다.
  • 203-217 행은 동맹 확인을 처리합니다. 우리는 실제로 다른 봇이 모든 것을 구현하는 것을 신경 쓰지 않습니다 8 가지 명령을 . 오직 4 명만이 필수이며, "신뢰할 수있는"동맹에서 하나를 빠뜨렸다면, 우리를 자신의 것으로 대체합니다.
  • 295-300 행은 예상치 못한 효과 증가였다. 게임의 첫 두 턴에서 깃발을 보호함으로써 우리는 아주 멀리 퍼질 기회를 갖기 전에 멍청한 봇이 깃발을 대체하는 것을 피합니다. 그러나 더 오래 기다리면 다른 봇이 BlockFunction을 교체 할 수있는 기회를 제공하고 성능이 저하됩니다 (RandomBot이 부패를 취소하려고 시도하는 동맹국을 방해하기 때문에).
  • 이 봇을 개발하는 동안 가장 오랜 시간 동안이 봇은 한 시점에서 HelperBot이 130 점을 넘지 못하게되었고이 봇은 81-98 범위에서 멈췄지만 MarkedBot와 DefaultBot의 효과는 여러 지점으로 떨어졌습니다.
  • 이 봇은 추가 된 functionsMatch방법 으로 만 가능했습니다 . 없으면 functionsMatch장님이되면서 의미있는 결정을 내릴 수있는 로봇을 쓰기 불가능했다. 대상 변수와 로그를 읽을 수 있지만 대상 상태는 알 수 없습니다.

여전히 일부 개선 사항이있을 수 있지만 볼 수는 없습니다. 198-205 행은 아마도 성능 문제 일 것입니다. 그러나 IPAddress 클래스가 주소가 변수에 저장되는 것을 재구성 할 때까지, 이것은 봇이 주소를 확인할 수단이 없기 때문에 유효하지 않은 주소를 저장하면 게임이 발생합니다. NPE를 던지면 Null 대상을 ReadOnlyBot에 래핑하십시오.

편집 : 12/12/15 업데이트

getTurnNumber()로직 의 일부 매개 변수를 조정 하면 성능이 약간 향상되었습니다. 최종 게임 타겟팅에서 5 %에서 10 % 로의 증가는 약 15 포인트의 가치가 있었으며, 초기 게임 타겟팅은 5 %에서 8 %로 증가했습니다. 이 봇을 결합하면 AmnesiaaBot에 직면했을 때에도 (거의) 살아남을 수 있습니다 (헬퍼 봇이 약 117에 도달하는 110 점으로 2 위).

이러한 조정으로도 운이 나빠질 수 있으므로 10 라운드 동안 점수 범위는 약 170-185입니다.


대박! 문자열에서 IP 주소를 만들 수는 없습니다.
Nathan Merrill

표면적으로는 그렇습니다! (또는 봇은 새로운 봇을 찾기 위해 임의의 봇을 생성합니다). 문제는 시뮬레이션을하면 충돌이 발생 한다는 입니다. ;)
Draco18s

Urm, 143 행에서 존재하지 않는 생성자를 사용합니다.
TheNumberOne

@TheNumberOne 내가 쓸 때 유효했습니다. 나단은 아마도 기지를 업데이트했을 것입니다.
Draco18s

@TheNumberOne 업데이트가 완료되었습니다. new IPAddress내가에서 수행했던대로 호출은 "주소록에서 찾아 볼"있었어야 readData. 조회 및 고정 줄 ​​143을 추출했습니다.
Draco18s

1

DefaultCodeBot

합리적인 일을하려고합니다. (모든 기능을 구현하지 않으려면이 클래스를 재정의하십시오)

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

헬퍼 봇

헬퍼 봇은 자신의 깃발을 퍼뜨 리려고 노력할뿐입니다.

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!";
    }
}

HelperBot이 (가 아닌 getFlag()) 덮어 쓴 자체 메소드를 더 나은 것으로 겹쳐 쓰는 것으로 가정합니다 .


1

혼돈

그는 모든 깃발을 막히는 폭정에서 해방시켰다.

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

교체기

이 항목은 모든 selectFunctionToReplace기능을 자체 selectFunctionToReplace기능으로 대체합니다 .

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은 메시지 만 처리합니다. 자체 플래그를 세계에 알리는 데는 성공하지 못하지만 (평균 점수는 ~ 50, nullbot은 ~ 45의 약간 높음) 메시지를 보내면 다른 사람에게 주소를 전달합니다.

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;
    }
}

세부 정보를 저장 하여 발신자의 IP가 아닌 새로운 봇 (컨텐츠 및 플래그)에 전체 메시지 를 전달할 것을 고려했지만, 특히 AmnesiaBot이 실행중인 것을 고려할 때 아무런 기능적 이득없이 변수를 많이 사용했습니다.


1

덤봇

어, 이거 더러워 요. 이것은 AmnesiaBot를 능가하는 유일한 것입니다. 실제로, 그것은 단지 특수화 된 RandomBot입니다 : 시뮬레이션을 통해 랜덤 봇을 얻습니다 ( getAddressBook().clear()블록을 통해 ). 그리고 블록 함수 또는 플래그 함수를 무작위로 대체합니다. 그게 다야. 이 두 가지만 선택하면 플래그 확산 률이 ​​AmnesiaBot 또는 HelperBot보다 높지만 3000 라운드 후에 약간만 나타납니다.

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

대체 기능을 약간 고민했지만 결국 가장 성공적인 버전입니다.

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

은둔 봇

그는 혼자 살고 자신에게만 이야기합니다. 더 적은 사람들이 자신이 누구인지 알면 덜 귀찮게 될 것입니다. 누군가가 그를 귀찮게하면 다른 사람이 귀찮게 할 때까지 공격합니다.

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";
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.