কোড বটস 4: ফাংশনাল প্রোগ্রামিং


25

শীশ, এটি কি সত্যিই চতুর্থ? আপনার সমস্ত বৃদ্ধদের জন্য, মূল চ্যালেঞ্জ একই, তবে আমরা একটি কাস্টম ভাষার পরিবর্তে জাভা ব্যবহার করছি। আপনার আগ্রহের ক্ষেত্রে এখানে বিগত তিনটি কোডবোট চ্যালেঞ্জ রয়েছে।

কোডবটসের লক্ষ্য হ'ল আপনার বটকে যতটা সম্ভব ভাইরাল করা । প্রতিটি বট একটি পতাকা বহন করে, এবং আপনি নিশ্চিত করুন যে আপনার পতাকা করতে হবে সর্বত্র

এপিআই

বটগুলি একটি প্রমিত "প্রোটোকল" অনুসরণ করবে এবং নীচের পদক্ষেপের সাথে সুসংগতভাবে বোটগুলি অগ্রগতি করবে:

  1. IPAddress selectMessageRecipient() বট কে চয়ন করতে দেয় যে সে কে "বন্ধুত্বপূর্ণ" বার্তা প্রেরণ করতে চায়।
  2. Message sendMessage() কোনও বটকে বার্তা পাঠানোর বিষয়বস্তু চয়ন করতে অনুমতি দেয় choose
  3. processMessage(IPAddress, Message) বট প্রাপ্ত প্রতিটি বার্তার জন্য ডাকা হয়।
  4. FunctionType selectFunctionToBlock()বর্তমান টার্নের জন্য ওভাররাইট করা থেকে একটি ফাংশন আটকে দেয়। পদক্ষেপ 7 দেখুন।
  5. IPAddress selectAttackTarget()কোন বটকে তিনি ডিডিএস করতে চান তা চয়ন করতে অনুমতি দেয়। DDOS আক্রমণ সফল হয় যদি বট একই সাথে 3 টি বট দ্বারা চিহ্নিত করা হয়। যদি কোনও আক্রমণ সফল হয়, তবে আক্রমণকারীদের প্রত্যেকে 6 এবং 7 পদক্ষেপ করতে পারে perform
  6. readData(ReadonlyBot) কোনও বটকে অরক্ষিত বটগুলিতে সঞ্চিত ডেটা পড়ার অনুমতি দেয়।
  7. FunctionType selectFunctionToReplace()এই চ্যালেঞ্জের শিরা । আপনার বট থেকে তাদের বটে অনুলিপি করতে আপনাকে 1 টি ফাংশন (এখানে তালিকাভুক্ত 8 টির মধ্যে) বাছাই করার অনুমতি দেওয়া হয়েছে। তারপরে, আপনার ফাংশনটি তাদের পরিবর্তে ডাকা হবে । যদি একাধিক বট একই ফাংশনটি নির্বাচন করে তবে একটি এলোমেলো সফল হবে।
  8. String getFlag()গেমের শেষে বলা হয়, এবং আপনার জমা দেওয়ার মতো একটি স্ট্রিং ফিরিয়ে আনা উচিত। আপনার ফাংশনটি সর্বদা একই স্ট্রিংটি ফেরত পাঠায়। গেমের শেষে সর্বাধিক পতাকা সহ জমাটি জয়লাভ করে।

সংগ্রহস্থল

আপনার কাছে 3 টি স্টোরেজ, একটি ঠিকানাবুক , একটি লগ এবং একটি ভেরিয়েবল রয়েছেআপনার ফাংশনটি চলমান বটটিতে এই ফর্মগুলির সঞ্চয় স্থানটি স্থানীয় (তাই যদি আপনার ফাংশনটি অনুলিপি করা হয় তবে এই বস্তুর প্রত্যেকটির বিষয়বস্তু আলাদা হবে)। এই সমস্ত অবজেক্ট ম্যানুয়ালি সংশোধন বা সাফ করা যেতে পারে। এই অবজেক্টগুলি পেতে, আপনার ক্লাসে একটি গিটার রয়েছে (উদাঃ getLog())।

ঠিকানার বই একটি তালিকা সঞ্চয় করে IPADDRESS একটি সঙ্গে, প্রতিটি AddressType , যা আপনি ঠিকানাগুলি বিভিন্ন ধরনের শ্রেণীভুক্ত করতে পারবেন। ঠিকানার বই সবসময় অন্তত 1 টি ঠিকানা উপস্থিত থাকবে (যদি এটি সাফ করা হয়, একটি র্যান্ডম এক যোগ করা হবে)। একাধিক আইপিএড্রেসগুলি পেতে আপনার ঠিকানাবুক সাফ করার অনুমতি নেই।

