รหัสบอท 4: การเขียนโปรแกรมใช้งานได้


25

Sheesh นี่คือสิ่งที่ 4 จริงเหรอ? สำหรับผู้ใช้งานเก่าทุกคนความท้าทายหลักเหมือนกัน แต่เรากำลังใช้ Java แทนภาษาที่กำหนดเอง นี่คือความท้าทายสาม CodeBot ที่ ผ่านมาในกรณีที่คุณมีความสนใจ

เป้าหมายของ CodeBots คือการทำให้บอทของคุณเป็นไวรัสที่เป็นไปได้ แต่ละบอถือธงและคุณต้องให้แน่ใจว่าสถานะของคุณได้ทุกที่

API

บอตจะเป็นไปตาม "โปรโตคอล" ที่เป็นมาตรฐานและบอตจะดำเนินการผ่านขั้นตอนต่อไปนี้พร้อมกัน:

  1. IPAddress selectMessageRecipient() อนุญาตให้บอทเลือกคนที่เขาต้องการส่งข้อความ "เป็นมิตร" ถึง
  2. Message sendMessage() อนุญาตให้บอทเลือกเนื้อหาของข้อความที่เขาจะส่งออกไป
  3. processMessage(IPAddress, Message) ถูกเรียกสำหรับแต่ละข้อความที่บอทได้รับ
  4. FunctionType selectFunctionToBlock()บล็อกฟังก์ชั่นจากการเขียนทับสำหรับเทิร์นปัจจุบัน ดูขั้นตอนที่ 7
  5. IPAddress selectAttackTarget()อนุญาตให้บอทเลือกคนที่เขาต้องการ DDOS การโจมตี DDOS นั้นสำเร็จถ้าบอตถูกโจมตี 3 บอตในเวลาเดียวกัน หากการโจมตีสำเร็จผู้โจมตีแต่ละคนสามารถทำขั้นตอนที่ 6 และ 7 ได้
  6. readData(ReadonlyBot) อนุญาตให้บอทอ่านข้อมูลที่เก็บไว้ในบอทที่มีช่องโหว่
  7. FunctionType selectFunctionToReplace()คือปมของความท้าทายนี้ คุณได้รับอนุญาตให้เลือก 1 ฟังก์ชั่น (จาก 8 รายการที่นี่) เพื่อคัดลอกจากบอทของคุณไปยังบ็อตของพวกเขา จากนั้นการทำงานของคุณจะถูกเรียกแทนพวกเขา หากหลายบอทเลือกฟังก์ชั่นเดียวกันการสุ่มจะทำได้สำเร็จ
  8. String getFlag()ถูกเรียกใช้เมื่อสิ้นสุดเกมและควรส่งคืนสตริงที่ไม่ซ้ำกับการส่งของคุณ ฟังก์ชั่นของคุณควรกลับสตริงเดิมเสมอ การส่งด้วยธงมากที่สุดในตอนท้ายของเกมชนะ

การเก็บรักษา

คุณมี 3 รูปแบบของการจัดเก็บเป็นสมุดที่เข้าสู่ระบบและตัวแปร ที่เก็บข้อมูลรูปแบบเหล่านี้อยู่ในบ็อตที่ฟังก์ชันของคุณใช้งานอยู่ (ดังนั้นหากฟังก์ชันของคุณถูกคัดลอกเนื้อหาของแต่ละวัตถุเหล่านี้จะแตกต่างกัน) วัตถุทั้งหมดเหล่านี้สามารถแก้ไขหรือล้างด้วยตนเอง ในการรับวัตถุเหล่านี้คุณมีผู้ทะเยอทะยานในชั้นเรียนของคุณ (เช่นgetLog())

สมุดเก็บรายการIPAddressแต่ละคนมีAddressTypeซึ่งช่วยให้คุณในการจำแนกประเภทที่แตกต่างกันอยู่ AddressBookจะมีที่อยู่อย่างน้อย 1 แห่งเสมอ (หากถูกล้างจะมีการเพิ่มที่อยู่แบบสุ่ม) การล้าง AddressBook ของคุณเพื่อรับIPAddressesหลายรายการไม่ได้รับอนุญาต

เข้าสู่ระบบจัดเก็บรายการของการกระทำทั้งหมดที่นำมาตลอดจนข้อมูลเกี่ยวกับการดำเนินการ นอกจากนี้ยังมีประวัติของการโจมตีที่ประสบความสำเร็จทั้งหมด (แม้ว่าคุณจะไม่รู้ว่าฟังก์ชั่นใดที่พวกเขาเขียนทับ)

