Kod Botları 4: İşlevsel Programlama


25

Sheesh, bu gerçekten dördüncü mü? Hepiniz yaşlılar için, temel zorluk aynı, ancak Java'yı özel bir dil yerine kullanıyoruz. İlgilendiğiniz takdirde işte son üç CodeBot mücadelesi .

CodeBots’un amacı botunuzu mümkün olduğunca viral yapmaktır . Her bot bir Bayrak taşır ve Bayrağının her yerde olduğundan emin olmalısın .

API

Botlar standart bir "protokol" izleyecek ve botlar senkronize olarak aşağıdaki adımlar boyunca ilerleyecektir:

  1. IPAddress selectMessageRecipient() Bir botun "dost" bir mesaj yollamak istediğini seçmesine izin verir.
  2. Message sendMessage() Bir botun göndereceği mesajın içeriğini seçmesine izin verir.
  3. processMessage(IPAddress, Message) Bir bot aldığı her mesaj için çağrılır.
  4. FunctionType selectFunctionToBlock()bir işlevin geçerli dönüş için üzerine yazılmasını engeller. 7. adıma bakınız.
  5. IPAddress selectAttackTarget()Bir botun DDOS'u kimin istediğini seçmesine izin veriyor Bot aynı anda 3 bot tarafından hedeflenirse, bir DDOS saldırısı başarılı olur. Bir saldırı başarılı olursa, saldırganların her biri 6. ve 7. adımları gerçekleştirebilir.
  6. readData(ReadonlyBot) Bir botun savunmasız botta depolanan verileri okumasını sağlar.
  7. FunctionType selectFunctionToReplace()bu zorluğun bir parçası . Botunuzdan botlarına kopyalamak için 1 işlev (burada listelenen 8) arasından seçim yapabilirsiniz. Ardından, işlevleriniz yerine onların yerine çağrılır . Birden fazla bot aynı işlevi seçerse, rastgele bir başarılı olur.
  8. String getFlag()Oyunun sonunda denir ve sizin gönderiminiz için benzersiz bir dize döndürmelidir. İşleviniz daima aynı dizgeyi döndürmelidir. Oyunun sonunda en çok bayrak bulunan yazı kazanır.

Depolama

3 depolama biçiminiz, bir Adres Defteri , İşlem Kaydı ve Değişkenleriniz var . Bu depolama biçimleri, işlevinizin üzerinde çalıştığı bot için yereldir (yani işleviniz kopyalanırsa, bu nesnelerin her birinin içeriği farklı olacaktır). Bu nesnelerin tümü manuel olarak değiştirilebilir veya silinebilir. Bu nesneleri elde etmek için sınıfınızda bir alıcı vardır (örn. getLog()).

Adres listesini saklar IPAddress bir ile, her AddressType Adresleri farklı türde sınıflandırmak için izin verir. Adres Defteri her zaman en az 1 adres içerecektir (temizlenirse, rastgele bir adres eklenecektir). Birden fazla IP Adresi almak için Adres Defterinizi silmenize izin verilmez.

Giriş eylemleriyle ilgili bütün yapılan işlemler, hem de verilerin listesini saklar. Ayrıca, tüm başarılı saldırıların geçmişini de içerir (hangi işlevlerin üzerine yazıldığını bilmiyor olsanız da)

Değişkenler nesne bir dize adına ekli dize değişkenleri saklamak için izin verir. Oyunun başlangıcında, Değişkenler , IDbot tipinize özgü, rastgele oluşturulmuş bir ID içeren tek bir değişken içerecektir .

Ayrıca başka erişim işlevleriniz de vardır:

  • int getTurnNumber() geçerli dönüşle bir tamsayı döndürür
  • bool functionsMatch(ReadonlyBot, FunctionType) ReadonlyBot işlevinin sizinkiyle eşleşip eşleşmediğini görmek için sınamalar
  • IPAddress personalAddress() IP Adresinizi döndürür