লগিন ব্যবস্থা নেওয়া সমস্ত ক্রিয়া, সেইসাথে তথ্য একটি তালিকা সঞ্চয় করে। এটিতে সমস্ত সফল আক্রমণের ইতিহাসও রয়েছে (যদিও আপনি জানেন না যে তারা কোন কার্যগুলি ওভাররোট করে)

ভেরিয়েবল বস্তুর আপনি STRING একটি স্ট্রিং নাম সংযুক্ত ভেরিয়েবল সঞ্চয় করতে দেয়। গেম শুরুর সময়, চলকগুলিতে একটি একক ভেরিয়েবল থাকবে,ID , যা এলোমেলোভাবে উত্পাদিত আইডি থাকে যা আপনার বট ধরণের স্বতন্ত্র।

আপনার অন্যান্য অ্যাক্সেস ফাংশন রয়েছে:

  • int getTurnNumber() বর্তমান টার্নের সাথে একটি পূর্ণসংখ্যা ফেরত দেয়
  • bool functionsMatch(ReadonlyBot, FunctionType) রিডনলিবটের ফাংশনটি আপনার সাথে মেলে কিনা তা পরীক্ষা করে
  • IPAddress personalAddress() আপনার আইপিএড্রেস ফেরত দেয়

কীভাবে বাস্তবায়ন করা যায়

  • আপনি গিথুব থেকে কোডটি পেতে পারেন
  • আপনার বটটি \botsফোল্ডারে যুক্ত করুন এবং তারপরে আপনার বটটিতে একটি রেফারেন্স যুক্ত করুনcontroller\CodeBotFactory.java
  • আপনার বট অবশ্যই বাড়াতে হবে codebots.bot.CodeBotবাcodebots.bots.DefaultCodeBot
  • আপনি জাভা 8 প্রয়োজন যদি আপনি নিয়ামকটি চালাতে চান।
  • আপনি কোডটি চালাতে পারেন (ধরে নিচ্ছেন আপনি /srcফোল্ডারে আছেন) javac codebots\*.javaসংকলন ব্যবহার করে, তারপরে java codebots.Mainচালাতে পারেন।
  • আপনি পারে না কোনো অ ধ্রুবক সদস্য ভেরিয়েবল আপনার ক্লাসে
  • প্রতিবিম্ব অনুমোদিত নয়।
  • উপরে তালিকাভুক্ত পদ্ধতিগুলির বাইরে বটগুলির মধ্যে (একই বা বিভিন্ন ধরণের) যোগাযোগের ফর্মগুলি অনুমোদিত নয়।
  • বোবা এবং / অথবা আত্মঘাতী বটগুলি অনুমোদিত, তবে সমস্ত বটগুলি বিদ্যমান এন্ট্রিগুলির তুলনায় কার্যত পৃথক হওয়া উচিত।
  • আপনি যদি আপনার বট এলোমেলোতা চান তবে ব্যবহার করুন getRandom()
  • আপনার কোড দক্ষ রাখতে চেষ্টা করুন। আমি প্রোফাইলিং এবং নিয়ামককে দ্রুত তৈরি করতে বেশ ভাল সময় ব্যয় করেছি।

স্কোর

105.2501 এক্সপেলিয়ার্স!
104.5803 আমি সহায়তা করছি!
104.2746 আমি কে?
103.8529 বোবা বোট
103.2028 Replacer
102.7045 বিশৃঙ্খলা
102.4046 হারমেট বট
102.2849 Swarmer
100.5598 এলোমেলো বট আপনাকে ভালোবাসে
99.966 আস্থা বিশ্বস্ত!
99.0185 কোডবটস.বটস.ডাফল্টকোডবট
91.2942 কোডবটস.বটস.মার্কডবট
91.1423 কেবল আপনার বন্ধুত্বপূর্ণ প্রতিবেশীর মেইল ​​সরবরাহকারী রোবট।
89.4645 নাল


আপনার সম্ভবত লগ.লগএন্ট্রি চূড়ান্ত করা উচিত, এটি চূড়ান্ত না হয়ে আমি যে কোনও তথ্য দিয়ে চাইলে লগ তৈরি করতে পারি ... কেবল আমার বট ফাংশনটি পড়তে বা তৈরি করতে সক্ষম হবে।
TheNumberOne

এটি পড়ছে বট যে আইপিএড্রেস পড়ছে তা ডেটা পড়তে পারে?
TheNumberOne