ตัวแปรวัตถุช่วยให้คุณสามารถจัดเก็บตัวแปรสตริงที่แนบมากับชื่อสตริง เมื่อเริ่มเกมตัวแปรจะมีตัวแปรเดียวIDซึ่งมี ID ที่สร้างแบบสุ่มซึ่งไม่ซ้ำกับประเภทบ็อตของคุณ

คุณยังมีฟังก์ชั่นการเข้าถึงอื่น ๆ :

  • int getTurnNumber() ส่งคืนจำนวนเต็มด้วยเทิร์นปัจจุบัน
  • bool functionsMatch(ReadonlyBot, FunctionType) ทดสอบเพื่อดูว่าฟังก์ชั่น ReadonlyBot ตรงกับคุณหรือไม่
  • IPAddress personalAddress() ส่งคืน IPAddress ของคุณ

วิธีการใช้งาน

  • คุณสามารถรับรหัสได้จากGithub
  • เพิ่มบ็อตของคุณไปยัง\botsโฟลเดอร์จากนั้นเพิ่มการอ้างอิงถึงบ็อตของคุณcontroller\CodeBotFactory.java
  • บอทของคุณจะต้องขยายcodebots.bot.CodeBotหรือcodebots.bots.DefaultCodeBot
  • คุณต้องการ Java 8 หากคุณต้องการเรียกใช้คอนโทรลเลอร์
  • คุณสามารถเรียกใช้รหัส (สมมติว่าคุณอยู่ใน/srcโฟลเดอร์) โดยใช้javac codebots\*.javaการรวบรวมแล้วjava codebots.Mainเรียกใช้
  • คุณอาจจะไม่ต้องใด ๆตัวแปรสมาชิกที่ไม่คงที่ในชั้นเรียนของคุณ
  • ไม่อนุญาตการสะท้อนกลับ
  • ไม่อนุญาตให้ใช้รูปแบบการสื่อสารระหว่างบ็อต (ที่เป็นประเภทเดียวกันหรือแตกต่างกัน) นอกเมธอดด้านบน
  • อนุญาตให้ใช้บอทแบบใบ้และ / หรือฆ่าตัวตายได้ แต่บอตทั้งหมดควรทำงานแตกต่างจากรายการที่มีอยู่
  • หากคุณต้องการความสุ่มในบอทของคุณให้ใช้ 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!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 เพียงแค่ส่งเมลที่เป็นมิตรของคุณ
89.4645 null


คุณน่าจะทำให้ Log.LogEntry เป็นขั้นสุดท้ายซึ่งไม่ใช่ขั้นสุดท้ายฉันสามารถสร้างบันทึกที่มีข้อมูลใด ๆ ที่ฉันต้องการ ... ว่ามีเพียงฟังก์ชัน bot ของฉันเท่านั้นที่จะสามารถอ่านหรือสร้างได้
TheNumberOne

readData สามารถเข้าถึง IpAddress ของ bot ที่กำลังอ่านได้หรือไม่?
TheNumberOne

@TheNumberOne ไม่ได้อยู่ในขณะนี้ แต่ฉันไม่เห็นว่าทำไม ฉันยังไม่มีรหัสให้ฉันตอนนี้ แต่ฉันจะอัปเดตรหัสเพื่อเปลี่ยนแปลงสิ่งนั้น
Nathan Merrill

3
ฉันพบว่ามันน่าสนใจที่ Chaos สร้างสถานที่ค้าขาย DisarmBot และ MarkedBot บนกระดานผู้นำ
TheNumberOne

1
ขณะนี้อยู่ในรอบ 7850 จาก 10,000 ได้รับคะแนนที่แม่นยำมากขึ้น ...
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

AmnesiaBot

บอทสุ่มที่อัดบ็อตอื่นด้วยรหัสการสูญเสียหน่วยความจำ แต่ละฟังก์ชั่นเริ่มต้นด้วยรหัสเพื่อล้างบันทึกสมุดที่อยู่และตัวแปร รหัสนี้จะทำให้บอตอัจฉริยะสูญเสียความจำในความพยายามที่จะกำจัดตรรกะ

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

ฉันคิดว่าอันนี้ชนะเพียงเพราะไม่สามารถสคริปต์ที่ชาญฉลาดเพื่อให้สามารถจดจำอะไรได้ เช่นการล้างออบเจ็กต์ตัวแปรนั้นมีประสิทธิภาพมาก
Draco18s

@ draco18s นี่ไม่ใช่คำตอบที่จริงจังจริง ๆ ...
MegaTom