Nasıl uygulanır

  • Kodu Github'dan alabilirsiniz.
  • Botunuzu \botsklasöre ekleyin ve ardından botunuza bir referans ekleyin.controller\CodeBotFactory.java
  • Botunuz uzatmalı codebots.bot.CodeBotveyacodebots.bots.DefaultCodeBot
  • Denetleyiciyi çalıştırmak istiyorsanız Java 8'e ihtiyacınız var.
  • Derlemeyi ve ardından çalıştırmayı /srckullanarak kodu ( klasörde olduğunuzu varsayarak ) çalıştırabilirsiniz.javac codebots\*.javajava codebots.Main
  • Sen olabilir yok herhangi olmayan sabit üye değişkenleri sınıfınızda
  • Yansıma izin verilmez.
  • Yukarıda listelenen yöntemlerin dışında botlar (aynı veya farklı türlerde) arasında iletişim şekillerine izin verilmez.
  • Salak ve / veya İntihar botlarına izin verilir, ancak tüm botlar işlevsel olarak mevcut kayıtlardan farklı olmalıdır.
  • Botunuzda rastgelelik istiyorsanız, getRandom()
  • Lütfen kodunuzu verimli tutmaya çalışın. Çok fazla zaman harcadım ve kontrol cihazını hızlı hale getirdim.

Skorlar

105.2501 Expelliarmus!
104.5803 Yardım ediyorum!
104.2746 Ben Kimim?
103.8529 Aptal Bot
103.2028 Replacer
102.7045 Kaos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 Rastgele bot seni seviyor
99.966 Güven'e güven!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Sadece dost mahalle postanızı robot teslim edin.
89.4645 boş


Muhtemelen Log.LogEntry finalini yapmalısınız, final değilken istediğim herhangi bir bilgiyle günlükleri oluşturabilirim ... sadece bot fonksiyonumun okuyabileceği veya yaratabileceği.
TheNumberOne

ReadData, okuduğu botun IpAdresine erişebilir mi?
TheNumberOne

@TheNumberOne şu anda değil, ancak neden olmadığını anlamıyorum. Şu anda üzerimde kod yok, ancak kodu değiştirmek için kodu güncelleyeceğim.
Nathan Merrill,

3
Chaos'un DisarmBot ve MarkedBot ticaretini lider panosunda yapmasını ilginç buluyorum.
TheNumberOne

1
Şu anda 10000 üzerinden
7850. Turda

Yanıtlar:


4

TrustBot

Ona bir mesaj gönderirsen, söylediklerini yapar. Bir bot okursa, adresleri doğrudan kitabına kopyalar. Adres defterine saldırdığını söylediği botlara saldırıyor.

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

Bellek kaybı kodu ile diğer botlara enjekte eden rastgele bir bot. Her işlev, günlüğü, Adres Defteri'ni ve Değişkenleri temizlemek için kodla başlar. Bu kod, akıllı botların mantığı ortadan kaldırmak amacıyla hafızasını kaybetmesine neden olur.

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

Bence bu sadece daha akıllı bir betiğin hiçbir şeyi hatırlayamayacağının yetersizliği nedeniyle kazanıyor. yani Değişkenler nesnesini temizlemek gerçekten çok güçlü.
Draco18,

@ draco18s, bu gerçekten ciddi bir cevap olarak
görülmüyordu

Biliyorum! Bu yüzden kafam karıştı. XD
Draco18s

3

NullBot

Bayrağı çok ... karakteristik ...

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

Bu aynı zamanda kontrol cihazını ve "aptal botlara izin verilir" kuralının sınırlarını test etmek içindir.


Teknik olarak şartnameye uymuyor çünkü bayrak için bir String döndürmedi.
TheNumberOne

3
nullbir dizedir. ;) Sadece süslü bir ip.
Addison Crump,

Bu benim belirtmemdeki belirtilmiş bir hatayı fark etmemi sağladı: “tüm botlar mevcut girdilerden işlevsel olarak farklı olmalı”
Nathan Merrill

@NathanMerrill Spesifikasyonu daha yakından takip etmek için düzeltildi.
TheNumberOne

3

RandomCodeBot

Zorunlu rastgele KoTH girişi

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 çok akıllı değil. Saldırı talimatı alırsa, rastgele bir saldırgan seçecektir, aksi takdirde rastgele bir oyuncuya saldıracaktır. Sadece engelleme selectFunctionToBlockişlevini geçersiz kılar 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!"; }
}