@ নাম্বারওন বর্তমানে নেই, তবে কেন নেই তা দেখছি না। আমার কাছে এখনই কোড নেই, তবে আমি এটি পরিবর্তন করতে কোডটি আপডেট করব।
নাথান মেরিল

3
আমি এটি আকর্ষণীয় মনে করি কেওস লিডার বোর্ডে ডিসারমবট এবং মার্কডবট বাণিজ্য স্থান তৈরি করে।
TheNumberOne

1
বর্তমানে 10000 এর মধ্যে 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

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

আমি মনে করি এটি কেবল একটি স্মার্ট স্ক্রিপ্টের কোনও কিছু মনে রাখতে সক্ষম হওয়ার অক্ষমতার কারণে জিতবে। অর্থাত্ ভেরিয়েবল অবজেক্টটি সাফ করা সত্যিই জোরালো।
ড্রাকো 18

@ draco18s এটি কোনও গুরুতর জবাব হওয়া সত্যিই হতাশ নয় ...
মেগাটম

আমি জানি! এ কারণেই আমি এতে এত বিভ্রান্ত হয়ে পড়েছি। এক্সডি
ড্রাকো 18

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একটি স্ট্রিং। ;) কেবল অভিনব একটি স্ট্রিং।
অ্যাডিসন ক্রম্প

এটি আমাকে আমার অনুমানের একটি ত্রুটি সনাক্ত করতে বাধ্য করে, যা উল্লেখ করা হয়েছে: "সমস্ত বটগুলি বিদ্যমান এন্ট্রিগুলির তুলনায় কার্যত পৃথক হওয়া উচিত"
নাথান মেরিল

@ নাথানমেরিল এই অনুমানটি আরও ঘনিষ্ঠভাবে অনুসরণ করতে স্থির করেছেন।
TheNumberOne

3

RandomCodeBot

বাধ্যতামূলক এলোমেলোভাবে কোএটিএইচ এন্ট্রি

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

ডিসারমারবট খুব বুদ্ধিমান নয়। যদি এটি আক্রমণ সংক্রান্ত নির্দেশাবলী গ্রহণ করে তবে এটি একটি এলোমেলো আক্রমণকারী চয়ন করবে, অন্যথায় এটি কোনও এলোমেলো খেলোয়াড়কে আক্রমণ করবে। এটি কেবল তাদের 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!"; }
}

আপনি সমস্ত ঠিকানাগুলি () না করেই নবম ঠিকানাটি নির্বাচন করতে পারেন। আপনি যদি আমার এলোমেলো বট দিকে তাকান তবে এটি এলোমেলো ঠিকানা নির্বাচন করছে। আমি আপনার কোডটি গিথুবে আপডেট করেছি (দক্ষতার কারণে), তবে আপনি যদি মনে করেন যে এটি কাজ করে না তবে আমি এটি পুনরায় ফিরিয়ে আনতে পেরে খুশি।
নাথান মেরিল

ওহ, আমার খারাপ, স্থির।
নাথান মেরিল

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

আমি এই বটটিতে বেশ কয়েকটি বাগ খুঁজে পেয়েছি (টাইপস, সমতুল্যের পরিবর্তে == ব্যবহার করে) আপনি আমার সিস্টেমে একটি ত্রুটিও পেয়েছেন: আপনি নতুন এলোমেলো আইপিএড্রেস তৈরি করতে সক্ষম হবেন না। আমি এই সমস্যাটি স্থির করেছি (এবং কোডটি এটি করে দিচ্ছে)। আপনি গিথুবে
নাথান মেরিল

এছাড়াও শীর্ষ স্থানগুলিতে অভিনন্দন!
নাথান মেরিল

হেল্পারবট খুব স্মার্ট নয়। এটি কেবল শীর্ষে ছিল কারণ অন্য সমস্ত বট বোবা ছিল। : পি এটি সম্ভবত প্রথম কার্যকর বোট।
ড্রাকো 18

1
@ নাথানম্যারিল কি এর অর্থ কি আমাদের আর প্রতারণার জন্য জাল আইপিএড্রেস তৈরি করার অনুমতি দেওয়া হয় না? (যদি এটি হয়ে যায় তবে আমার খনিটি নতুন করে ডিজাইন করা দরকার)
নিক রবার্টসন