ฉันรู้ว่า! นั่นเป็นเหตุผลที่ฉันสับสนมาก XD
Draco18s

3

NullBot

ธงของเขาเป็นอย่างมาก ... ลักษณะ ...

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

นี่ยังหมายถึงการทดสอบตัวควบคุมและข้อ จำกัด ของกฎ "อนุญาตบอทโง่"


ในทางเทคนิคเขาไม่เหมาะกับสเปคเพราะเขาไม่ได้คืนสตริงสำหรับธงของเขา
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 ไม่ฉลาดเกินไป หากได้รับคำแนะนำในการโจมตีมันจะเลือกผู้โจมตีแบบสุ่มมิฉะนั้นจะโจมตีผู้เล่นแบบสุ่ม มันก็จะแทนที่พวกเขาฟังก์ชั่นเพื่อป้องกัน selectFunctionToBlockselectFunctionToBlock

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

คุณสามารถเลือกที่อยู่ที่ 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();
    }
}

ฉันพบข้อบกพร่องหลายอย่างในบอตนี้ (พิมพ์ผิดโดยใช้ == แทนที่จะเท่ากับ) คุณยังพบข้อบกพร่องในระบบของฉัน: คุณไม่ควรสร้าง IPAddresses แบบสุ่มใหม่ ฉันได้แก้ไขปัญหานั้นแล้ว (และลบรหัสที่ทำไป) คุณสามารถค้นหารหัสที่อัปเดตได้ที่github
Nathan Merrill

นอกจากนี้ขอแสดงความยินดีกับจุดสูงสุด!
Nathan Merrill

HelperBot ไม่ฉลาดมาก มันขึ้นอันดับแล้วเท่านั้นเพราะบอทอื่น ๆ นั้นเป็นใบ้ : P นี่อาจเป็นบอทที่มีประสิทธิภาพตัวแรก
Draco18s

1
@NathanMerrill นั่นหมายความว่าเราไม่ได้รับอนุญาตให้สร้างที่อยู่ IP ปลอมแปลงสำหรับการหลอกลวงอีกต่อไป? (ถ้าเป็นอย่างนั้นฉันจะต้องออกแบบเหมืองใหม่)
Nic Robertson

บอทไม่สามารถเข้าถึงรอบได้อย่างจงใจ คุณสามารถใช้ที่อยู่ IP ของคู่ต่อสู้เป็นเครื่องปลอมได้ แต่ไม่อนุญาตให้สร้างที่อยู่ IP นอกจากนี้ค่าคงที่เป็นชุดตัวแปร ณ เวลาคงที่หรือเวลาเริ่มต้น
Nathan Merrill

2

SwarmBot

บอทที่มีชื่อไม่ดีนี้ค่อนข้างซับซ้อน (และซับซ้อนที่สุดที่ส่งมาจนถึงตอนนี้) แต่ฉันพยายามบอทที่แทนที่วิธีการทั้งหมดของเป้าหมายอย่างเป็นระบบก่อนที่จะย้ายไปยังเป้าหมายใหม่ มันพยายามที่จะระบุสำเนาของตัวเองและปฏิบัติต่อพวกเขาเป็นพันธมิตรตรวจสอบพวกเขาเป็นระยะเพื่อประกันความซื่อสัตย์ ฉันไม่ได้คิดชื่อที่ดีกว่านี้

เชื่อมโยงไปยังสาขา repit GitHub เนื่องจากบอทนี้มีความยาว 340 บรรทัด

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