Tüm Adresleri () yapmanıza gerek kalmadan nth adresini seçebilirsiniz. Eğer rastgele botuma bakarsanız, rastgele adres seçimi yapıyor. Github kodunuzu (verimlilik nedenleriyle) güncelledim, ancak çalışmadığını düşünüyorsanız, geri döndüğüm için mutluyum.
Nathan Merrill,

Oh, benim kötü, sabit.
Nathan Merrill,

3

MarkedBot

İlk turda kendisini işaretler ve bu bilgiyi daha sonraki turlarda kullanır. Bu şekilde, başka bir bot saldırı koduyla enjekte edilirse, etkisiz kalacaktır.

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

Bu botta birkaç hata buldum (yazım hataları, eşittir yerine == kullanarak) Ayrıca sistemimde bir kusur buldunuz: yeni rastgele IP Adresleri oluşturamamalısınız. Bu sorunu düzelttim (ve bunu yapan kodu kaldırdım). Güncellenmiş kodu github'da
Nathan Merrill

Ayrıca, en üst noktada tebrikler!
Nathan Merrill,

HelperBot çok akıllı değil. Sadece üst oldu çünkü diğer botlar aptaldı. : P Bu muhtemelen ilk etkili bot.
Draco18,

1
@NathanMerrill Bu artık aldatma için sahte IP Adresleri oluşturmamıza izin verilmediği anlamına mı geliyor? (eğer durum buysa, benimkini yeniden tasarlamam gerekecek)
Nic Robertson

Bir bot asla tura asla kasıtlı giremez. Sahte IP adreslerini sahtecilik olarak kullanabilirsiniz, ancak bir tane oluşturmaya izin verilmez. Ayrıca, sabit, statik zamanda veya başlatma zamanında ayarlanan bir değişkendir.
Nathan Merrill,

2

SwarmBot

Bu iyi adlandırılmamış bir bot oldukça karmaşıktır (ve şimdiye kadar gönderilen en karmaşık olanı), ancak bir botta yeni bir hedefe geçmeden önce bir hedefin tüm metotlarını sistematik olarak değiştiren bir girişimde bulundum. Kendisinin kopyalarını belirlemeye ve müttefik olarak davranmaya çalışır, düzenli olarak bütünlüğü güvence altına almak için kontrol eder. Daha iyi bir isim bulamadım.

Bu bot 340 satır uzunluğunda olduğu için github repo şubesine bağlantı.

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

Birkaç ilginç nokta:

  • Çizgiler 14-24, sadece botun hedefindeki metotların yerine koyma sırasını değiştirmeyi kolaylaştıran değiştirilemez bir listedir. İçinde dizini olan Variablesher bir turdaki yerini arttırır ve arttırır. Bu "sabit olmayan değişken yok" kuralına uymalıdır.
  • 203-217 numaralı hatlar müttefik doğrulama ile ilgilidir. Aslında başka bir botun sekiz talimatımızın tümünü yerine getirmesini umursamıyoruz . Sadece dördüncüsü şarttır ve birini "güvenilen" bir müttefikte kaçırırsak, kendimizle değiştiririz.
  • 295-300 no'lu hatlar etkinlikte beklenmeyen bir artış oldu. Bayrağımızı, oyunun ilk iki turunda koruyarak, çok uzağa yayılma şansımız olmadan Bayrağımızı değiştirmek için aptal botlardan kaçınırız. Bununla birlikte, daha uzun süre beklemek, diğer botlara BlockFunction'ımızı değiştirme fırsatı verir ve performansın düşmesine neden olur (RandomBot'un yolsuzluğu geri almaya çalışan müttefikleriyle etkileşime girmesi nedeniyle).
  • Bu botun gelişimi sırasında en uzun süre, bu bot HelperBot'un bir noktada 130 işaretini kırarak yükselmesine neden olurken, bu bot 81-98 aralığında kayboldu, ancak MarkedBot ve DefaultBot'un etkinliğini birkaç noktaya indirdi.
  • Bu bot sadece eklenen functionsMatchyöntemle mümkündü . Olmadan functionsMatch, kör olduğu için anlamlı kararlar verebilecek bir bot yazmak imkansızdı. Hedef değişkenlerini ve kayıtlarını okuyabilir, ancak hedefinin durumu hakkında hiçbir şey bilmiyordu.

Muhtemelen hala bazı gelişmeler olabilir, ancak bunları göremiyorum. 198-205 hatları büyük olasılıkla bir performans domuzudur, ancak IPAdresi sınıfı adreslerin Değişkenler'de saklanmasına izin verinceye kadar, bu gereklidir (botların bir adresi doğrulama aracı olmadığı için, geçersiz bir adresin saklanması oyunun ortaya çıkmasına neden olur) NPE atma, ReadOnlyBot boş bir hedef kaydırın.

Düzenleme: Güncellemeler 12/12/15

getTurnNumber()Mantıktaki bazı parametrelerin ince ayar yapılması, bazılarında performans artışına izin verir. Oyun sonu hedeflemesinde% 5'ten% 10'a yükselme yaklaşık 15 puan değerindeydi, aynı zamanda oyun öncesi hedeflemeyi de% 5'ten% 8'e çıkardı. Bu bot, şimdi (neredeyse) AmnesiaaBot'la karşılaştığında bile hayatta kalabilir (HelperBot'un 117'ye ulaştığı 110 puanla 2. olan).

Bu tweaks ile bile, şanssız olabilir, bu yüzden 10 tur için onun puan aralığı yaklaşık 170-185.


Müthiş! Dizelerde IP Adresleri oluşturamayacağınız kasıtlıdır.
Nathan Merrill

Görünüşe göre evet! (Veya botlar, yeni botları bulmak için keyfi olanlar yaratacaktır). Sorun simülasyonu yaparsanız çöker. ;)
Draco18s