কোনও বট ইচ্ছাকৃতভাবে রাউন্ডটিতে অ্যাক্সেস পায় না। আপনি জালিয়াতি হিসাবে বিরোধীদের আইপি ঠিকানাগুলি ব্যবহার করতে পারেন, তবে একটি তৈরি করার অনুমতি নেই। এছাড়াও, একটি ধ্রুবক স্থির সময় বা আরম্ভের সময় একটি পরিবর্তনশীল সেট।
নাথান মেরিল

2

SwarmBot

সুপরিচিত এই বটটি বরং জটিল (এবং এখন পর্যন্ত সর্বাধিক জটিল জমা দেওয়া হয়েছে) তবে আমি একটি বট-এ চেষ্টা করেছি যা একটি নতুন টার্গেটে যাওয়ার আগে নিয়মিতভাবে একটি টার্গেটের সমস্ত পদ্ধতি প্রতিস্থাপন করে। এটি নিজের অনুলিপিগুলি সনাক্ত করতে এবং তাদেরকে সহযোগী হিসাবে গণ্য করার চেষ্টা করে, পর্যায়ক্রমে নিখরচায়তা বীমার জন্য তাদের অনুসন্ধান করে। আমি এর চেয়ে ভাল নাম নিয়ে আসিনি।

গিথুব রেপো শাখার সাথে সংযোগ স্থাপন করা হচ্ছে, কারণ এই বটটি 340 লাইন দীর্ঘ।

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

কয়েকটি আকর্ষণীয় বিষয়:

  • লাইন 14-24 কেবলমাত্র একটি অবিরাম পরিবর্তনযোগ্য তালিকা যা বটটি তার টার্গেটের পদ্ধতিগুলি প্রতিস্থাপন করে যাতে ক্রমটি টুইঙ্ক করা সহজ করে দেয়। এটি কোন সূচকে এটি চালু করেVariables এবং প্রতিটি রাউন্ড বৃদ্ধি করে। এটি "নন-ধ্রুবক ভেরিয়েবল" নিয়মটি অনুসরণ করা উচিত।
  • লাইন 203-217 মিত্র যাচাইয়ের সাথে ডিল করে। আমরা আসলে এটি যত্ন নিই না যে অন্য বট সমস্ত প্রয়োগ করে আমাদের নির্দেশাবলী আট। কেবল চারটি অপরিহার্য, এবং যদি আমরা একটি "বিশ্বস্ত" মিত্রের একজনকে মিস করি তবে আমরা এটিকে আমাদের নিজস্ব জায়গায় প্রতিস্থাপন করি।
  • লাইন 295-300 কার্যকারিতা একটি অপ্রত্যাশিত উত্সাহ ছিল। গেমের প্রথম দুটি মোড়কে আমাদের পতাকা রক্ষা করার মাধ্যমে আমরা খুব দূরে ছড়িয়ে যাওয়ার সুযোগ পাওয়ার আগেই আমাদের পতাকাটি বোবা বটগুলি এড়াতে পারি। আর অপেক্ষা করার পরে, অন্য বটগুলিকে আমাদের ব্লক ফাংশনটি প্রতিস্থাপনের সুযোগ দেয় এবং এটি কর্মক্ষমতা হ্রাস পেতে পারে (র্যান্ডমবট দুর্নীতির পূর্বাবস্থায় ফেলার চেষ্টা করে মিত্রদের সাথে হস্তক্ষেপের কারণে সন্দেহযুক্ত)।
  • এই বটের বিকাশের সময় দীর্ঘকাল ধরে, এই বটটি হেল্পারবটকে ১৩০ নম্বর লঙ্ঘনের এক পর্যায়ে এগিয়ে যায়, যখন এই বটটি ৮১-৯৮ পরিসরে স্থির থাকে, তবে মার্কডবট এবং ডিফল্টবটের কার্যকারিতাটি বেশ কয়েকটি পয়েন্টকে টেনে নিয়ে যায়।
  • এই বটটি কেবল যুক্ত functionsMatchপদ্ধতি দিয়েই সম্ভব ছিল । functionsMatchএটি অন্ধ ছিল বলে অর্থবহ সিদ্ধান্ত নিতে পারে এমন একটি বট লেখা ছাড়া অসম্ভব ছিল। এটি তার টার্গেটের ভেরিয়েবল এবং লগগুলি পড়তে পারে তবে তার লক্ষ্য স্থিতির কিছুই জানতে পারে না।