ประเด็นที่น่าสนใจบางประการ:

  • บรรทัดที่ 14-24 เป็นเพียงรายการที่ไม่สามารถแก้ไขได้ซึ่งทำให้ง่ายต่อการปรับแต่งลำดับการที่บอทมาแทนที่วิธีการของเป้าหมาย มันเก็บดัชนีที่เปิดVariablesและเพิ่มขึ้นในแต่ละรอบ สิ่งนี้ควรเป็นไปตามกฎ "ไม่มีตัวแปรที่ไม่คงที่"
  • บรรทัดที่ 203-217 จัดการกับการตรวจสอบพันธมิตร เราไม่สนใจว่า ธ ปท. คนอื่นจะใช้ทั้งแปดคำสั่งของเรา มีเพียงสี่คนเท่านั้นที่จำเป็นและหากเราขาดพันธมิตรที่เชื่อถือได้เราจะแทนที่ด้วยพันธมิตรของเราเอง
  • บรรทัดที่ 295-300 มีประสิทธิภาพที่คาดไม่ถึง ด้วยการปกป้องธงของเราในสองรอบแรกของเกมเราจะหลีกเลี่ยงบอทโง่แทนที่ธงของเราก่อนที่เราจะมีโอกาสแพร่กระจายไปไกลมาก อย่างไรก็ตามการรออีกต่อไปให้โอกาสบอทอื่น ๆ เพื่อแทนที่ BlockFunction ของเราและทำให้ประสิทธิภาพลดลง (สงสัยว่าเป็นเพราะ RandomBot แทรกแซงพันธมิตรที่พยายามยกเลิกการทุจริต)
  • เป็นเวลานานที่สุดในการพัฒนาบอทบ็อตนี้ส่งผลให้เฮลเพอร์บอทพุ่งไปข้างหน้าจนถึงจุดหนึ่งที่ทำลายเครื่องหมาย 130 คะแนนในขณะที่บอทนี้อ่อนตัวลงในช่วง 81-98 แต่ลากประสิทธิภาพ MarkedBot และ DefaultBot ลงหลายจุด
  • บอทนี้สามารถทำได้ด้วยfunctionsMatchวิธีการที่เพิ่มเข้ามาเท่านั้น หากปราศจากfunctionsMatchมันเป็นไปไม่ได้ที่จะเขียนบอทที่สามารถทำการตัดสินใจที่สื่อความหมายได้เหมือนตาบอด มันสามารถอ่านตัวแปรเป้าหมายและบันทึก แต่ไม่ทราบสถานะของเป้าหมาย

ยังมีการปรับปรุงอยู่บ้างที่เป็นไปได้ แต่ฉันมองไม่เห็น บรรทัด 198-205 อาจเป็นหมูประสิทธิภาพ แต่จนกว่าคลาส IPAddress จะอนุญาตให้สร้างที่อยู่ใหม่จากการจัดเก็บในตัวแปรสิ่งนี้เป็นสิ่งจำเป็น (เนื่องจากบอตไม่มีวิธีการตรวจสอบที่อยู่การจัดเก็บที่อยู่ที่ไม่ถูกต้องจะทำให้เกม ล้อมเป้าหมายเป็นโมฆะใน ReadOnlyBot โดยโยน NPE)

แก้ไข: อัปเดต 12/12/15

การปรับแต่งพารามิเตอร์บางอย่างบนgetTurnNumber()ตรรกะอนุญาตให้เพิ่มประสิทธิภาพได้บ้าง เพิ่มขึ้นจาก 5% เป็น 10% ในการกำหนดเป้าหมายเกมจบมีค่าประมาณ 15 คะแนนเช่นเดียวกันเพิ่มการกำหนดเป้าหมายเกมแรกจาก 5% เป็น 8% เมื่อรวมกับบอทนี้จะสามารถเอาชีวิตรอดได้แม้เมื่อเผชิญหน้ากับ AmnesiaaBot (ขึ้นอันดับ 2 ด้วยคะแนน 110 ซึ่งเฮลเพอร์บอทได้มาถึง 117)

แม้จะมีการปรับแต่งเหล่านี้ก็สามารถรับโชคร้ายดังนั้นสำหรับรอบ 10 มันช่วงคะแนนคือประมาณ 170-185


! น่ากลัว เป็นความตั้งใจที่คุณไม่สามารถสร้างที่อยู่ IP จากสตริง
Nathan Merrill

ดีโอ้อวดใช่! (หรือบ็อตจะสร้างไฟล์ใหม่ขึ้นมาเพื่อค้นหาบ็อตใหม่) ปัญหาคือว่าถ้าคุณทำแบบจำลองการล่ม ;)
Draco18s

อืมในบรรทัด 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

HelperBot

ธ ปท. ช่วยไม่ได้ทำอะไรนอกจากพยายามกระจายธงของตนเอง ... หรืออย่างน้อยก็มีการกำหนดสถานะปัจจุบัน ...

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

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 ของผู้ส่ง แต่นั่นจะเกี่ยวข้องกับการใช้งานตัวแปรอย่างหนัก


1

DumbBot

ฮึนี้รู้สึกสกปรก นี่น่าจะเป็นสิ่งเดียวที่เต้น 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

Bot ฤาษี

เขาอยู่คนเดียวและพูดกับตัวเองเท่านั้น ถ้าคนน้อยรู้ว่าเขาเป็นใครเขาก็จะถูกรบกวนน้อยลง หากมีใครรบกวนเขาเขาจะโจมตีเขาจนกว่าคนอื่นจะรบกวนเขา

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.