Urm, 143 hatta var olmayan bir kurucu kullanıyorsun.
TheNumberOne

@TheNumberOne bunu yazdığımda geçerliydi. Nathan muhtemelen üssünü güncelledi.
Draco18,

@TheNumberOne güncellemesi yapıldı. new IPAddressBen de yapmıştı olarak çağrı, bir "adres defterinden aramak" olmalıydı readData. Çizgiyi 143. o arama çıkarılan ve sabit
Draco18s

1

DefaultCodeBot

Makul şeyler yapmaya çalışır. (Tüm işlevleri uygulamak istemiyorsanız bu sınıfı geçersiz kılın)

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

Yardımcı bot hiçbir şey yapmaz ama kendi bayrağını ya da en azından şu an carying olan bayrağını yaymaya çalışır ...

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, üzerine yazılmış (kendisinden başka getFlag()) herhangi bir yöntemin daha iyi bir şeyle değiştirileceğini varsayar .


1

Kaos

Tüm bayrakları tıkanma zulmünden kurtarıyor.

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

Replacer

Bu giriş tüm selectFunctionToReplacefonksiyonları kendi selectFunctionToReplacefonksiyonlarıyla değiştirir.

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 sadece mesajları yönetir. Kendi bayrağını dünyaya çıkarmakta başarılı değildir (ortalama puan ~ 50, nullbot'dan ~ 45 biraz daha yüksektir), ancak bir mesaj gönderin ve adresinizi başkalarına iletir.

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

Ayrıntıları kaydetmeyi düşündüm, böylece tüm mesajlaşmayı yalnızca gönderenin IP'sinden ziyade yeni bir bot'a (içerik ve bayrak) iletebilecektim , ancak bu, özellikle AmnesiaBot'un oyunda olduğunu düşünerek, herhangi bir işlevsel kazanç olmadan Değişkenlerin yoğun şekilde kullanılmasını gerektirecekti.


1

DumbBot

Bu kirli hissettiriyor. AmnesiaBot'u yenen tek şey bu olabilir. Gerçekte, sadece uzmanlaşan bir RandomBot: simülasyonda rastgele bir bot alır (via getAddressBook().clear()) ve rastgele Blok işlevini veya Bayrak işlevini değiştirir. Bu kadar. Sadece bu ikisini seçerek, bayrak yayılma oranı AmnesiaBot veya HelperBot'tan daha yüksek, ancak 3000 turdan biraz sonra:

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

Değişim işleviyle biraz uğraştım, ama sonuçta, bu en başarılı sürüm.

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

Münzevi Bot

Yalnız yaşıyor ve sadece kendisiyle konuşuyor. Daha az insan onun kim olduğunu biliyorsa, o zaman daha az rahatsız olacaktır. Biri onu rahatsız ederse, birileri onu rahatsız edinceye kadar onlara saldıracak.

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";
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.