এখনও সম্ভবত কিছু উন্নতি সম্ভব হয়েছে, তবে আমি সেগুলি দেখতে পাচ্ছি না। লাইন 198-205 সম্ভবত একটি পারফরম্যান্স হগ, তবে যতক্ষণ না আইপিএড্রেস ক্লাস ঠিকানাগুলিকে ভেরিয়েবলগুলিতে সংরক্ষণ করা থেকে পুনর্গঠন করার অনুমতি দেয় ততক্ষণ এটি প্রয়োজনীয় (বটগুলির কোনও ঠিকানা বৈধকরণের কোনও উপায় না থাকায়, কোনও অবৈধ ঠিকানার কোনও স্টোরেজই গেমটি তৈরি করে একটি ReadOnlyBot এ নাল লক্ষ্য মোড়ানো, এনপিই নিক্ষেপ)।

সম্পাদনা করুন: 12/12/15 আপডেট

কিছু getTurnNumber()যুক্তি দিয়ে প্যারামিটারগুলি টিক্ক করে পারফরম্যান্সে কিছুটা বাড়িয়ে তোলে। গেমের শেষের লক্ষ্যমাত্রায় 5% থেকে 10% বৃদ্ধি প্রায় 15 পয়েন্টের সমান, একইভাবে প্রারম্ভিক গেমের লক্ষ্যমাত্রা 5% থেকে 8% করে বাড়ানো। মিশ্রিত এই বটটি এখন (প্রায়) বেঁচে থাকতে পারে এমনকি অ্যামনেসিয়াবোটের মুখোমুখি হয়েও (110 এর স্কোর নিয়ে দ্বিতীয় স্থানে পৌঁছে যায়, যেখানে হেল্পারবট প্রায় 117 পেয়েছে)।

এমনকি এই টুইটগুলি দিয়েও এটি দুর্ভাগ্যজনক হতে পারে, সুতরাং 10 রাউন্ডের জন্য এটির স্কোরের পরিধি প্রায় 170-185।


অসাধারণ! এটি ইচ্ছাকৃত যে আপনি স্ট্রিং থেকে আইপিএড্রেস তৈরি করতে পারবেন না।
নাথান মেরিল

ঠিক আছে, অবশ্যই, হ্যাঁ! (বা বটগুলি নতুন বটগুলি সন্ধানের জন্য স্বেচ্ছাসেবী তৈরি করবে)। সমস্যাটি হ'ল আপনি যদি সিমুলেশনটি ক্র্যাশ করেন। ;)
ড্র্যাকো 18

আরম, ১৪৩ লাইনে আপনি অ-বিদ্যমান কন্সট্রাক্টর ব্যবহার করেন।
TheNumberOne

@ নাম্বারও এটি বৈধ ছিল যখন আমি এটি লিখেছিলাম। নাথান সম্ভবত বেস আপডেট।
ড্রাকো 18

@TheNumberOne আপডেট হয়েছে। new IPAddressআমি যেভাবে করলাম সেই কলটি "অ্যাড্রেস বই থেকে চেহারা" হওয়া উচিত ছিল readData। আমি সেই অনুসন্ধান এবং স্থির রেখাটি 143-এ বের করেছি
ড্রাকো 18

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

হেল্পারবট যদি ধরে নেন যে এর নিজস্ব যে কোনও পদ্ধতি যা ওভাররাইট করা (অন্য ব্যতীত 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

Replacer

এই এন্ট্রিটি সমস্ত 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, নালবোটের তুলনায় higher 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;
    }
}

আমি বিশদ সংরক্ষণের বিষয়টি বিবেচনা করেছি তাই এটি পুরো প্রেরণাকে কেবল প্রেরকের আইপি-র পরিবর্তে কোনও নতুন বট (সামগ্রী এবং পতাকা) এ প্রেরণ করবে, তবে এতে কোনও কার্যকরী লাভ ছাড়াই ভেরিয়েবলের ভারী ব্যবহার জড়িত থাকতে হবে, বিশেষত অ্যামনেসিয়াবোটকে নাটক হিসাবে বিবেচনা করা।


1

DumbBot

ওহ, এটিকে নোংরা লাগছে। এটি সম্ভবত একমাত্র জিনিস যা অ্যামনেসিয়া বোটকে পরাজিত করে। বাস্তবে, এটি কেবল একটি বিশেষায়িত র‌্যান্ডমবট: এটি সিমুলেশনে (মাধ্যমে getAddressBook().clear()) একটি এলোমেলো বট পায় এবং এলোমেলোভাবে ব্লক ফাংশন বা পতাকা ফাংশনটি প্রতিস্থাপন করে। এটাই. কেবলমাত্র এই দুটিটিকে বেছে নেওয়ার দ্বারা, এর পতাকা-স্প্রেড হার অ্যামনেসিয়া বট বা হেল্পারবোটের চেয়ে বেশি তবে 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.