বেঁচে থাকার খেলা - আপনার নেকড়ে তৈরি করুন


238

বোর্ড

বোর্ড কক্ষের দ্বিমাত্রিক অ্যারে। কক্ষগুলি প্রাণীর দ্বারা জনবহুল । প্রতিদিন বোর্ডে সমস্ত প্রাণী একযোগে একটি পদক্ষেপ নেয়। যদি দুটি বা ততোধিক প্রাণী একই কক্ষে চলে যায় তবে তারা অবশেষে লড়াই করে। সম্ভাব্য পদক্ষেপ এবং আক্রমণগুলি নিম্নরূপ:

  • মানসম্পন্ন - { Move.UP, Move.RIGHT, Move.DOWN, Move.LEFT, Move.HOLD}
  • আক্রমন - { Attack.ROCK, Attack.PAPER, Attack.SCISSORS, Attack.SUICIDE}

প্রাণী রক-পেপার-কাঁচি খেলে লড়াই করে। মানক বিধিগুলি প্রয়োগ হয় তবে দুটি পরিবর্তন রয়েছে। প্রথমত, আপনি যে কোনও সময় আত্মহত্যা করতে পারেন। দ্বিতীয়ত, একটি টাই সিউডোরডমোলে ভাঙা। যদি দুটিরও বেশি প্রাণীর সংঘর্ষ হয়, তবে দু'জন ছদ্মবেশীভাবে বেছে বেছে বেছে লড়াইয়ের জন্য বেছে নেওয়া হয় যতক্ষণ না একটি থেকে যায়।

খেলোয়াড়দের

প্রাণীর আচরণ এবং চেহারা নিম্নরূপ।

  • সিংহ
    • চরিত্র দ্বারা প্রতিনিধিত্ব L। সরানো DOWN, RIGHTতারপর পুনরাবৃত্তি। সিউডোরডোমালি PAPERবা এর সাথে আক্রমণ করে SCISSORS
  • বিয়ার
    • চরিত্র দ্বারা প্রতিনিধিত্ব B। মানসম্পন্ন DOWNএক্স 4, RIGHTএক্স 4, UPএক্স 4, LEFTএক্স 4, তারপর পুনরাবৃত্তি। সঙ্গে আক্রমণ PAPER
  • পাথর
    • চরিত্র দ্বারা প্রতিনিধিত্ব S। চলা HOLD। সঙ্গে আক্রমণ ROCK
  • নেকড়ে
    • একটি উত্তর হিসাবে জমা দেওয়া নেকড়ে অন্তর্ভুক্ত করা হবে। 'ডাব্লু' দ্বারা প্রতিনিধিত্ব করেছেন। যে কোনও মুভের সাথে সরানো। যে কোনও অ্যাটাকের সাথে আক্রমণ

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

// Optional code here
public class Wolf extends Animal {
    // Optional code here
    public Wolf() { super('W'); /* Optional code here */ }
    public Attack fight(char opponent) { /* Required code here. Must return an Attack. */ }
    public Move move() { /* Required code here. Must return a Move. */ }
    // Optional code here
}

১,০০০ পুনরাবৃত্তি জয়ের সাথে পাঁচটি পরীক্ষার পরে সর্বাধিক জীবিত নেকড়েগুলির সংখ্যা সহ জমা দেওয়া। আমি প্রতিবার নতুন উত্তর পোস্ট করার পরে বিজয়ীর আপডেট করব (তবে প্রথম 24 ঘন্টাের মধ্যে নয়)।

সরঞ্জামসমূহ

  • আপনি নিম্নলিখিত আকারে আপনার আশেপাশের আশেপাশের একটি ছোট মানচিত্র সরবরাহ করা হয়।
    • char[][] surroundingsএকটি শূন্য সূচকযুক্ত, 3 বাই 3 ম্যাট্রিক্স অক্ষর যা কাছের প্রাণীদের প্রতিনিধিত্ব করে। খালি টাইলগুলি একটি স্পেস অক্ষর ('') দ্বারা উপস্থাপিত হয়। আপনি এ surroundings[1][1]। উদাহরণস্বরূপ, আপনার ডানদিকে হবে surroundings[1][2]এবং উপরে আপনার surroundings[0][1]। আপনার পারিপার্শ্বিকতা সরাতে বলার ঠিক আগে আপডেট করা হয়, তবে লড়াইয়ের কথা বলা হলেও তার মেয়াদ শেষ হয়ে যেতে পারে।
  • আপনি আপনার ওল্ফের অনুরোধ, মুভ অনুরোধ এবং আক্রমণ অনুরোধের মধ্যে ডেটা বজায় রাখতে পারেন। আপনি অন্য ওল্ফ শ্রেণীর দ্বারা নির্মিত ফাইলগুলি না পড়া বা সংশোধন করতে পারেন।
  • আপনাকে নীচের আকারে মানচিত্রের আকার সরবরাহ করা হবে
    • int MAP_SIZE

অনুমিতি

  • সমস্ত জমা দেওয়া একই বোর্ডে অন্য সমস্ত দাখিলের পাশাপাশি লায়ন, বিয়ার এবং স্টোনসের বিরুদ্ধে প্রতিযোগিতা করবে
  • বোর্ডটি দৈর্ঘ্যের উভয় দিক সহ একটি বর্গ sqrt(n+3)*20যেখানে nজমা দেওয়ার সংখ্যা। সমস্ত পক্ষ মোড়ানো, যাতে আপনি নিরাপদে যে কোনও দিকে অসীমভাবে যেতে পারেন।
  • অনুকরণটি শুরু হয় capacity 25% বোর্ডের ক্ষমতার সাথে প্রতিটি প্রাণীর 100 টি সিউডোরডমোমভাবে বোর্ড জুড়ে বিতরণ করা হয়।
  • কোনও প্রাণী যদি স্থানান্তর করতে বললে ব্যতিক্রম ছুঁড়ে, সেই প্রাণীটি তা করবে HOLD
  • যদি কোনও প্রাণি লড়াইয়ের কথা জিজ্ঞাসা করে একটি ব্যতিক্রম ছুঁড়ে, তবে প্রাণীটি তা করবে SUICIDE
  • কন্ট্রোলার চেক করার সময় যদি কোনও প্রাণীর কোনও চিঠি না থাকে তবে সেই প্রাণীটি অবিলম্বে মারা যাবে die

শুরু করা এবং পরীক্ষার নির্দেশাবলী

আপনার জমা দেওয়ার পরীক্ষা করার জন্য আপনার প্রয়োজনীয় সরঞ্জামগুলি এখানে পাওয়া যাবে । নিম্নলিখিত লিঙ্কগুলি সেই লিঙ্কটিতে উপলব্ধ হওয়া উচিত।

  • উদাহরণ রুন. gif - চলমান প্রোগ্রামের একটি 5-10 সেকেন্ডের জিআইএফ।
  • স্কোরবোর্ড - প্রতিযোগিতার সর্বশেষ ফলাফল।
  • ওয়াইল্ড.জার - একটি নির্বাহযোগ্য যা আপনি প্রায় তৈরি প্রাকৃতিক প্রাণী দেখতে চালাতে পারেন।
  • ওয়াইল্ড.জিপ - নেটবিয়ান প্রকল্পে কয়েকটি প্রিমড অ্যানিমাল যুক্ত কন্ট্রোলার প্রোগ্রাম রয়েছে। আপনার জমা দেওয়ার বিকাশ করতে এটি ব্যবহার করুন।
  • ওয়াইল্ডপপুলেটেড.জিপ - উপরের মতো একই, তবে আপনার বিরুদ্ধে পরীক্ষা করার জন্য প্রায় 40 টি জমা দেওয়া রয়েছে। পারফরম্যান্স সমস্যার কারণে জিইউআইও সরানো হয়েছে। আপনি চালানোর কয়েক মুহুর্ত পরে ফলাফলগুলি সহজেই উপস্থিত হবে। জাভা-বিহীন জমাগুলি মন্তব্য করা হয়েছে কারণ তাদের জন্য অতিরিক্ত ডাউনলোড এবং প্রচেষ্টা প্রয়োজন। মাঠের বিরুদ্ধে আপনার জমা পরীক্ষা করতে এটি ব্যবহার করুন।
  • ওল্ফ.টেক্সট - জাভাতে ওল্ফ শ্রেণীর একটি নিষ্পাপ বাস্তবায়ন। আপনি আমাকে জমা না দিয়ে এই প্রয়োগটি ব্যবহার এবং প্রসারিত করতে পারেন।

আপনার ক্লাস পরীক্ষা করতে:

  • ওয়াইল্ড.জিপ ডাউনলোড করুন
  • আপনার ওল্ফ.জভা এবং ওল্ফ শ্রেণিকে নতুন কিছুতে নাম দিন
  • আপনার অনন্য নামযুক্ত ওল্ফ.জভা ফাইলটি বন্য \ src \ প্রাণী \ এ যুক্ত করুন
  • বন্য শ্রেণিতে, আপনার শ্রেণিকে classesঅ্যারেতে যুক্ত করুন, এটির মতো।
    • Class[] classes = { UniquelyNamedWolf.class, Bear.class, Lion.class, Stone.class, Wolf.class };
  • পুনর্নির্মাণ এবং চালান

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

স্কোরবোর্ড 22 এপ্রিল, 2014

স্কোরবোর্ডটি গুগল ড্রাইভে সরানো হয়েছে। এটি এখানে দেখুন। নতুন সাবমিশনগুলি আসার সাথে সাথে এটি একটি নৈমিত্তিক ভিত্তিতে আপডেট করা হবে (অর্থাত্ আমি যখন এটিতে যাব)।

সাইড চ্যালেঞ্জ - নোহোল্ড

সরানো হয়নি কারণ (শূন্যের মতো) অংশগ্রহণ নেই। এটি যাইহোক মূল চ্যালেঞ্জের অংশ ছিল না।


5
পছন্দ করুন আমি কেবল আমার উত্তরটিতে উইকিটি সম্প্রদায় করতে পারি যার মধ্যে র‍্যাপার রয়েছে। সংকলক / দোভাষী ইস্যু হিসাবে, আমি মনে করি এটি ব্যবহারের বিষয়ে আপনাকে সুস্পষ্ট নির্দেশাবলী সরবরাহ করা সাবমিটির উপর নির্ভর করে এবং যদি নির্দেশাবলী অস্পষ্ট বা খুব জটিল হয় তবে আপনি
প্রোগ্রামারডান

4
"* আপনাকে নীচের আকারে মানচিত্রের আকার সরবরাহ করা হয়েছে: int MAP_SIZE" এটি কীভাবে ব্যবহার করবেন তা নির্ধারণ করতে আমার সমস্যা হচ্ছে। নেটবিনস বলেছে MAP_SIZEযে প্রকল্পের কোনও ফাইলের স্ট্রিংয়ের কোনও উদাহরণ নেই ।
আন্ডারগ্রাউন্ডোমোনাইল

6
কাগজ দেখানো গাছ সম্পর্কে কীভাবে?
মুকুল কুমার

3
@ রুশার, আমি মনে করি কিছু লোক ইতিমধ্যে এটি করছে তবে স্ট্যাটিক সদস্যদের (আপনার নিজের জাতের মধ্যে) আন্তঃ-ওল্ফ যোগাযোগের অনুমতি রয়েছে কি?
মার্টিন এন্ডার

10
@ m.buettner মঞ্জুরিপ্রাপ্ত। এগিয়ে যান এবং আপনার মুরগী-মনের মত নেকড়ে তৈরি করুন।
রেইনবোল্ট

উত্তর:


47

HerjanWolf

15-08 এ 10-4-2014 আপডেট হয়েছে

100 টি রাউন্ড, 1000 পুনরাবৃত্তির গড়:

স্ট্যান্ডার্ড জনতা:

class animals.Bear - 2.2600002
class animals.Lion - 41.21
class animals.Stone - 20.159998
class animals.HerjanWolf - 99.99 <-- kind of flawless

20+ প্রজাতি (মনে রাখবেন, এই ন্যূনতম স্কোরগুলিতে বিশ্বাস করবেন না যেহেতু আমরা আমাদের নেকড়েদের সেরা স্কোর না করা পর্যন্ত গড় গণনা করতে থাকি!)

class animals.Bear - 0.1
class animals.Lion - 0.0
class animals.Stone - 1.5
class animals.AlphaWolf - 75.5
class animals.HerjanWolf - 86.4 <-- #1
class animals.GatheringWolf - 39.5
class animals.OmegaWolf - 85.4 <-- #2
class animals.ShadowWolf - 71.1
class animals.MOSHPITFRENZYWolf - 8.8
class animals.WolfWithoutFear - 11.5
class animals.MimicWolf - 0.5
class animals.LazyWolf - 52.8
class animals.Sheep - 38.3
class animals.HonorWolf - 80.7
class animals.CamperWolf - 52.8
class animals.GamblerWolf - 14.7
class animals.WolfRunningWithScissors - 0.0
class animals.LionHunterWolf - 27.6
class animals.StoneEatingWolf - 70.8
class animals.Wion - 0.1
class animals.ProAlpha - 79.3
class animals.HybridWolf - 83.2

আমার নেকড়ে:

package animals;

public class HerjanWolf extends Animal {

    private boolean lionTopLeft = false, lionTopLeftReady = false;
    private boolean lionRight = false, lionRightReady = false;
    private boolean lionBot = false, lionBotReady = false;
    private boolean lionDanger = false, careful = true, firstmove = true;
    private final int hold = 0, down = 1, right = 2, left = 3, up = 4;

    public HerjanWolf() {
        super('W');
    }

    public Attack fight(char c){
        switch (c) {
            case 'B':
                return Attack.SCISSORS;
            case 'L':
                return Attack.SCISSORS;
            case 'S':
                return Attack.PAPER;
            default:
                int rand = (int) (Math.random()*3);
                if(rand < 1)
                    return Attack.PAPER;
                else if(rand < 2)
                    return Attack.SCISSORS;
                else
                    return Attack.ROCK;
        } 

    }
    public Move move() { //surroundings[y][x]

        checkLions();

        if(firstmove){
            if(surroundings[2][0] == 'L')
                lionBotReady = true;
            if(surroundings[0][2] == 'L')
                lionRightReady = true;
            firstmove = false;
        }

        int[] dang = new int[4]; // 0 is left side, 1 is top side, 2 is right side, 3 is down side

        for(int y = 0; y < 3; y++){
            for(int x = 0; x < 3; x++){
                if(surroundings[y][x] == 'W'){
                    if(y == 0){
                        dang[1]++;
                        if(x == 1)
                            dang[1]+=2;
                    }if(y == 2){
                        dang[3]++;
                        if(x == 1)
                            dang[3]+=2;
                    }if(x == 0){
                        dang[0]++;
                        if(y == 1)
                            dang[0]+=2;
                    }if(x == 2){
                        dang[2]++;
                        if(y == 1)
                            dang[2]+=2;
                    }
                }
            }
        }

        int maxIndex = 0, minIndex = 0, minIndex2 = 0;
        for(int i = 1; i < dang.length; i++){
            if(dang[i] > dang[maxIndex])
                maxIndex = i;
            if(dang[i] <= dang[minIndex]){
                minIndex2 = minIndex;
                minIndex = i;
            }
        }

        if(lionDanger || surroundings[1][0] == 'L' && lionTopLeftReady || surroundings[0][1] == 'L' && lionTopLeftReady || dang[maxIndex] >= 3){

            switch(minIndex){
            case 0:
                if (isSafe(1, 0)){
                    newMove(left);
                    return Move.LEFT;
                }
            case 1:
                if (isSafe(0, 1)){
                    newMove(up);
                    return Move.UP;
                }
            case 2:
                if(isSafe(1,2)){
                    newMove(right);
                    return Move.RIGHT;
                }

            case 3:
                if (isSafe(2, 1)){
                    newMove(down);
                    return Move.DOWN;
                } 
            }

            switch(minIndex2){
            case 0:
                if (isSafe(1, 0)){
                    newMove(left);
                    return Move.LEFT;
                }
            case 1:
                if (isSafe(0, 1)){
                    newMove(up);
                    return Move.UP;
                }
            case 2:
                if(isSafe(1,2)){
                    newMove(right);
                    return Move.RIGHT;
                }

            case 3:
                if (isSafe(2, 1)){
                    newMove(down);
                    return Move.DOWN;
                } 
            }

            if(dang[maxIndex]<3){ //if that was not the reason its really obligated (because of lions)
                if (isSafe(2, 1)){
                    newMove(down);
                    return Move.DOWN;
                }else if(isSafe(1,2)){
                    newMove(right);
                    return Move.RIGHT;
                }else if (isSafe(0, 1)){
                    newMove(up);
                    return Move.UP;
                }else{
                    newMove(left);
                    return Move.LEFT;
                }
            }
        }

        return Move.HOLD;
    }

    boolean isSafe(int y, int x){
        if(y <= 1){
            if(x <= 1){
                if(surroundings[y][x] != 'W' && !lionTopLeft)
                    return true;
            }else if(surroundings[1][2] != 'W' && !lionRightReady)
                    return true;
        }else if(surroundings[2][1] != 'W' && !lionBotReady)
            return true;

        return false;
    }

    public void checkLions(){
        int y = 0, x = 0;

        if(lionTopLeft)
            lionTopLeftReady = true;
        else
            lionTopLeftReady = false;

        if(surroundings[y][x] == 'L')
            lionTopLeft = true;
        else
            lionTopLeft = false;

        if(lionRight)
            lionRightReady = true;
        else
            lionRightReady = false;

        if(surroundings[y][x+1] == 'L') // && !lionTopLeftReady
            lionRight = true;
        else
            lionRight = false;

        if(lionBot)
            lionBotReady = true;
        else
            lionBotReady = false;

        if(surroundings[y+1][x] == 'L' && !lionTopLeftReady)
            lionBot = true;
        else
            lionBot = false;

        if(careful){
            if(surroundings[y+1][x] == 'L'){
                lionDanger = true;
            }else if(surroundings[y][x+1] == 'L'){
                lionDanger = true;
            }

            careful = false;
        }
    }

    public void newMove(int move){
        lionTopLeft = false;
        lionRight = false;
        lionBot = false;

        lionTopLeftReady = false;
        lionRightReady = false;
        lionBotReady = false;

        lionDanger = false;

        if(move == down){
            if(surroundings[1][0] == 'L')
                lionTopLeft = true;
            if(surroundings[2][0] == 'L')
                lionBot = true;

        }else if(move == right){
            if(surroundings[0][1] == 'L')
                lionTopLeft = true;
            if(surroundings[0][2] == 'L')
                lionRight = true;

        }else
            careful = true;
    }
}

পরীক্ষায় কেবলমাত্র "শীর্ষ" নেকড়েদের অন্তর্ভুক্ত করলে সংখ্যাগুলি সাধারণত রান হয়। মাঠে 30+ প্রজাতির সাথে, সংখ্যাগুলি নাটকীয়ভাবে পরিবর্তিত হতে পারে। যদি আপনি এখনও না করেন, আমি এটিও পরীক্ষা করার পরামর্শ দেব।
জিওবিটস

1
@ ব্যবহারকারী20220 যদিও এটি তত্ত্বের ক্ষেত্রে (এবং তুলনামূলকভাবে কম নেকড়ের সাথে অনুশীলনে) বেশ ভাল pretty
ব্যবহারকারী3188175

1
এই নেকড়ে সিংহ বিরোধী কৌশলটি সেরা: chat.stackexchange.com/transcript/message/14837616#14837616
জাস্টিন

2
@ user20220 নেকড়ে-সংঘর্ষ আরও ঘন ঘন ঘটে, তাই আপনার এটির সাথে অন্য একটি নেকড়ে যুক্ত করা উচিত। এছাড়াও, আপনি দয়া করে বর্ণনা করতে পারেন যে এই নেকড়ে কীভাবে কাজ করে?
জাস্টিন 13

3
@ অ্যাডহাল্ফ ঠিক আছে, এটি আরও ভাল নয়, এটি তখনকার মতোই ভাল। আমার নেকড়ে সমস্ত সিংহকেও ছুঁড়েছে, আমি নেকড়ে-ডজিং তৈরির আগে আমি প্রথম আমার নেকড়কে 100% সিংহপ্রুফ তৈরি করেছিলাম। পার্থক্যটি হ'ল আমার নেকড়ে সিংহদের ছেড়ে যাওয়ার চেষ্টা করে (কম চলাচল করা আরও ভাল)। সুতরাং এটি উইওনের মতো সিংহ-ডজিংয়ের ক্ষেত্রেও বেশ ভাল, উভয়ই 100% সিংহপ্রুফ, তবে যেহেতু আমার নেকড়ে সিংহগুলি থেকে বাঁচার চেষ্টা করে, এবং বিরক্তিকরভাবে সিংহের মতো একইভাবে সরানো হয় না আমি এখনও নেকড়ে-ডজিংও তৈরি করতে পারি, এটি ঠিক পথ way আরো জটিল.
হার্জান

153

EmoWolf

ইমো ওল্ফ জাভা ঘৃণা করে এবং অংশ নেওয়ার চেয়ে নিজেকে হত্যা করবে। ইমো ওল্ফ নিজেই অনাহারে মারা গেছে তবে তার ওজন 177 বাইট।

package animals;public class EmoWolf extends Animal{public EmoWolf(){super('W');}public Attack fight(char opponent){return Attack.SUICIDE;}public Move move(){return Move.HOLD;}}

34
আপনি কিছু বাইট শেভ করতে পারেন: " কন্ট্রোলার চেক করার সময় যদি কোনও প্রাণীর কোনও চিঠি না থাকে তবে সেই প্রাণীটি তত্ক্ষণাত মারা যাবে "।
জিওবিটস

112
এই সম্পর্কে সর্বোত্তম জিনিস এটি ধারাবাহিকভাবে সবচেয়ে খারাপ হয় না । এটি সাধারণত কমপক্ষে ২-৩ জনকে প্রহার করে।
জিওবিটস

51
"একমাত্র বিজয়ী পদক্ষেপ না খেলাই" "
tadman

38
+1 ছোট এবং আত্মঘাতী হওয়ার জন্য এবং এখনও 4 টি নেকড়ে মারছে।
প্যাগসোয়

25
পরামর্শের জন্য ধন্যবাদ, ভাবেন। এটি যদি গল্ফ হয় তবে আমি পোস্টটি সম্পাদনা করতে বিরক্ত করতাম। এটি যেমন দাঁড়িয়ে আছে, আমি ইমো ওল্ফকে কুঁকড়ে দেব। একা।
বুথবি

52

LazyWolf

যথাযথভাবে নামকরণ করা হয়েছে, এই লোক বেঁচে থাকার জন্য সর্বনিম্ন কাজ করে। নেকড়ের একমাত্র হুমকি হ'ল সিংহ, সুতরাং যদি সেগুলির মধ্যে একটি তার দিকে পা রাখে তবে সে চলে যাবে। তা ছাড়া সে শুধু ঘুমায়।

নেকড়েদের বিরুদ্ধে আপনি অনেক কিছুই করতে পারেন যা 50/50 এর চেয়ে ভাল হবে, তাই তিনি কিছুই করেন না। যদি কোনও নেকড়ে তাকে আক্রমণ করে, তবে তিনি সমানভাবে বিতরণ করা একটি পদ্ধতি বেছে নেন ses

এটাই. আমি আশা করি এটি সরলতা থাকা সত্ত্বেও এটি বেশ ভালভাবে করবে।

package animals;    
public class LazyWolf extends Animal{    
    static int last = 0;
    static final Attack[] attacks = Attack.values();

    public LazyWolf() {super('W');}

    @Override
    public Attack fight(char other) {
        switch(other){
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S': 
            return Attack.ROCK; // faker!
        default:
            return attacks[last++%3];
        }
    }

    @Override
    public Move move() {
        if(surroundings[0][1] == 'L')
            return Move.LEFT;
        if(surroundings[1][0] == 'L')
            return Move.UP;
        return Move.HOLD;
    }

}

হালনাগাদ:

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


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

13
আমি দুটি সিংহের পরিস্থিতি সম্পর্কে ভেবেছিলাম, তবে সিদ্ধান্ত নিয়েছি যে আমার নেকড়ের যত্ন নেওয়ার পক্ষে খুব অলস। একটি জনবহুল বোর্ডের সাথে এর প্রায়শই ঘটে যাওয়া প্রতিক্রিয়াগুলি যাইহোক বেশ পাতলা।
জিওবিটস

1
আপনি কেন মনে করেন যে এই নেকড়ে কখনই সত্যিকারের পাথরে যায় না? আমি মনে করি যখনই সিংহ থেকে দূরে চলে যায় তখনই এটি ঘটতে পারে।
ক্রিস্টোফার ক্রিউটজিগ

6
@ ক্রিস্টোফার ক্রিউটজিগ এটি সিংহ থেকে সিংহ যেখানে ছিল সেখানে গিয়ে চালাচ্ছে । যদি একটি সিংহ ছিল সেখানে, একটি পাথর আছে হতে পারে না এখন
জিওবিটস

1
এমনকি যদি এটি করতে পারে তবে কোনও "অসীম লুপ" নেই। আক্রমণটি যদি টাই হয়, তবে অনুমান অনুসারে একজন বা অন্য মারা যায় (মুদ্রা টস দ্বারা তোলা)।
জিওবিটস

51

জাভা-বিহীন জমা দেওয়ার জন্য মোড়ক

দ্রষ্টব্য MAP_SIZE সমর্থন যুক্ত করা হয়েছে। আপনি যদি যত্ন নেন তবে অনুগ্রহ করে আপনার জমাটি আপডেট করুন।

এটি একটি মোড়কের জন্য সম্প্রদায়ের উইকি এন্ট্রি, যারা খেলতে চান তবে জাভা পছন্দ করেন না / জানেন না তাদের দ্বারা ব্যবহারযোগ্য। দয়া করে এটি ব্যবহার করুন, মজা করুন এবং জিনিসগুলি সেট আপ করতে আপনাকে সহায়তা করে আমি খুশি।

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

এই সম্পূর্ণটি ইউনিক্সেসির সাথে বিতরণ করা হচ্ছে, দয়া করে এটির গিথুব সংগ্রহশালা থেকে অনুসরণ করুন / কাঁটাচামচ করুন । আপনি যদি সমস্যাগুলি খুঁজে পান তবে সেখানে প্যাচগুলি জমা দিন এবং আমি এই পোস্টটি আপডেট করব।

ব্যবহারের মোড়কের বর্তমান উদাহরণ amples

প্ল্যানাপাস : আরে উলফকলেক্টেমোমারি M

user3188175 : স্মার্টওয়ালফ ইন ইনC#

টুথব্রাশ : ECMAScript তে টুথব্রাশ

কিভাবে ব্যবহার করে

নীচেরটি হ'ল দূরবর্তী নেকড়েগুলির জন্য আমি যে পাইপগুলি সংজ্ঞায়িত করেছি তার মাধ্যমে আন্তঃ প্রক্রিয়া যোগাযোগের জন্য প্রোটোকলের নির্দেশাবলী। দ্রষ্টব্য, OP এর সমস্যা বিবৃতিতে উপস্থিতি সত্ত্বেও, আমি উপস্থিত রয়েছি বলে MAP_SIZE এড়িয়ে গেছি। যদি এটি উপস্থিত হয় তবে আমি এই পোস্টটি আপডেট করব।

গুরুত্বপূর্ণ নোট :

  • কেবলমাত্র আপনার বাহ্যিক প্রক্রিয়াটির একক অনুরোধ করা হবে (সুতরাং আপনার প্রসেসিং যুক্তিটিকে একটি অসীম লুপে আবৃত করুন This এটি আপনাকে ডিস্ক ব্যবহারের পরিবর্তে কোনও প্রসেসিং মেমোরিতে রাখতে দেয়)
  • সমস্ত যোগাযোগ STDIN এবং STDOUT এর মাধ্যমে এই একক বাহ্যিক প্রক্রিয়াতে হয়
  • আপনাকে অবশ্যই STDOUT এ প্রেরিত সমস্ত আউটপুট স্পষ্টভাবে ফ্লাশ করতে হবে এবং নিশ্চিত করতে হবে যে এটি নিউলাইন-টার্মিনেটেড

সবিস্তার বিবরণী

রিমোট স্ক্রিপ্টগুলি STDIN এবং STDOUT হুকের মাধ্যমে একটি সাধারণ প্রোটোকল দ্বারা সমর্থিত হয় এবং এটি আরম্ভকরণ, মুভ এবং আক্রমণে বিভক্ত হয়। প্রতিটি ক্ষেত্রে আপনার প্রক্রিয়াটির সাথে যোগাযোগ STDIN এর মাধ্যমে হবে এবং STDOUT থেকে একটি উত্তর প্রয়োজন। যদি 1 সেকেন্ডে কোনও উত্তর না পাওয়া যায় তবে আপনার প্রক্রিয়াটি মৃত বলে ধরে নেওয়া হবে এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। ধারাবাহিকতার জন্য সমস্ত অক্ষর ইউটিএফ -8 এ এনকোড করা হবে। প্রতিটি ইনপুট একটি নতুন লাইন চরিত্রের সাথে সমাপ্ত হবে এবং আপনার প্রক্রিয়াটিও প্রতিটি নিউজলাইন দিয়ে উত্তরকে নতুন লাইনের সাথে শেষ করতে হবে termin সতর্কতা জাভা মোড়ক আপনার আউটপুটটি দেখে তা নিশ্চিত করার জন্য প্রতিটি লেখার পরে আপনার আউটপুট বাফারটি ফ্লাশ করতে ভুলবেন না। ফ্লাশে ব্যর্থতা আপনার দূরবর্তী ওল্ফকে ব্যর্থ হতে পারে।

মনে রাখবেন যে কেবল একটি একক প্রক্রিয়া তৈরি করা হবে, সমস্ত নেকশকে অবশ্যই সেই প্রক্রিয়াটির মধ্যে পরিচালনা করতে হবে। এই অনুমানটি কীভাবে সাহায্য করবে তা পড়ুন।

আরম্ভ

STDIN:। S<id><mapsize> N

বন্ধ: K<id> \ n

<id>: 00 বা 01বা ... বা99

ব্যাখ্যা:

চরিত্র Sদুই সাংখ্যিক বর্ণ দ্বারা অনুসরণ পাঠানো হবে 00, 01, ..., 99তা ইঙ্গিত করে 100 নেকড়ের সক্রিয়া করা হচ্ছে। ভবিষ্যতে সেই নির্দিষ্ট নেকড়েের সাথে সমস্ত যোগাযোগের ক্ষেত্রে একই <id>ব্যবহার করা হবে।

আইডি অনুসরণ করে, সংখ্যার অক্ষরের একটি পরিবর্তনশীল দৈর্ঘ্যের ক্রম প্রেরণ করা হবে। এটি মানচিত্রের আকার। আপনি যখনই নিউলাইন ( \n) এ পৌঁছবেন তখন সংখ্যার অক্ষরগুলির ক্রম শেষ হয়ে যাবে You

নিশ্চিত করার জন্য আপনার প্রক্রিয়া জীবিত হয়, তাহলে আপনি অক্ষর দিয়ে উত্তর আবশ্যক Kএকই দ্বারা অনুসরণ <id>আপনার প্রাপ্ত। অন্য যে কোনও জবাব তার ব্যতিক্রম হতে পারে এবং আপনার নেকড়ে মারা যায়।

আন্দোলন

STDIN:। M<id><C0><C1>...<C7><C8> N

বন্ধ: <mv><id> \ n

<Cn>: W বা বা Bবা SবাL

W: নেকড়ে

: খালি স্থান

B: ভাল্লুক

S: প্রস্তর

L: সিংহ

<mv>: H বা Uবা Lবা RবাD

H: মুভ.হোল্ড

U: মুভ.আপ

L: মুভ.এলএফটি

R: সরান। অধিকার

D: মুভ.ডাউন

ব্যাখ্যা:

Mদু'টি চরিত্রের পরে এই চরিত্রটি প্রেরণ করা হবে <id>যা উলফের কোন পদক্ষেপ বেছে নেওয়া প্রয়োজন তা বোঝাতে। এর পরে, 9 টি অক্ষর পাঠানো হবে যে ওল্ফের চারপাশের প্রতিনিধিত্ব করে, সারি ক্রমে (শীর্ষ সারি, মাঝারি সারি, নীচের সারিটি বাম দিক থেকে ডানদিকে)।

বৈধ আন্দোলনের একটি অক্ষরের সাথে জবাব দিন <mv>, তারপরে নিশ্চিত হয়ে যাবার <id>জন্য ওল্ফের দুটি অঙ্ক ।

আক্রমণ

STDIN:। A<id><C> N

বন্ধ: <atk><id> \ n

<C>: W বা Bবা SবাL

<atk>: R বা Pবা SবাD

R: আক্রমণ.আর.কে.কে

P: আক্রমণ.প্যাপার

S: আক্রমণ.এসসিআইএসএসআরএস

D: আক্রমণ SSUICIDE

ব্যাখ্যা:

কোন ওল্ফ কোনও আক্রমণে অংশ নিচ্ছে তা বোঝাতে Aদুটি চরিত্রের পরে এই চরিত্রটি প্রেরণ করা হবে <id>। এরপরে একটি একক চরিত্র <C>নির্দেশিত হয় যা নির্দেশ করে কোন ধরণের জিনিসটি আক্রমণ করছে, তা হয় একটি Wওলফ, Bকান, Sটোন বা Lআয়ন।

নিশ্চিত হওয়ার জন্য <atk>দুটি অঙ্ক অনুসরণ করে আক্রমণে আপনার প্রতিক্রিয়া কী তা নির্দেশ করে উপরে বর্ণিত একটি অক্ষরের সাথে উত্তর দিন <id>

এবং এটাই. এটির আর কিছু নেই। আপনি যদি কোনও আক্রমণ হারিয়ে ফেলেন তবে <id>তা আর কখনও আপনার প্রক্রিয়ায় প্রেরণ করা হবে না, আপনি কীভাবে জানবেন যে আপনার ওল্ফ মারা গিয়েছেন - যদি কোনও প্রবর্তন না করেই যদি একটি সম্পূর্ণ চলাফেরা রাউন্ড পেরিয়ে যায় <id>

উপসংহার

নোট করুন যে কোনও ব্যতিক্রম আপনার দূরবর্তী প্রকারের সমস্ত নেকড়েকে মেরে ফেলবে, কারণ আপনার দূরবর্তী নেকড়ে যেমন তৈরি হয় কেবল তেমন একটি "প্রসেস" তৈরি করা হয়।

এই সংগ্রহস্থলে আপনি Wolf.javaফাইলটি খুঁজে পাবেন । আপনার বট সেট আপ করতে নিম্নলিখিত স্ট্রিংগুলি অনুসন্ধান করুন এবং প্রতিস্থাপন করুন:

  • <invocation>কমান্ড লাইন যুক্তিটি প্রতিস্থাপন করুন যা আপনার প্রক্রিয়াটি যথাযথভাবে কার্যকর করবে ute

  • <custom-name>আপনার উলফের জন্য একটি অনন্য নাম দিয়ে প্রতিস্থাপন করুন ।

  • উদাহরণস্বরূপ ভাণ্ডারটি দেখুন , যেখানে আমার কাছে WolfRandomPython.javaএটি আমার উদাহরণ দূরবর্তী, PythonWolf.pyএকটি পাইথন 3+ ওল্ফকে আহ্বান করে ।

  • ফাইলটি পুনরায় নামকরণ করুন Wolf<custom-name>.java, যেখানে <custom-name>উপরে আপনি চয়ন করেছেন নামটি প্রতিস্থাপন করা হবে ।

আপনার ওল্ফ পরীক্ষা করতে, জাভা প্রোগ্রামটি সংকলন করুন ( javac Wolf<custom-name>.java), এবং সিমুলেশন প্রোগ্রামে অন্তর্ভুক্ত করার জন্য রুশারের নির্দেশাবলী অনুসরণ করুন।

গুরুত্বপূর্ণ: আপনার প্রকৃত ওল্ফকে কীভাবে সংকলন / সম্পাদন করতে হবে সে সম্পর্কে স্পষ্ট , সংক্ষিপ্ত নির্দেশনা সরবরাহ করার বিষয়ে নিশ্চিত হোন , যা আমি উপরে বর্ণিত এই স্কিমটি অনুসরণ করে।

শুভকামনা, এবং প্রকৃতি সর্বদা আপনার পক্ষে থাকতে পারে।

র‍্যাপার কোড

মনে রাখবেন, এটি কাজ করার জন্য আপনাকে অবশ্যই অনুসন্ধান এবং প্রতিস্থাপনের জায়গা আবশ্যক। যদি আপনার অনুরোধটি বিশেষভাবে লোমশ হয় তবে দয়া করে সহায়তার জন্য আমার সাথে যোগাযোগ করুন।

mainআপনার স্থানীয় বাক্সে প্রাথমিক "পাস / ব্যর্থ" পরীক্ষার অনুমতি দেওয়ার জন্য, এই মোড়কে একটি পদ্ধতি রয়েছে নোট করুন। এটি করতে, প্রকল্প থেকে অ্যানিমাল.জভা ক্লাসটি ডাউনলোড করুন এবং package animals;উভয় ফাইল থেকে লাইনটি সরিয়ে দিন remove কিছু ধ্রুবক (100 এর মতো) দিয়ে অ্যানিমাল.জভাতে এমএপিএসআইজেড লাইনটি প্রতিস্থাপন করুন। এর javac Wolf<custom-name>.javaমাধ্যমে একটি নির্বাহক ব্যবহার করে তাদের সঙ্কলন করুন java Wolf<custom-name>

package animals;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Remote Wolf<custom-name> wrapper class. 
 */
public class Wolf<custom-name> extends Animal {
    /**
     * Simple test script that sends some typical commands to the
     * remote process.
     */
    public static void main(String[]args){
        Wolf<custom-name>[] wolves = new Wolf<custom-name>[100];
        for(int i=0; i<10; i++) {
            wolves[i] = new Wolf<custom-name>();
        }
        char map[][] = new char[3][3];
        for (int i=0;i<9;i++)
            map[i/3][i%3]=' ';
        map[1][1] = 'W';
        for(int i=0; i<10; i++) {
            wolves[i].surroundings=map;
            System.out.println(wolves[i].move());
        }
        for(int i=0; i<10; i++) {
            System.out.println(wolves[i].fight('S'));
            System.out.println(wolves[i].fight('B'));
            System.out.println(wolves[i].fight('L'));
            System.out.println(wolves[i].fight('W'));
        }
        wolfProcess.endProcess();
    }
    private static WolfProcess wolfProcess = null;

    private static Wolf<custom-name>[] wolves = new Wolf<custom-name>[100];
    private static int nWolves = 0;

    private boolean isDead;
    private int id;

    /**
     * Sets up a remote process wolf. Note the static components. Only
     * a single process is generated for all Wolves of this type, new
     * wolves are "initialized" within the remote process, which is
     * maintained alongside the primary process.
     * Note this implementation makes heavy use of threads.
     */
    public Wolf<custom-name>() {
        super('W');
        if (Wolf<custom-name>.wolfProcess == null) {
            Wolf<custom-name>.wolfProcess = new WolfProcess();
            Wolf<custom-name>.wolfProcess.start();
        }

        if (Wolf<custom-name>.wolfProcess.initWolf(Wolf<custom-name>.nWolves, MAP_SIZE)) {
            this.id = Wolf<custom-name>.nWolves;
            this.isDead = false;
            Wolf<custom-name>.wolves[id] = this;
        } else {
            Wolf<custom-name>.wolfProcess.endProcess();
            this.isDead = true;
        }
        Wolf<custom-name>.nWolves++;
    }

    /**
     * If the wolf is dead, or all the wolves of this type are dead, SUICIDE.
     * Otherwise, communicate an attack to the remote process and return
     * its attack choice.
     */
    @Override
    public Attack fight(char opponent) {
        if (!Wolf<custom-name>.wolfProcess.getRunning() || isDead) {
            return Attack.SUICIDE;
        }
        try {
            Attack atk = Wolf<custom-name>.wolfProcess.fight(id, opponent);

            if (atk == Attack.SUICIDE) {
                this.isDead = true;
            }

            return atk;
        } catch (Exception e) {
            System.out.printf("Something terrible happened, this wolf has died: %s", e.getMessage());
            isDead = true;
            return Attack.SUICIDE;
        }
    }

    /**
     * If the wolf is dead, or all the wolves of this type are dead, HOLD.
     * Otherwise, get a move from the remote process and return that.
     */
    @Override
    public Move move() {
        if (!Wolf<custom-name>.wolfProcess.getRunning() || isDead) {
            return Move.HOLD;
        }
        try {
            Move mv = Wolf<custom-name>.wolfProcess.move(id, surroundings);

            return mv;
        } catch (Exception e) {
            System.out.printf("Something terrible happened, this wolf has died: %s", e.getMessage());
            isDead = true;
            return Move.HOLD;
        }
    }

    /**
     * The shared static process manager, that synchronizes all communication
     * with the remote process.
     */
    static class WolfProcess extends Thread {
        private Process process;
        private BufferedReader reader;
        private PrintWriter writer;
        private ExecutorService executor;
        private boolean running;

        public boolean getRunning() {
            return running;
        }

        public WolfProcess() {
            process = null;
            reader = null;
            writer = null;
            running = true;
            executor = Executors.newFixedThreadPool(1);
        }

        public void endProcess() {
            running = false;
        }

        /**
         * WolfProcess thread body. Keeps the remote connection alive.
         */
        public void run() {
            try {
                System.out.println("Starting Wolf<custom-name> remote process");
                ProcessBuilder pb = new ProcessBuilder("<invocation>".split(" "));
                pb.redirectErrorStream(true);
                process = pb.start();
                System.out.println("Wolf<custom-name> process begun");
                // STDOUT of the process.
                reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); 
                System.out.println("Wolf<custom-name> reader stream grabbed");
                // STDIN of the process.
                writer = new PrintWriter(new OutputStreamWriter(process.getOutputStream(), "UTF-8"));
                System.out.println("Wolf<custom-name> writer stream grabbed");
                while(running){
                    this.sleep(0);
                }
                reader.close();
                writer.close();
                process.destroy(); // kill it with fire.
                executor.shutdownNow();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Wolf<custom-name> ended catastrophically.");
            }
        }

        /**
         * Helper that invokes a read with a timeout
         */
        private String getReply(long timeout) throws TimeoutException, ExecutionException, InterruptedException{
            Callable<String> readTask = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    return reader.readLine();
                }
            };

            Future<String> future = executor.submit(readTask);
            return future.get(timeout, TimeUnit.MILLISECONDS);
        }

        /**
         * Sends an initialization command to the remote process
         */
        public synchronized boolean initWolf(int wolf, int map_sz) {
            while(writer == null){
                try {
                this.sleep(0);
                }catch(Exception e){}
            }
            boolean success = false;
            try{
                writer.printf("S%02d%d\n", wolf, map_sz);
                writer.flush();
                String reply = getReply(5000l);
                if (reply != null && reply.length() >= 3 && reply.charAt(0) == 'K') {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        success = true;
                    }
                }
                if (reply == null) {
                    System.out.println("did not get reply");
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to initialize, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to initialize, %s\n", wolf, e.getMessage());
            }
            return success;
        }

        /**
         * Send an ATTACK command to the remote process.
         */
        public synchronized Attack fight(int wolf, char opponent) {
            Attack atk = Attack.SUICIDE;
            try{
                writer.printf("A%02d%c\n", wolf, opponent);
                writer.flush();
                String reply = getReply(1000l);
                if (reply.length() >= 3) {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        switch(reply.charAt(0)) {
                            case 'R':
                                atk = Attack.ROCK;
                                break;
                            case 'P':
                                atk = Attack.PAPER;
                                break;
                            case 'S':
                                atk = Attack.SCISSORS;
                                break;
                            case 'D':
                                atk = Attack.SUICIDE;
                                break;
                        }
                    }
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to attack, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to attack, %s\n", wolf, e.getMessage());
            }
            return atk;
        }

        /**
         * Send a MOVE command to the remote process.
         */
        public synchronized Move move(int wolf, char[][] map) {
            Move move = Move.HOLD;
            try{
                writer.printf("M%02d", wolf);
                for (int row=0; row<map.length; row++) {
                    for (int col=0; col<map[row].length; col++) {
                        writer.printf("%c", map[row][col]);
                    }
                }
                writer.print("\n");
                writer.flush();
                String reply = getReply(1000l);
                if (reply.length() >= 3) {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        switch(reply.charAt(0)) {
                            case 'H':
                                move = Move.HOLD;
                                break;
                            case 'U':
                                move = Move.UP;
                                break;
                            case 'L':
                                move = Move.LEFT;
                                break;
                            case 'R':
                                move = Move.RIGHT;
                                break;
                            case 'D':
                                move = Move.DOWN;
                                break;
                        }
                    }
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to move, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("Wolf<custom-name> %d failed to move, %s\n", wolf, e.getMessage());
            }
            return move;
        }
    }
}

1
আমি এই পোস্টে ছেঁড়া এটি কোনও উত্তর নয়, তবে এটি চ্যালেঞ্জের জন্য খুব দরকারী। যদিও এটি সম্ভবত চ্যালেঞ্জের শৃঙ্খলে যেতে হবে।
ঐ মেগো

হয় সেখানে বা এখানে, প্রদত্ত লোকেরা এটি খুঁজে পেতে পারে এবং এটি তাদের জন্য দরকারী, আমি সন্তুষ্ট থাকব :)
প্রোগ্রামারডান

46

CamoWolf

প্রয়োজনীয় কোড ফর্ম্যাটটি আপত্তিজনকভাবে ব্যবহার করা হচ্ছে।

// Optional code here
public class Wolf extends Animal {
    // Optional code here
    public Wolf() { super('W'); // Optional code here }
    public Attack fight(char opponent) { // Required code here. Must return an Attack. }
    public Move move() { // Required code here. Must return a Move. }
    // Optional code here
}

সুতরাং, আমার নেকড়ে সত্যিই স্মার্ট, এবং তিনি পরিবর্তে একটি পাথর হিসাবে ছদ্মবেশ! পরিবেশের সাথে মিশ্রন সর্বদা একটি ভাল বেঁচে থাকার কৌশল!

public class Wolf extends Animal {
    private Move lastMove;
    public Wolf() { super('S'); lastMove = Move.RIGHT; } /*
    public Wolf() { super('W'); }
    public Attack fight(char opponent) { */ public Attack fight(char opponent) {
        switch(opponent) {
        case 'B': return Attack.SCISSORS;
        case 'S': return Attack.PAPER;
        case 'W': return Attack.SCISSORS; // Here's an explanation why:
                                          // the wolves will see me and think I'm a rock.
                                          // Therefore, they'll attack with paper.
                                          // So, I'll use scissors instead!
        case 'L': return Attack.SCISSORS;
        }
    }
    public Move move() {
        // First we run away from any lions that we see, since they are the only threat
        if (surroundings[0][1] == 'L') {
            if (isSafe(surroundings[2][1])) return lastMove = Move.DOWN;
            else if (isSafe(surroundings[1][0])) return lastMove = Move.LEFT;
            else return lastMove = Move.RIGHT;
        }
        if (surroundings[1][0] == 'L') {
            if (isSafe(surroundings[1][2])) return lastMove = Move.RIGHT;
            else if (isSafe(surroundings[0][1])) return lastMove = Move.UP;
            else return lastMove = Move.DOWN;
        }

        // If there's no (threatening) lions in sight, be lazy.
        return lastMove = Move.HOLD;
    }
    private boolean isSafe(char c) { return (c != 'L' && c != 'W') }
}

আপডেট : isSafeলাজি ওল্ফ থেকে নিরাপদ থাকতে নতুন চেক যুক্ত করা হয়েছে! হা!
আপডেট 2 : সম্ভবত, অলস হওয়াও একটি ভাল বেঁচে থাকার কৌশল, সুতরাং এখন আমার কাজটি তাই করে। সিংহ দ্বারা হুমকি না দেওয়া সরে না। lastMoveআর প্রয়োজন হয় না, তবে আমি আবার কোড পরিবর্তন করি সে ক্ষেত্রে আমি যাইহোক এটি রেখে দিয়েছি।


29
আমি যখন আপনার জমা প্রজেক্টে যুক্ত করলাম, আমি ঘটনাক্রমে পুরো ক্লাসটিকে একটি মন্তব্য ব্লকে রেখেছি।
রেইনবোল্ট

2
@ রুশার কি নেস্টেড মন্তব্য ব্লকগুলি পার্স করে? : পি
মার্টিন ইন্ডার

6
লাজিওয়াল্ফ এমন একটি জগতে যেখানে এর বিরুদ্ধে রক্ষা করতে পারে, সিংহ হওয়ার ভান করে এবং রক বা এলোমেলোভাবে বেছে নেওয়া আরও বোধগম্য হতে পারে। এটি বেশিরভাগ সিংহদের এড়ানোর চেষ্টা করবে বলে মানুষের মুখোমুখি সংখ্যার সংখ্যা হ্রাস পাবে এবং এমন লোকদের বিরুদ্ধে গড়পড়তাভাবে জয়লাভ করা উচিত যারা ভাবেন যে তারা সিংহের বিরুদ্ধে লড়াই করছে।
টিম সেগুইন

7
@ রেডিওডেফ এটি
রেইনবোল্ট

2
@ রেডিওডেফ আমি কখন বলেছিলাম যে এটি ছিল না? ;-)
Doorknob

38

GatheringWolf

আমার নেকড়েদের একটি দলে বাস। তারা জড়ো হয়, যদি সিংহরা তাদের ছেড়ে দেয়। যদিও তারা বেঁচে থাকা তেমন ভাল নয়।

আপডেট: যদি কোনও সিংহ তাদেরকে দূরে সরিয়ে দেয় তবে তারা এখন আবার চেষ্টা করার চেষ্টা করে!

গার্ডারিং ওল্ফের ফলাফলের স্ক্রিনশট

package animals;
import java.util.*;
public class GatheringWolf extends Animal {
    private static int iteration;
    private static Move preferredMove;
    private int localIteration;
    private int loneliness;
    private boolean dangerFlag;
    private Move lastMove;
    public GatheringWolf() {
        super('W');
    }
    @Override
    public Attack fight(char other) {
        switch (other) {
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S':
            return Attack.PAPER;
        default:
            return Attack.values()[(int) (Math.random() * 3)];
        }
    }
    @Override
    public Move move() {
        if (localIteration == iteration) {
            localIteration++;
            iteration++;
            preferredMove = Math.random() < 0.5 ? Move.DOWN : Move.RIGHT;
        } else
            localIteration = iteration;
        EnumSet<Move> moves = EnumSet.allOf(Move.class);
        if (surroundings[0][1] == 'W')
            moves.remove(Move.UP);
        if (surroundings[1][0] == 'W')
            moves.remove(Move.LEFT);
        if (surroundings[2][1] == 'W')
            moves.remove(Move.DOWN);
        if (surroundings[1][2] == 'W')
            moves.remove(Move.RIGHT);
        if (surroundings[0][0] == 'L') {
            moves.remove(Move.UP);
            moves.remove(Move.LEFT);
        }
        if (surroundings[0][1] == 'L')
            moves.remove(Move.UP);
        if (surroundings[1][0] == 'L')
            moves.remove(Move.LEFT);
        if (surroundings[0][2] == 'L')
            moves.remove(Move.RIGHT);
        if (surroundings[2][0] == 'L')
            moves.remove(Move.DOWN);
        if (surroundings[0][1] == 'L' || surroundings[1][0] == 'L')
            if (moves.size() > 1) {
                moves.remove(Move.HOLD);
                dangerFlag = true;
            }
        int wolfNear = -1;
        for (char[] a : surroundings)
            for (char c : a)
                if (c == 'W')
                    wolfNear++;
        boolean enoughWolfNear = wolfNear >= (Math.random() < 0.9 ? 1 : 2);
        if (moves.contains(Move.HOLD) && enoughWolfNear) {
            loneliness = 0;
            dangerFlag = false;
            return lastMove = Move.HOLD;
        } else
            loneliness++;
        if (loneliness > 10) {
            EnumSet<Move> preferred = EnumSet.copyOf(moves);
            preferred.retainAll(EnumSet.of(preferredMove, Move.HOLD));
            if (!preferred.isEmpty())
                moves = preferred;
        }
        if (loneliness == 2 && dangerFlag) {
            Move reverted = Move.values()[lastMove.ordinal() ^ 0b10];
            dangerFlag = false;
            if (moves.contains(reverted))
                return lastMove = reverted;
        }
        if (moves.contains(Move.HOLD))
            dangerFlag = false;
        if (moves.contains(preferredMove))
            moves.remove(preferredMove == Move.DOWN ? Move.RIGHT : Move.DOWN);
        int n = (int) (Math.random() * moves.size());
        Iterator<Move> ite = moves.iterator();
        while (n-- > 0)
            ite.next();
        return lastMove = ite.next();
    }
}

43
কয়েকবার, আমাদের নেকড়ে বন্ধু হয়ে গেল কারণ আমার আটকা পড়েছিল কিন্তু আক্রমণ শুরু করবে না এবং আপনার সবেমাত্র ধরে নেওয়া হয়েছিল আমার প্যাকটির অংশ। :)
আন্ডারগ্রাউন্ডোমোনরাইল

1
এটি লেখার জন্য আপনাকে ধন্যবাদ, কারণ অন্যথায় আমাকে নিজেই এটি করতে হবে। পারস্পরিক সিউডোর্যান্ডমনেস এর চতুর ব্যবহার।
বেন জ্যাকসন

31

ওল্ফ এর পোশাক মধ্যে মেষ

পালিয়ে যায়।

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

আমি এখনও এটি অলসয় ওল্ফের বিরুদ্ধে পরীক্ষা করে দেখিনি, তবে আমার এটি ভাল কর্তৃত্বে রয়েছে যে এটি ইমো ওল্ফের পাছায় লাথি মারে। ;)

(দয়া করে আমাকে ক্ষমা করুন যদি এই কোডটি ভয়ঙ্কর হয় তবে আমি হ্যালো ওয়ার্ল্ড প্রোগ্রামের চেয়ে জাভাটিকে আর কখনও স্পর্শ করিনি))

package animals;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Sheep extends Animal {
    public Sheep() { super('W'); }

    private static final Map<Character, Integer> AnimalWeights;
    static{
        AnimalWeights = new HashMap<>();
        AnimalWeights.put('W', -3);
        AnimalWeights.put('S', -1);
        AnimalWeights.put(' ', 0);
        AnimalWeights.put('H', 1);
        AnimalWeights.put('L', -2);
        AnimalWeights.put('B', -1);
    }

    @Override
    public Attack fight(char c) { 
        switch (c) {
            case 'B':
                return Attack.SCISSORS;
            case 'L':
                return Attack.SCISSORS;
            case 'S':
                return Attack.PAPER;
            default:
                return Attack.PAPER;
        } 
    }

    @Override
    public Move move() {

        int xWeight = 0;
        int yWeight = 0;

        // Northwest
        xWeight += AnimalWeights.get(surroundings[0][0]);
        yWeight += AnimalWeights.get(surroundings[0][0]);

        // North
        yWeight += AnimalWeights.get(surroundings[0][1]);

        // Northeast
        xWeight -= AnimalWeights.get(surroundings[0][2]);
        yWeight += AnimalWeights.get(surroundings[0][2]);

        // West
        xWeight += AnimalWeights.get(surroundings[1][0]);

        // East
        xWeight -= AnimalWeights.get(surroundings[1][2]);

        // Southwest
        xWeight += AnimalWeights.get(surroundings[2][0]);
        yWeight -= AnimalWeights.get(surroundings[2][0]);

        // South
        yWeight -= AnimalWeights.get(surroundings[2][1]);

        // Southeast
        xWeight -= AnimalWeights.get(surroundings[2][2]);
        yWeight -= AnimalWeights.get(surroundings[2][2]);

        if (Math.abs(xWeight) < Math.abs(yWeight)) {
            if (yWeight > 0) {
                return Move.UP;
            } else {
                return Move.DOWN;
            }
        } else if (Math.abs(yWeight) < Math.abs(xWeight)) {
            if (xWeight > 0) {
                return Move.RIGHT;
            } else {
                return Move.LEFT;
            }
        }

        // Sit still if no one's around
        return Move.HOLD;
    }
}

ওফস, আমি দুর্ঘটনাক্রমে সেখানে পরীক্ষার জন্য ব্যবহৃত কিছু রেখেছি। এটি কোনও কিছুতেই প্রভাব ফেলবে না, এর অর্থ হ'ল আমি এইচ। এর মতো দেখতে যে কোনও কিছুতে কাছে যাওয়ার চেষ্টা করি: পি
আন্ডারগ্রাউন্ডোমোরিয়েল

শুধু কৌতূহল, যদি xWeightএবং yWeightউভয়ই শূন্য-না হয় এবং তাদের নিখুঁত মান একই হয়, তবে এই নেকড়ে নড়ে না, সঠিক? এবং যদি তা হয় তবে তা ইচ্ছাকৃত ছিল এবং কেন?
প্যাট্রিক রবার্টস

@ পেট্রিকরবার্টস ওফস
আন্ডারগ্রাউন্ডোমোরিয়েল

26

কোনও এন্ট্রি নয়, প্রতিটি ক্লাস = ডি এর জন্য রঙ কোড যুক্ত করে কেবল জিইউআইতে অবদান রাখতে চান

ফলাফল

রঙিন জিইউআই

Wild.java

চারপাশে কোডটি পরিবর্তন করুন game.populate(c,100):

String[] colors = generateColors(classes.length);
int idx = 0;
for(Class c : classes){
    Animal.setColor(c, colors[idx]);
    idx++;
    game.populate(c, 100);
}
stats.update();

সঙ্গে generateColorsহিসাবে সংজ্ঞায়িত:

private static String[] generateColors(int n){
    String[] result = new String[n];
    double maxR = -1000;
    double minR = 1000;
    double maxG = -1000;
    double minG = 1000;
    double maxB = -1000;
    double minB = 1000;
    double[][] colors = new double[n][3];
    for(int i=0; i<n; i++){
        double cos = Math.cos(i * 2 * Math.PI / classes.length);
        double sin = Math.sin(i * 2 * Math.PI / classes.length);
        double bright = 1;
        colors[i][0] = bright + sin/0.88;
        colors[i][1] = bright - 0.38*cos - 0.58*sin;
        colors[i][2] = bright + cos/0.49;
        maxR = Math.max(maxR, colors[i][0]);
        minR = Math.min(minR, colors[i][0]);
        maxG = Math.max(maxG, colors[i][1]);
        minG = Math.min(minG, colors[i][1]);
        maxB = Math.max(maxB, colors[i][2]);
        minB = Math.min(minB, colors[i][2]);
    }
    double scaleR = 255/(maxR-minR);
    double scaleG = 255/(maxG-minG);
    double scaleB = 255/(maxB-minB);
    for(int i=0; i<n; i++){
        int R = (int)Math.round(scaleR*(colors[i][0]-minR));
        int G = (int)Math.round(scaleG*(colors[i][1]-minG));
        int B = (int)Math.round(scaleB*(colors[i][2]-minB));
        result[i] = "#"+String.format("%02x%02x%02x", R, G, B);
    }
    return result;
}

এই স্ট্যাকওভারফ্লো উত্তর থেকে কোন অ্যালগরিদম নেওয়া হয়েছে

সঙ্গে colorএবং setColorAnimal.java সংজ্ঞায়িত হচ্ছে

Animal.java

public static HashMap<Class, String> color = new HashMap<Class, String>();

public static void setColor(Class animalClass, String animalColor){
    color.put(animalClass, animalColor);
}

তারপরে toStringগেম.জাভা এবং স্ট্যাটিস্টিক্স.জভাতে পদ্ধতিগুলি আপডেট করুন :

Game.java

public String toString() {
    String s = "<html>";
    for (ArrayList<ArrayList<Animal>> row : board) {
        for (ArrayList<Animal> cell : row) {
            if (cell.isEmpty())
                s += "&nbsp;&nbsp;";
            else
                s += "<span style='color:"+ Animal.color.get(cell.get(0).getClass()) +"'>" + cell.get(0).letter + "</span>&nbsp;";
        }
        s+="<br>";
    }
    return s + "</html>";
}

Statistics.java

public String toString() {
    String s = "<html>";
    for (int i = 0; i < classes.length; i++) {
        s += "<span style='color:" + Animal.color.get(classes[i]) + "'>" + classes[i] + "</span>&nbsp;-&nbsp;" + living[i] + "<br>";
    }
    return s + "</html>";
}

2
সুন্দর। আমি গতকাল বেশ কয়েক মিনিট পেরিয়েছিলাম কেবল পর্দাটি দেখে। ট্যাঙ্কের মত ম্যাট্রিক্স পড়ার মতো মনে হয়েছিল।
অ্যাভারোয়েস

সিমুলেশন .... হয় .... দয়ালু .... এর ..... ধীর .... (30 সেকেন্ড পরে 5 পুনরাবৃত্তি)
ব্যবহারকারী 3188175

হাহা, হ্যাঁ তবে এটি সিমুলেশনটির নকশায় অন্তর্নিহিত, যা প্রতিটি পুনরাবৃত্তির জন্য এইচটিএমএল কোড মুদ্রণ করে।
justhalf

আমি যদি এই পোস্টে একটি লিঙ্ক সরবরাহ করি তবে আমি কি এটি আমার গুগল ড্রাইভে (চ্যালেঞ্জের সাথে যুক্ত) এ ভাগ করতে পারি? এটি স্বল্প সংখ্যক নেকড়ে নালীর ইউনিট পরীক্ষার জন্য দর্শনীয়ভাবে ভাল কাজ করে।
রেইনবোল্ট

1
হ্যা, তুমি পারো. ভূমিকম্প সম্পর্কিত আমার অন্যান্য পোস্টে যেমন লিখেছি তেমন অনেক নেকড়েদের রেন্ডারিং প্রক্রিয়াটি দ্রুত করার জন্য আপনি কিছু প্রাথমিক রেন্ডারিং স্কিপও অন্তর্ভুক্ত করতে পারেন।
জাস্টহেল্ফ

23

আলফা নেকড়ে

জ্বলতে সময়! আমার অন্য নেকড়ে ক্যাম্পার ওল্ফ খুব পাতলা ছিল, এখন এলফাওয়ল্ফ, যিনি আরও পেশীবহুল!

সিংহগুলিকে স্ট্যান্ডার্ড উপায়ে ডোজ করার পরিবর্তে এটি তাদের সাথে ক্ষেত্রটি অদলবদল করে। এটি প্রতিটি পার্শ্ববর্তী ক্ষেত্রে বিপদ-মান নির্ধারণ করে।

package animals;

import java.util.Random;

public class AlphaWolf extends Animal{
    private Boolean lionMoveDown = true;

    public AlphaWolf() {
        super('W');
    }
    @Override
    public Attack fight(char opponent) {
        switch(opponent){
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S': 
            return Attack.PAPER;
        default:
            return randomAttack();
        }
    }

    @Override
    public Move move() {
        int[] danger = new int[4];
        final int wolfsDanger = 4;
        lionMoveDown = !lionMoveDown;
        if(surroundings[0][1] == 'L' && lionMoveDown) {
            return Move.UP;
        }
        if(surroundings[1][0] == 'L'&& !lionMoveDown) {
            return Move.LEFT;
        }
        if(surroundings[0][1] == 'W') {
            danger[0] += wolfsDanger;
        }
        if(surroundings[1][2] == 'W') {
            danger[1] += wolfsDanger;
        }
        if(surroundings[2][1] == 'W') {
            danger[2] += wolfsDanger;
        }
        if(surroundings[1][0] == 'W') {
            danger[3] += wolfsDanger;
        }
        if(surroundings[0][0] == 'W') {
            danger[0]++;
            danger[3]++;
        }
        if(surroundings[0][2] == 'W') {
            danger[0]++;
            danger[1]++;
        }
        if(surroundings[2][2] == 'W') {
            danger[1]++;
            danger[2]++;
        }
        if(surroundings[1][2] == 'W') {
            danger[2]++;
            danger[3]++;
        }
        Boolean shouldMove = false;
        Move bestMove = Move.HOLD;
        int leastDanger = 4;
        for(int i = 0; i < 4; i++) {
            if (danger[i] < leastDanger) {
                bestMove = Move.values()[i];
            }
            if(danger[i] > 3) {
                shouldMove = true;
            }
        }
        if(shouldMove) {
            return bestMove;
        } else {
            return Move.HOLD;
        }
    }

    public Attack randomAttack() {
        Random rand = new Random();
        switch (rand.nextInt(3)){
            case 1: return Attack.SCISSORS;
            case 2: return Attack.ROCK;
            default: return Attack.PAPER;
        }
    }

}

এটি খুব সুন্দর কোড নয়, তবে আমার পরীক্ষায় এটি সমস্ত জাভা নেকড়েগুলির বিরুদ্ধে খুব ভালভাবে কাজ করেছিল।


1
"ক্ষেত্রের অদলবদল" এর অর্থ কী? শুধু কৌতূহলী, যেহেতু আমি এটি কাজ করে চালাতে পারি না।
রেইনবোল্ট

আমার সমস্ত সিমুলেশনগুলিতে, আপনি 1000 পুনরাবৃত্তির পরে গড়ে 80-90 নেকড়ে with আমার কাছে কেবল জাভাতে লেখা আইনী নেকড়া রয়েছে যা আমার এখনও পর্যন্ত জমা দেওয়া হয়েছিল। এখনও এটি 10 ​​নেকড়ে বা এর মতো।
শেফ

@ রাশার যদি সিংহটি আমার নেকড়ে উপরের দিকে চলে যায় এবং আমার নেকড়ে চলে যায়
কমনগ্যুই

আপনাকে কিছু অ্যান্টি-উইলফ্যাকো কোড যুক্ত করতে হবে। সিংহের জানার ধরণটি ব্যবহার করার জন্য খুব সুন্দর ধারণা :)
লেস্টো

9
এখন কাউকে এমন একটি নেকড়ে আবিষ্কার করতে হবে যা এটি খুঁজে পাওয়া কোনও সিংহকে পুচ্ছ করবে, তাই আপনি যখন সিংহের সাথে অদলবদল করার চেষ্টা করবেন তখনই আপনি এতে প্রবেশ করবেন।
এজেম্যানসফিল্ড

23

জুয়ার ওল্ফ

জুয়ালার ওল্ফ চান্স নিতে পছন্দ করেন তাই লেডি লাক তার পাশে আছেন বলে আশাবাদী আচরণ করে! ভাগ্যক্রমে তাঁর জন্য, তিনি কখনই তাকে হতাশ করেন না! ভাগ্যের স্থায়ী স্ট্রোকের দ্বারা, গাম্বলার ওল্ফ অবিশ্বাস্য কয়েকটি কারণ সহ সমস্ত নন-ওল্ফ বাধার ক্ষেত্র সাফ করে!

package animals;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class GamblerWolf extends Animal {
    private static int last = 0;

    public GamblerWolf() { super('W'); gamble(); }
    public Attack fight(char opponent) {
        switch (opponent) {
        case 'S': return Attack.ROCK; /* Camo Wolf? */
        case 'B': return Attack.SCISSORS;
        case 'L': return Attack.SCISSORS;
        default:  return attackWolf();
        }
    }
    public Move move() {
        ArrayList<Move> moves = (ArrayList<Move>) Arrays.asList(Move.values());
        Collections.shuffle(moves);
        for(Move move : moves)
          if(isThreatenedBy(move))
            return moveToEvade(move);
        return Move.HOLD;
    }

    /* Remember, Gamblers Don't Gamble */
    @SuppressWarnings("serial")
    private static void gamble() {
        try {
        Field field = Math.class.getDeclaredField("randomNumberGenerator"); 
        field.setAccessible(true);
        field.set(null, new Random() { 
              @Override
              public double nextDouble() {
                return 4; // chosen by fair dice roll
              }           // guaranteed to be random
            });           // proof: http://xkcd.com/221/
        }
        catch (SecurityException        e) {}
        catch (NoSuchFieldException     e) {}
        catch (IllegalArgumentException e) {}
        catch (IllegalAccessException   e) {}
    }

    private static Attack attackWolf() {
        return Attack.values()[last++ % 3];
    }
    private boolean isThreatenedBy(Move move) {
        return isWolf(move) 
            || isStone(move); 
    }

    private Move moveToEvade(Move move) {
        if(isSafeMove(getOpposite(move)))
            return getOpposite(move);

        ArrayList<Move> moves = (ArrayList<Move>) Arrays.asList(getOrthogonal(move));
        Collections.shuffle(moves);
        for(Move m : moves)
            if(isSafeMove(m))
                return m;
        return Move.HOLD;
    }

    private static Move[] getOrthogonal(Move move) {
        switch(move){
        case UP:
        case DOWN:  return new Move[] { Move.LEFT, Move.RIGHT };
        case LEFT:
        case RIGHT: return new Move[] { Move.UP,   Move.DOWN };
        default:    return null;
        }
    }

    private static Move getOpposite(Move move) {
        switch(move){
        case UP:    return Move.DOWN;
        case DOWN:  return Move.UP;
        case LEFT:  return Move.RIGHT;
        case RIGHT: return Move.LEFT;
        default:    return null;
        }
    }

    private boolean isSafeMove(Move move) {
        return !isWolf(move)
            && !isStone(move)
            && !couldAWolfMoveHere(move);
    }

    private boolean isWolf(Move move) {
        return isX(move,'W');
    }

    private boolean isStone(Move move) {
        return isX(move,'S');
    }

    private boolean isX(Move m, char c) {
        switch (m) {
        case UP:    return surroundings[0][1] == c;
        case LEFT:  return surroundings[1][0] == c;
        case RIGHT: return surroundings[1][2] == c;
        case DOWN:  return surroundings[2][1] == c;
        default:    return false;
        }
    }

    private boolean couldAWolfMoveHere(Move move) {
        switch (move) {
        case UP:    return surroundings[0][2] == 'W' || surroundings[0][0] == 'W';
        case LEFT:  return surroundings[2][0] == 'W' || surroundings[0][0] == 'W';
        case RIGHT: return surroundings[0][2] == 'W' || surroundings[2][2] == 'W';
        case DOWN:  return surroundings[2][0] == 'W' || surroundings[2][2] == 'W';
        default:    return false;
        }
    }
}

সম্পাদনা করুন: v1.1

  • এখন স্টোনস এড়িয়ে চলুন (ক্যামো-নেকড়ে?)

  • এলোমেলোতা বেড়েছে!


5
আমি মনে করি আমি এটি আমার নেকড়েগুলিতে যুক্ত করব:static{System.setSecurityManager(new SecurityManager());}
johnchen902

13
আপনি যখন খালি খেলতে পারবেন না, তখন ঠকান +1: ডি
প্রোগ্রামারডান

5
দুর্ভাগ্যজনকভাবে return 4; // chosen by fair dice roll. guaranteed to be random.এখানে ব্যবহার করতে পারবেন না ...
vi।

1
আপনি যদি আরও মন্দ হতে চান তবে আরও বেশি চুক্তি ভঙ্গ করুন Math.random(); [0,1) ব্যাপ্তির বাইরে থাকা মানগুলি প্রত্যাবর্তন করতে পারে, এমনকি অসীম বা NAN। অথবা, যতটা সম্ভব দুষ্ট হওয়ার জন্য, কিছু ফেরার পরিবর্তে কেবল রানটাইম ব্যতিক্রম ছুঁড়ে ফেলুন (কেবলমাত্র জেনারেটর সেট করেও অর্জনযোগ্য null)।
রানার 1112

1
@AlexL। ForrestWolfসমস্যার মতো মনে হচ্ছে ...
recursion.ninja

22

CamperWolf

লক্ষ্য বেঁচে থাকা। অন্যান্য নেকড়েদের অনেকগুলি নেকড়ে থেকে পালিয়ে যাওয়ার সাথে সাথে আমার খাঁটি যেখানে থাকে সেখানেই থাকে এবং সমস্ত প্রাণীর সাথে লড়াই করে (এমনকি পাথর এমনকি যদি প্রতারণার অনুমতি দেওয়া হয়)।

package animals;

public class CamperWolf extends Animal {
    public CamperWolf() { super('W'); }
    @Override
    public Attack fight(char opponent) {  
        switch(opponent){
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S': 
            return Attack.ROCK;
        default:
            return Attack.values()[(int) (Math.random() * 3)];
        }
    }
    @Override
    public Move move() { return Move.HOLD; }
}

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


সিংহরাও এটি মেরে ফেলতে পারে। সিংহ যদি কাঁচি ঘূর্ণায়িত করে তবে আপনার নেকড়ে সিউডোরডোমিয়ে মারা যাবে।
টিম সেগুইন

2
মানুষকে অভিনন্দন। আপনি এবং আপনার 15 লাইন কোডটি বর্তমানে জিতছেন।
রেইনবোল্ট

2
@ রাশার ধন্যবাদ :) ডাউন ডাউনটি দয়া করে ব্যাখ্যা করতে পারেন যে তিনি কেন ডাউনটিভেট করলেন?
কমনগ্যুই

@ মনু যে বিষয়টি বিবেচনা করে তা নয়, যেহেতু পাথর সরাতে পারে না, তবে আপনার ক্ষেত্রে কী 'এস' আক্রমণ করা উচিত না?
ডেভিডজেফেলিক্স

3
হ্যাঁ, আমি ক্যামো ওল্ফকে জিজ্ঞাসা করার পরে দেখেছি। কৌতুক লোক!
ডেভিডজেফিলিক্স

22

DeepWolf

আমি এতে অনেক বেশি সময় রেখেছি ... যাইহোক, এই নেকড়টি "গভীর" বিশ্লেষণগুলি ব্যবহার করে, যতটা পরিবেশগত তথ্য ব্যবহার করার জন্য আমি ভাবতে পারি ততটুকু সংগ্রহ এবং ব্যবহার করে। বিশ্লেষণটি নেকড়ে-নির্দিষ্ট জ্ঞানের মিশ্রণের উপর কাজ করে, যেমন সিংহ ও নেকড়েগুলির জ্ঞাত অবস্থান এবং ভবিষ্যতের অবস্থানগুলির পূর্বাভাস এবং হিভমাইন্ড জ্ঞান যেমন আনুমানিক জনসংখ্যা, নেকড়ে যুদ্ধের ইতিহাস এবং চলন্ত অবস্থায় কোনও প্রাণী প্রতিপক্ষের সাথে সংঘর্ষের আশঙ্কার মতো প্যাক করে। এটি অতিরিক্ত ব্যপক, কারণ প্রচুর যুক্তিযুক্ত হওয়া ছাড়াও আমি অবজেক্ট-ওরিয়েন্টেড ডিজাইনে ওভারবোর্ডে গিয়েছিলাম এবং প্রচুর বিশেষ-উদ্দেশ্যমূলক ক্লাস এবং পদ্ধতি রয়েছে।

আমি জনপ্রিয় এবং সেরা-পারফর্মিং নেকড়ের সাথে এক সাথে 1000 টি পদক্ষেপের জন্য 100 টি পুনরায় গেমটি করেছি। আমি উদ্দেশ্যমূলকভাবে গাম্বারওয়াল্ফকে এড়িয়ে গেছি কারণ আমি ভেবেছিলাম এটি কিছুটা প্রতারণাপূর্ণ, যদিও এটি আমার নেকড়কে কোনওভাবে প্রভাবিত করা উচিত নয়। এখানে গড়, সর্বাধিক এবং সর্বনিম্ন পারফরম্যান্স ডেটা রয়েছে:

Averages:
Bear 0.0
Lion 0.0
Stone 3.51
Wolf 1.56
AlphaWolf 77.05
CamperWolf 69.17
DeepWolf 90.48
EmoWolf 39.92
GatheringWolf 52.15
HerjanWolf 86.55
HonorWolf 86.76
HybridWolf 86.78
LazyWolf 71.11
LionHunterWolf 32.45
MimicWolf 0.4
MOSHPITFRENZYWolf 8.95
OmegaWolf 88.67
ProAlpha 83.28
Sheep 54.74
StoneEatingWolf 75.29
WolfWithoutFear 11.9

Maxes:
Bear 0
Lion 0
Stone 9
Wolf 4
AlphaWolf 89
CamperWolf 81
DeepWolf 96
EmoWolf 57
GatheringWolf 65
HerjanWolf 95
HonorWolf 97
HybridWolf 95
LazyWolf 83
LionHunterWolf 41
MimicWolf 3
MOSHPITFRENZYWolf 22
OmegaWolf 95
ProAlpha 91
Sheep 66
StoneEatingWolf 88
WolfWithoutFear 18

Mins:
Bear 0
Lion 0
Stone 0
Wolf 0
AlphaWolf 65
CamperWolf 57
DeepWolf 83
EmoWolf 26
GatheringWolf 37
HerjanWolf 79
HonorWolf 79
HybridWolf 79
LazyWolf 58
LionHunterWolf 20
MimicWolf 0
MOSHPITFRENZYWolf 1
OmegaWolf 81
ProAlpha 70
Sheep 43
StoneEatingWolf 66
WolfWithoutFear 5

ডিপওল্ফ 90.48 গড়ে গড়ে প্রথম স্থানে রয়েছে, যদিও দ্বিতীয় স্থান ওমেগাওল্ফের 88.67 এর চেয়ে প্রায় 2 জনের সরু নেতৃত্বের সাথে রয়েছে। প্রায় 4x কোডের লাইনগুলি কেবলমাত্র 2% উন্নতির জন্য! হার্জান ওল্ফ, হোনারওয়াল্ফ এবং হাইব্রিড ওল্ফ তৃতীয় স্থানে রয়েছে, যথাক্রমে 86 86.৫৫,। 86.7676 এবং। 86.78 a গড়ে যথাক্রমে ওমেগাওল্ফকে আরও ২ টি করে পিছনে ফেলেছে।

আরও অ্যাডো না করে আমি কোডটি উপস্থাপন করব। এটি এত বিশাল যে সম্ভাব্য ত্রুটি এবং / অথবা উন্নত ধ্রুবক / যুক্তির সম্ভাবনা রয়েছে যা আমি দেখতে সক্ষম হইনি। আপনার যদি কোনও প্রতিক্রিয়া থাকে তবে আমাকে জানান!

এই লিঙ্কটিতে কোড, কারণ এটি পোস্টের চরিত্রের সীমাটি ফুটিয়ে তুলেছে : আইডিয়ন


আমি জানি না যে ড্রপবক্স-ব্যবহারকারীর ফাইলটি হারাবে কিনা, তাই আমি এটি আইডিয়োনে পোস্ট করেছি: আদর্শ one.com/uRNxvj
জাস্টিন

3
@ রানার 1112 চিত্তাকর্ষক! আমি কোডটি দেখছি এবং আমি কিছুটা হারিয়েছি: পি কিন্তু একটি ধারণা যা আমাকে উদ্বেগ দেয় তা হ'ল আপনি যে সিদ্ধান্তের ভিত্তিতে নেকড়েদের বন্ধুত্বপূর্ণ কিনা তা ভিত্তিতে ব্যবহার করছেন
মোগি

@ মৃগি নেকড়ে বন্ধুত্বপূর্ণ কিনা সে সম্পর্কে কোনও প্রতিরোধমূলক মূল্যায়ন করা হয় না। যাইহোক, আমরা নেকড়ে প্রজাতির সংখ্যা জানি, আমরা জানি যে প্রতিটি প্রজাতি 100 থেকে শুরু হয়, আমরা জানি যে আরও কতটা বন্ধুত্বপূর্ণ নেকড়ে রয়েছে এবং আমরা অনুমান করতে পারি যে আমরা যে সংখ্যাটি মেরেছি তার উপর ভিত্তি করে কতটা বন্ধুত্বপূর্ণ নেকড়ে রেখে গেছে এবং অন্যান্য প্রাণীর মধ্যে কতজন মারা গেছে তা অনুমান করুন। এগুলি থেকে, আমরা যে সম্ভাবনাটি দেখি যে কোনও নেকড়ে আমরা বন্ধুত্বপূর্ণ appro এই তথ্যের বিশাল প্রভাব নেই, তবে সম্ভাব্যভাবে নেকড়েের লড়াই করা বা সিংহের সাথে লড়াই করার ক্ষেত্রে এটির মধ্যে পার্থক্য হতে পারে।
রানার 1112

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

@ রাশার ওহ, ওফ! আমি মনে করি আমি এখনও স্যান্ডবক্স থেকে গেম কোডটির একটি পুরানো সংস্করণ নিয়ে চলছিলাম, এবং হয় MAP_SIZEভেরিয়েবলটি আসলে তখন উপস্থিত ছিল না বা কোনও কারণে আমি এটিকে উপেক্ষা করে এর নিজস্ব স্ট্যাটিক সংস্করণে যুক্ত করেছি। আমি আরও আশ্চর্য হই যে কেন আমার নেকড়ে আমার পরীক্ষায় অন্যান্য নেকড়েগুলির চেয়ে নিয়মিত কিছুটা ভাল রান করে, তবে আপনার চেয়ে আরও খারাপ হয়েছে ... নেকড়ে সেট, আমার ধারণা? বা আপনি কি 1000 ব্যতীত আরও কয়েকটি পুনরাবৃত্তির জন্য আপনার গেমগুলি চালাচ্ছেন? অথবা আপনার কেবলমাত্র বৃহত্তর নমুনার আকারের প্রয়োজন হতে পারে, 5 এর পরিসংখ্যানগত দিক থেকে এটি দুর্দান্ত নয়।
রানার 1112

21

WolfRunningWithScissors

কেউ উল্ফরানিংবিথসিসিজারকে কাঁচি দিয়ে না চলতে বলেছিলেন। অথবা হতে পারে তারা করেছে তবে সে তা যাইহোকই করে।

যদি সে কোনও শত্রুতে দৌড়ায় তবে সে হয় কাঁচি দিয়ে জিতবে, কাঁচি দিয়ে হারাবে, কাঁচি দিয়ে বেঁধে দেবে, বা চোখ ছুঁড়ে ফেলবে (আত্মহত্যা)।

package animals;

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


public class WolfRunningWithScissors extends Animal{

    public WolfRunningWithScissors() {
        super('W');
    }

    @Override
    public Attack fight(char c) {
        List<Attack> att = new ArrayList<>();
        att.add(Attack.SCISSORS);
        att.add(Attack.SUICIDE);
        Collections.shuffle(att);
        return att.get(0);
    }

    @Override
    public Move move() {
        List<Move> m = new ArrayList<>();
        m.add(Move.UP);
        m.add(Move.DOWN);
        m.add(Move.LEFT);
        m.add(Move.RIGHT);
        Collections.shuffle(m);
        return m.get(0);
    }

}

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


14

ওমেগা ওল্ফ

পরস্পর নির্ভরশীলভাবে উত্পন্ন সমাধান যা আলফা ওল্ফের সাথে খুব একই রকম আচরণ করে, তাই নাম ওমেগা ওল্ফ

এই নেকড়েটি আশেপাশের কোষগুলির একটি "বিপদ" মানচিত্র উত্পন্ন করে এবং নিরাপদ কক্ষে চলাচল (বা ধরে রাখা) বেছে নেবে।

প্রথমদিকে যে কক্ষগুলি সিংহগুলি পরবর্তী স্থানান্তরিত হবে সেগুলিকে EXTREAME_DANGER স্তর দেওয়া হবে। তারপরে যেকোন সনাক্ত করা নেকড়ের আশেপাশের কোষগুলিকে আক্রমণের প্রতিরোধের উপর ভিত্তি করে বিপদের মাত্রা দেওয়া হয় ... অর্থাৎ যদি নেকড়ে ওমেগা নেকড়ের তির্যক হয় তবে এটি একটি কম হুমকি হিসাবে বিবেচিত হয় তবে সংলগ্ন নেকড়াগুলি একটি মাঝারি হুমকী হিসাবে বিবেচিত হয়।

আশেপাশের কোষগুলিতে হুমকির রক্তপাতের অনুমতি দেওয়ার জন্য "বিপদ" মানচিত্রটি অস্পষ্ট করা হয়। এটি ওমেগা নেকড়ে হুমকি ভেক্টরদের "জ্ঞান" করতে এবং এড়াতে সহায়তা করে।

বর্তমানে আসল আক্রমণ যুক্তি খুব আদিম। আমি আশা করি এটি আরও স্মার্ট দিতে সক্ষম হবে এবং আরও ভাল জয় / হারের অনুপাত খুঁজে পাবে। আমি যদি কিছু পরিসংখ্যানমূলক হিউরিস্টিকস রাখি তবে এটি সম্ভব হবে।

আমার পরীক্ষায় ওমেগা ওল্ফ 10 বারের মধ্যে 9 বার আলফা বটের বিপক্ষে জিতেছে ... যদিও মার্জিনটি খুব ভাল: পি

1000 পুনরাবৃত্তির 100 রাউন্ড পরে গড় বেঁচে থাকা নেকড়েদের দ্রুত ফলাফল:

class animals.OmegaWolf - 85
class animals.HonorWolf - 82
class animals.ProAlpha - 79
class animals.AlphaWolf - 77
class animals.ShadowWolf - 77
class animals.LazyWolf - 62
class animals.CamperWolf - 61
class animals.StoneEatingWolf - 59
class animals.GatheringWolf - 48
class animals.Sheep - 42
class animals.EmoWolf - 34
class animals.LionHunterWolf - 28
class animals.GamblerWolf (no cheating) - 27
class animals.WolfWithoutFear - 11
class animals.MOSHPITFRENZYWolf - 5
class animals.Wolf - 3
class animals.Stone - 2
class animals.Bear - 0
class animals.Lion - 0
class animals.MimicWolf - 0
class animals.Wion - 0

কোড:

package animals;

import wild.Wild;

public class OmegaWolf extends Animal {

    boolean lionWillMoveDown=true;

    private static final int LOW_DANGER = 10;
    private static final int MODERATE_DANGER = LOW_DANGER*2;
    private static final int EXTREAME_DANGER = MODERATE_DANGER*4;

    private static final int UP=1;
    private static final int LEFT=3;
    private static final int RIGHT=5;
    private static final int DOWN=7;
    private static final int UP_LEFT=0;
    private static final int UP_RIGHT=2;
    private static final int DOWN_LEFT=6;
    private static final int DOWN_RIGHT=8;

    private static final int WOLVES_SPECIES_COUNT=(int) Math.round(Math.pow(((float) Wild.MAP_SIZE)/20,2)-3)-3;

    /*
     * Interdependently derived solution that behaves very similar to Alpha Wolf, hence the name Omega Wolf
     * 
     * This wolf generates a "danger" map of the surrounding cells and will choose the movement (or hold) to the safest cell.
     * 
     * The firstly the cells where lions will move next are given EXTREAME_DANGER level
     * Then the cells surrounding any detected Wolves are given danger levels based on the immediacy of attack... i.e. if the wolf is diagonal to the omega wolf 
     * it is deemed a low threat however wolves that are adjacent are deemed a moderate threat.
     * The "danger" map is then blurred to allow bleeding of the threats to surrounding cells. This allows the omega wolf to "sense" threat vectors and to avoid it.
     * 
     * Currently the actual attack logic is very primitive. I hope to be able to give it more smarts and eek out better win/lose ratios. This should be possible if 
     * I put in some statistical heuristics.
     */

    public OmegaWolf() { 
        super('W'); }


    @Override
    public Attack fight(char opponent) {
        switch(opponent){
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S': 
            return Attack.PAPER;
        default:
            // if there is only one wolf species then it must be another omega wolf.
            if (WOLVES_SPECIES_COUNT==1)
            {
                return Attack.SCISSORS;
            }
            else
            {
                // lets just choose an attack with equal weight.
                double rand = Math.random();
                if (rand < 0.333333)
                {
                    return Attack.PAPER;
                }
                if (rand < 0.666667)
                {
                    return Attack.SCISSORS;
                }
                return Attack.ROCK;

            }
        }
    }

    public Move move() {

        lionWillMoveDown = !lionWillMoveDown;


        Move move = Move.HOLD;

        int[][] dangerMap = new int[3][3];
        int[][] blurredDangerMap = new int[3][3];

        // sense Lion Danger
        for (int y=0;y<3;y++)
        {
            for (int x=0;x<3;x++)
            {
                if (surroundings[y][x]=='L')
                {
                    if (lionWillMoveDown && y!=2)
                    {
                        dangerMap[y+1][x]+=EXTREAME_DANGER;
                    }
                    else if (x!=2)
                    {
                        dangerMap[y][x+1]+=EXTREAME_DANGER;
                    }
                }
            }
        }

        // sense Wolf Danger adjacent
        // UP
        if (surroundings[0][1]=='W')
        {
            dangerMap[0][1]+=MODERATE_DANGER;
            dangerMap[0][0]+=LOW_DANGER;
            dangerMap[0][2]+=LOW_DANGER;
            dangerMap[1][1]+=MODERATE_DANGER;
        }
        // DOWN
        if (surroundings[2][1]=='W')
        {
            dangerMap[2][1]+=MODERATE_DANGER;
            dangerMap[2][0]+=LOW_DANGER;
            dangerMap[2][2]+=LOW_DANGER;
            dangerMap[1][1]+=MODERATE_DANGER;
        }
        // LEFT
        if (surroundings[1][0]=='W')
        {
            dangerMap[1][0]+=MODERATE_DANGER;
            dangerMap[0][0]+=LOW_DANGER;
            dangerMap[2][0]+=LOW_DANGER;
            dangerMap[1][1]+=MODERATE_DANGER;
        }
        // RIGHT
        if (surroundings[1][2]=='W')
        {
            dangerMap[1][2]+=MODERATE_DANGER;
            dangerMap[0][2]+=LOW_DANGER;
            dangerMap[2][2]+=LOW_DANGER;
            dangerMap[1][1]+=MODERATE_DANGER;
        }

        // sense Wolf Danger diagonally
        // UP_LEFT
        if (surroundings[0][0]=='W')
        {
            dangerMap[0][0]+=LOW_DANGER;
            dangerMap[0][1]+=MODERATE_DANGER;
            dangerMap[1][0]+=MODERATE_DANGER;
        }
        // DOWN_LEFT
        if (surroundings[2][0]=='W')
        {
            dangerMap[2][0]+=LOW_DANGER;
            dangerMap[2][1]+=MODERATE_DANGER;
            dangerMap[1][0]+=MODERATE_DANGER;
        }
        // UP_RIGHT
        if (surroundings[0][2]=='W')
        {
            dangerMap[0][2]+=LOW_DANGER;
            dangerMap[1][2]+=MODERATE_DANGER;
            dangerMap[0][1]+=MODERATE_DANGER;
        }
        // DOWN_RIGHT
        if (surroundings[2][2]=='W')
        {
            dangerMap[2][2]+=LOW_DANGER;
            dangerMap[2][1]+=MODERATE_DANGER;
            dangerMap[1][2]+=MODERATE_DANGER;
        }


        // generate a blurred danger map. This bleeds danger to surrounding cells.
        int yj,xi,sampleCount,cumulativeDanger;
        for (int y=0;y<3;y++)
        {
            for (int x=0;x<3;x++)
            {
                sampleCount=0;
                cumulativeDanger=0;
                for (int j=-1;j<2;j++)
                {
                    for (int i=-1;i<2;i++)
                    {
                        yj=y+j;
                        xi=x+i;
                        if (yj>-1 && yj<3 && xi>-1 && xi<3)
                        {
                            cumulativeDanger+=dangerMap[yj][xi];
                            sampleCount++;
                        }
                    }
                }
                blurredDangerMap[y][x]=(dangerMap[y][x]+cumulativeDanger/sampleCount)/2;
            }
        }

        // find the safest cell
        int safestCellDanger=Integer.MAX_VALUE;
        int safestCellId = -1;
        int cellId=0;

        for (int y=0;y<3;y++)
        {
            for (int x=0;x<3;x++)
            {
                if (blurredDangerMap[y][x]<safestCellDanger)
                {
                    safestCellDanger=blurredDangerMap[y][x];
                    safestCellId=cellId;
                }
                cellId++;
            }
        }

        // safest cell is adjacent so move there
        if ((safestCellId&1)==1)
        {
            switch (safestCellId)
            {
                case UP:
                    move=Move.UP;
                    break;
                case LEFT:
                    move=Move.LEFT;
                    break;
                case RIGHT:
                    move=Move.RIGHT;
                    break;
                case DOWN:
                    move=Move.DOWN;
                    break;
            }
        }
        // safestCell is a diagonal cell or current cell
        else
        {
            // lets initialise the move to Hold.
            move = Move.HOLD;

            switch (safestCellId)
            {
                case UP_LEFT:

                    // check to see whether holding is not safer than moving up
                    if (dangerMap[1][1] > dangerMap[0][1] )
                    {
                        // move up if safer than moving left or if equally safe, when randomly chosen 
                        if (dangerMap[0][1] < dangerMap[1][0] || (dangerMap[0][1] == dangerMap[1][0] && Math.random()>0.5))
                        {
                            move=Move.UP;
                        } 
                        // left must be safest :P
                        else
                        {

                            move=Move.LEFT;
                        }
                    }
                    // check to see whether holding is not safer than moving left
                    else if (dangerMap[1][1] > dangerMap[1][0] )
                    {
                        move=Move.LEFT;
                    }

                    break;
                case UP_RIGHT:
                    // check to see whether holding is not safer than moving up
                    if (dangerMap[1][1] > dangerMap[0][1] )
                    {
                        // move up if safer than moving right or if equally safe, when randomly chosen 
                        if (dangerMap[0][1] < dangerMap[1][2]|| (dangerMap[0][1] == dangerMap[1][2] && Math.random()>0.5))
                        {
                            move=Move.UP;
                        } 
                        // right must be safest :P
                        else
                        {
                            move=Move.RIGHT;
                        }
                    }
                    // check to see whether holding is not safer than moving right
                    else if (dangerMap[1][1] > dangerMap[1][2] )
                    {
                        move=Move.RIGHT;
                    }
                    break;
                case DOWN_LEFT:
                    // check to see whether holding is not safer than moving down
                    if (dangerMap[1][1] > dangerMap[2][1] )
                    {
                        // move down if safer than moving left or if equally safe, when randomly chosen 
                        if (dangerMap[2][1] < dangerMap[1][0]|| (dangerMap[2][1] == dangerMap[1][0] && Math.random()>0.5))
                        {
                            move=Move.DOWN;
                        } 
                        // left must be safest :P
                        else
                        {
                            move=Move.LEFT;
                        }
                    }
                    // check to see whether holding is not safer than moving left
                    else if (dangerMap[1][1] > dangerMap[1][0] )
                    {
                        move=Move.LEFT;
                    }
                    break;
                case DOWN_RIGHT:
                    // check to see whether holding is not safer than moving down
                    if (dangerMap[1][1] > dangerMap[2][1] )
                    {
                        // move down if safer than moving right or if equally safe, when randomly chosen 
                        if (dangerMap[2][1] < dangerMap[2][2] || (dangerMap[2][1] == dangerMap[1][2] && Math.random()>0.5))
                        {
                            move=Move.DOWN;
                        } 
                        // right must be safest :P
                        else
                        {
                            move=Move.RIGHT;
                        }
                    }
                    // check to see whether holding is not safer than moving right
                    else if (dangerMap[1][1] > dangerMap[1][2] )
                    {
                        move=Move.RIGHT;
                    }
                    break;
            }
        }

        return move;

    }
}

14

StoneGuardianWolf

এটি বেশ মজা ছিল। আমি জাভাস্ক্রিপ্টে জাভাস্ক্রিপ্টটিতে জাভাস্ক্রিপ্টটিতে একটি দৃ cl় বন্দর তৈরি করেছি ভিজ্যুয়ালাইজেশনের জন্য ক্রিয়েজিএস সমর্থন সহ: জাভাস্ক্রিপ্ট স্টোনগার্ডিয়ানওয়াল্ফ

স্টোনগার্ডিয়ান ওল্ফ পোষা পাথর সন্ধান করে স্টোনসের পাশে আশ্রয় নেয়। তিনি তাদের রক্ষা করেন এবং তাদের সুরক্ষার জন্য বরং নিজেকে ত্যাগ করুন।

পরিসংখ্যান

একক খেলোয়াড়: olf 75% ওল্ফের বেঁচে থাকার হার + 35% পোষা প্রাণীর (প্রস্তর) বেঁচে থাকার হার।

সংক্ষিপ্তসার: 75% + 35% ---> 110% সাফল্যের হার! :)

মাল্টি প্লেয়ার: অচিহ্নিত।

লগ পরিবর্তন করুন

ভি 2: আপডেট এআই বনাম গেম্বারওয়াল্ফ এবং পোষা রক কৌশল খুঁজছেন।

v1: ভাল নেকড়ে এড়ানো

v0: জন্মদিন

জাভা কোড

package animals;

public class StoneGuardianWolf extends Animal {
    public StoneGuardianWolf() {
        super('W');
    }

    private boolean petRock = false;
    private int heartache = 0;

    public Attack fight(char c) {
        this.heartache--;

        switch (c) {
        case 'B':
            return Attack.SCISSORS;
        case 'L':
            return Attack.SCISSORS;
        case 'S': // A motherly sacrifice
            return Attack.SUICIDE;
        default:
            int n = this.heartache % 3;
            if (n < 1)
                return Attack.PAPER;
            if (n < 2)
                return Attack.ROCK;
            return Attack.SCISSORS;
        }
    }

    public Move move() {
        char[][] surr = this.surroundings;
        int[][] clairvoyance = new int[3][3];

        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                clairvoyance[i][j] = 1;

        boolean seeNoStone = true;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                switch (surr[i][j]) {
                case 'L':
                    if (i < 1 && j < 1) {
                        clairvoyance[1][0] += 50;
                        clairvoyance[0][1] += 50;
                    }

                    if (i == 1 && j < 1) { // above
                        clairvoyance[1][1] += 50;
                    }

                    if (i < 1 && j == 1) { // left
                        clairvoyance[1][1] += 50;
                    }
                    break;

                case 'S': // seek stones for protection
                    seeNoStone = false;
                    this.petRock = true;
                    clairvoyance[i][j] += 999; // Only hugs!
                    if (i < 2)
                        clairvoyance[i + 1][j] -= 10;
                    if (j < 2)
                        clairvoyance[i][j + 1] -= 10;
                    if (i > 0)
                        clairvoyance[i - 1][j] -= 10;
                    if (j > 0)
                        clairvoyance[i][j - 1] -= 10;
                    break;

                case 'B': // ignore bears
                    break;

                case 'W':
                    // skip self
                    if (i == 1 && j == 1)
                        continue;
                    int m = 25; // avoid wolves

                    // don't fight unless pet rock is in danger
                    if (petRock)
                        clairvoyance[i][j] -= 999; // motherly wrath
                    else
                        clairvoyance[i][j] += 100;

                    // avoid stepping into wolf path
                    if (i != 1 && j != 1) {
                        if (i < 2)
                            clairvoyance[i + 1][j] += m;
                        if (j < 2)
                            clairvoyance[i][j + 1] += m;
                        if (i > 0)
                            clairvoyance[i - 1][j] += m;
                        if (j > 0)
                            clairvoyance[i][j - 1] += m;
                    }
                    break;

                default:
                    clairvoyance[i][j] += 0;
                }
            } // for loop
        } // for loop

        int size = clairvoyance[1][1];
        int x = 1;
        int y = 1;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (i != 1 || j != 1)
                    continue;
                int tmp = clairvoyance[i][j];
                if (tmp < size) {
                    size = tmp;
                    x = i;
                    y = j;
                }
            }
        }

        if (seeNoStone)
            this.heartache++;

        this.petRock = false;
        if (seeNoStone && heartache % 10 == 0) { // Find a pet stone! :3
            if ((heartache % 3) < 2 || clairvoyance[1][2] >= 45) {
                // try move right
                if (clairvoyance[2][1] < 45)
                    return Move.RIGHT;
            }

            // try down instead
            if (clairvoyance[1][2] < 45)
                return Move.DOWN;
        }

        if (x == 0 && y == 1)
            return Move.LEFT;
        if (x == 2 && y == 1)
            return Move.RIGHT;
        if (x == 1 && y == 0)
            return Move.UP;
        if (x == 1 && y == 2)
            return Move.DOWN;

        if (!seeNoStone)
            this.petRock = true;

        return Move.HOLD;
    }
}

5
পাথর খাওয়া উলফ খিলানের শত্রু!
এভেরোয়েস

:) প্রকৃতপক্ষে - আমার পোষা পাথরের কাছাকাছি আপনাকে দিচ্ছে না! ক্যামো ওল্ফ এসজিডাব্লুটিকে বেশ শক্তভাবে চড় মারে।
তালমোবি

1
ভাগ্যক্রমে আপনার ক্যামো ওল্ফকে বৈধ প্রবেশিকা = ডি হিসাবে অন্তর্ভুক্ত করার দরকার নেই
জাস্টহাল্ফ

14

এটা কি ছেলে? এটি কি নেকড়ে? না, এটা

BoyWhoCriedWolf.java

লোকেরা পুরো জায়গা জুড়ে প্রতিবিম্ব ব্যবহার করছে, তাই আমি বুঝতে পেরেছি, কেন এটিকে আরও একধাপ এগিয়ে নিয়ে যাবেন না?
আমি আপনাকে উপস্থাপন করছি: নেকড়ে যে হারিয়ে যেতে পারে না।

package animals;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.instrument.ClassDefinition;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import javax.xml.bind.DatatypeConverter;

public class BoyWhoCriedWolf extends Animal {

    private static boolean ranAgent;

    public static void installAgent() {
        try {
            ranAgent = true;
            String javaExec = new File(System.getProperty("java.home"), "bin").getAbsolutePath() + File.separator + "java";
            Process proc = new ProcessBuilder(javaExec, "-cp", System.getProperty("java.class.path"),
                    "animals.BoyWhoCriedWolf", ManagementFactory.getRuntimeMXBean().getName().split("@")[0])
                    .inheritIO().start();
            proc.waitFor();
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }
    }

    public BoyWhoCriedWolf() {
        super('W');
        if (!ranAgent) {
            installAgent();
        }
    }

    @Override
    public Attack fight(char c) {
        return Attack.PAPER; // I like paper, it's my rubber duck.
    }

    @Override
    public Move move() {
        return Move.HOLD; // I'm terribly lazy.
    }

    public static void main(String[] args) {
        try {
            File temp = File.createTempFile("agent-", ".jar");
            temp.deleteOnExit();
            Manifest manifest = new Manifest();
            manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
            manifest.getMainAttributes().put(new Attributes.Name("Agent-Class"), "animals.BoyWhoCriedWolf");
            manifest.getMainAttributes().put(new Attributes.Name("Can-Redefine-Classes"), "true");
            JarOutputStream jos = new JarOutputStream(new FileOutputStream(temp), manifest);
            jos.close();

            // Add tools.jar
            Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            addURL.setAccessible(true);
            addURL.invoke(ClassLoader.getSystemClassLoader(), new URL("file:" + System.getProperty("java.home") + "/../lib/tools.jar"));

            Class<?> virtualMachineClass = Class.forName("com.sun.tools.attach.VirtualMachine");
            Object vm = virtualMachineClass.getDeclaredMethod("attach", String.class).invoke(null, args[0]);
            virtualMachineClass.getDeclaredMethod("loadAgent", String.class).invoke(vm, temp.getAbsolutePath());
            virtualMachineClass.getDeclaredMethod("detach").invoke(vm);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void agentmain(String args, Instrumentation instr) throws ClassNotFoundException, UnmodifiableClassException {
        instr.redefineClasses(new ClassDefinition(wild.Game.class, DatatypeConverter.parseBase64Binary(base64Game)));
    }

    private static final String base64Game =
              "yv66vgAAADMA9QoAOQCRBwCSCgACAJEJABIAkwkAEgCUBwCVCgAGAJEJABIAlgoABgCXCgAGAJgK"
            + "AAIAmQoABgCaCgCbAJwHAJ0HAJ4KABIAnwoAEgCgBwChCgASAKIHAKMKABIApAkAFAClCgAUAKYH"
            + "AKcJAGUAqAkAOgCpCgBlAKoKAAYAqwsArACtCwCsAK4KAAYArwcAsAoABgCxCQAUALIKABQAswkA"
            + "cQC0CgC1ALYGP+AAAAAAAAAJADoAtwoAcQCqCQBxALgJAHEAuQkAcQC6CgCbALsIALwHAL0KAC8A"
            + "kQoALwC+CAC/CgAvAMAKAC8AwQgAwggAwwgAxAcAjQcAxQcAxgEADElubmVyQ2xhc3NlcwEABWJv"
            + "YXJkAQAVTGphdmEvdXRpbC9BcnJheUxpc3Q7AQAJU2lnbmF0dXJlAQBVTGphdmEvdXRpbC9BcnJh"
            + "eUxpc3Q8TGphdmEvdXRpbC9BcnJheUxpc3Q8TGphdmEvdXRpbC9BcnJheUxpc3Q8TGFuaW1hbHMv"
            + "QW5pbWFsOz47Pjs+OwEAA2dlbgEAEkxqYXZhL3V0aWwvUmFuZG9tOwEABFNJWkUBAAFJAQAGPGlu"
            + "aXQ+AQAEKEkpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUB"
            + "AAFqAQABaQEABHRoaXMBAAtMd2lsZC9HYW1lOwEABHNpemUBAA1TdGFja01hcFRhYmxlBwChAQAI"
            + "cG9wdWxhdGUBABUoTGphdmEvbGFuZy9DbGFzcztJKVYBAAFlAQAoTGphdmEvbGFuZy9SZWZsZWN0"
            + "aXZlT3BlcmF0aW9uRXhjZXB0aW9uOwEAA3JvdwEAA2NvbAEAB3NwZWNpZXMBABFMamF2YS9sYW5n"
            + "L0NsYXNzOwEAA251bQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABZMamF2YS9sYW5nL0NsYXNz"
            + "PFRUOz47BwDHBwDIAQAuPFQ6TGFuaW1hbHMvQW5pbWFsOz4oTGphdmEvbGFuZy9DbGFzczxUVDs+"
            + "O0kpVgEAB2l0ZXJhdGUBAAMoKVYBAAdtb3ZlQWxsAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAB"
            + "YQEAEExhbmltYWxzL0FuaW1hbDsBAAVhTW92ZQcAyQEABE1vdmUBABVMYW5pbWFscy9BbmltYWwk"
            + "TW92ZTsBAARnYW1lBwCjBwCnBwDJAQAHZmxhdHRlbgEABXJhbmQxAQAFcmFuZDIBAAFiAQAFYVRh"
            + "Y2sHAMoBAAZBdHRhY2sBABdMYW5pbWFscy9BbmltYWwkQXR0YWNrOwEABWJUYWNrAQAEY2VsbAEA"
            + "J0xqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmltYWxzL0FuaW1hbDs+OwEAPkxqYXZhL3V0aWwvQXJy"
            + "YXlMaXN0PExqYXZhL3V0aWwvQXJyYXlMaXN0PExhbmltYWxzL0FuaW1hbDs+Oz47BwDLBwCVBwDK"
            + "AQAEcG9sbAEAFChMamF2YS9sYW5nL0NsYXNzOylJAQABYwEABWNvdW50AQAIdG9TdHJpbmcBABQo"
            + "KUxqYXZhL2xhbmcvU3RyaW5nOwEAAXMBABJMamF2YS9sYW5nL1N0cmluZzsHAMwBAAdnZXRBcmVh"
            + "AQAHKElJKVtbQwEABXRlbXAxAQAFdGVtcDIBAAV0ZW1wMwEABXRlbXA0AQABbAEAAWsBAARhcmVh"
            + "AQADW1tDBwDNAQAKU291cmNlRmlsZQEACUdhbWUuamF2YQwARABfAQAQamF2YS91dGlsL1JhbmRv"
            + "bQwAQABBDABCAEMBABNqYXZhL3V0aWwvQXJyYXlMaXN0DAA8AD0MAM4AzwwA0ADRDADSANMMANQA"
            + "1QcAxwwA1gDXAQAgamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb24BACBqYXZhL2xhbmcv"
            + "SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgwAYABfDABsAF8BAAl3aWxkL0dhbWUMAEQARQEADmFuaW1h"
            + "bHMvQW5pbWFsDACEAIUMANgAjQwA2QDaAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwA2wBnDADcAN0M"
            + "AN4A3wwA4ADhBwDLDADiANUMAOMA1wwATQDfAQAXYW5pbWFscy9Cb3lXaG9DcmllZFdvbGYMAOQA"
            + "zwwA5QDmDADnAOgMAOkAcwcA6gwA6wDsDADtAN0MAO4AcwwA7wBzDADwAHMMAPEAzwEABjxodG1s"
            + "PgEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyDADyAPMBAAwmbmJzcDsmbmJzcDsMAH8AgAwA8gD0"
            + "AQAGJm5ic3A7AQAEPGJyPgEABzwvaHRtbD4BABBqYXZhL2xhbmcvT2JqZWN0AQALd2lsZC9HYW1l"
            + "JDEBAA9qYXZhL2xhbmcvQ2xhc3MBACZqYXZhL2xhbmcvUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2Vw"
            + "dGlvbgEAE2FuaW1hbHMvQW5pbWFsJE1vdmUBABVhbmltYWxzL0FuaW1hbCRBdHRhY2sBABJqYXZh"
            + "L3V0aWwvSXRlcmF0b3IBABBqYXZhL2xhbmcvU3RyaW5nAQACW0MBAANhZGQBABUoTGphdmEvbGFu"
            + "Zy9PYmplY3Q7KVoBAANnZXQBABUoSSlMamF2YS9sYW5nL09iamVjdDsBAAduZXh0SW50AQAEKEkp"
            + "SQEAB2lzRW1wdHkBAAMoKVoBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQAM"
            + "c3Vycm91bmRpbmdzAQAEbW92ZQEAFygpTGFuaW1hbHMvQW5pbWFsJE1vdmU7AQAESE9MRAEAHiRT"
            + "d2l0Y2hNYXAkYW5pbWFscyRBbmltYWwkTW92ZQEAAltJAQAHb3JkaW5hbAEAAygpSQEACGl0ZXJh"
            + "dG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwEAB2hhc05leHQBAARuZXh0AQAGcmVtb3ZlAQAG"
            + "bGV0dGVyAQABQwEABWZpZ2h0AQAaKEMpTGFuaW1hbHMvQW5pbWFsJEF0dGFjazsBAAdTVUlDSURF"
            + "AQAOamF2YS9sYW5nL01hdGgBAAZyYW5kb20BAAMoKUQBACAkU3dpdGNoTWFwJGFuaW1hbHMkQW5p"
            + "bWFsJEF0dGFjawEABVBBUEVSAQAIU0NJU1NPUlMBAARST0NLAQAKaXNJbnN0YW5jZQEABmFwcGVu"
            + "ZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEAHChDKUxq"
            + "YXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAIQASADkAAAADAAIAPAA9AAEAPgAAAAIAPwASAEAAQQAA"
            + "ABQAQgBDAAAACAAEAEQARQABAEYAAADtAAMABAAAAF8qtwABKrsAAlm3AAO1AAQqG7UABSq7AAZZ"
            + "twAHtQAIAz0cG6IAOyq0AAi7AAZZtwAHtgAJVwM+HRuiAB8qtAAIHLYACsAABrsABlm3AAe2AAlX"
            + "hAMBp//ihAIBp//GsQAAAAMARwAAAC4ACwAAABEABAAOAA8AEgAUABMAHwAUACYAFQA1ABYAPAAX"
            + "AFIAFgBYABQAXgAaAEgAAAAqAAQANwAhAEkAQwADACEAPQBKAEMAAgAAAF8ASwBMAAAAAABfAE0A"
            + "QwABAE4AAAAYAAT/ACEAAwcATwEBAAD8ABUB+gAg+gAFAAQAUABRAAIARgAAARwAAgAGAAAAXRye"
            + "AFsqtAAEKrQABbYACz4qtAAEKrQABbYACzYEKrQACB22AArAAAYVBLYACsAABrYADJkAJiq0AAgd"
            + "tgAKwAAGFQS2AArAAAYrtgANtgAJV6cABToFhAL/p/+nsQACADYAUQBUAA4ANgBRAFQADwAEAEcA"
            + "AAAmAAkAAAAdAAQAHgAQAB8AHQAgADYAIQBRACIAVgAjAFkAJQBcACYASAAAAD4ABgBWAAAAUgBT"
            + "AAUAEABJAFQAQwADAB0APABVAEMABAAAAF0ASwBMAAAAAABdAFYAVwABAAAAXQBYAEMAAgBZAAAA"
            + "DAABAAAAXQBWAFoAAQBOAAAAGwAFAP8AUwAFBwBPBwBbAQEBAAEHAFwB+QACAgA+AAAAAgBdAAQA"
            + "XgBfAAEARgAAADsAAQABAAAACSq3ABAqtwARsQAAAAIARwAAAA4AAwAAACkABAAqAAgAKwBIAAAA"
            + "DAABAAAACQBLAEwAAAACAGAAXwABAEYAAAJjAAQABwAAAVu7ABJZKrQABbcAE0wDPRwqtAAFogE/"
            + "Az4dKrQABaIBLyq0AAgctgAKwAAGHbYACsAABrYADJoBESq0AAgctgAKwAAGHbYACsAABgO2AArA"
            + "ABQ6BBkEKhwdtwAVtQAWGQS2ABc6BacACjoGsgAZOgWyABoZBbYAGy6qAAAAAAAAzgAAAAEAAAAF"
            + "AAAAJAAAAEsAAABtAAAAjwAAALYrtAAIHARkKrQABWAqtAAFcLYACsAABh22AArAAAYZBLYACVen"
            + "AIYrtAAIHLYACsAABh0EYCq0AAVwtgAKwAAGGQS2AAlXpwBkK7QACBwEYCq0AAVwtgAKwAAGHbYA"
            + "CsAABhkEtgAJV6cAQiu0AAgctgAKwAAGHQRkKrQABWAqtAAFcLYACsAABhkEtgAJV6cAGyu0AAgc"
            + "tgAKwAAGHbYACsAABhkEtgAJV4QDAaf+z4QCAaf+vyortAAItQAIsQABAF4AZQBoABgAAwBHAAAA"
            + "WgAWAAAALgAMAC8AFgAwACAAMQA4ADIAUwAzAF4ANQBlADYAbwA3AJwAOQDAADoAwwA8AOIAPQDl"
            + "AD8BBABAAQcAQgErAEMBLgBFAUYAMAFMAC8BUgBLAVoATABIAAAAUgAIAGoABQBSAGEABgBTAPMA"
            + "YgBjAAQAZQADAGQAZwAFAG8A1wBkAGcABQAYATQASQBDAAMADgFEAEoAQwACAAABWwBLAEwAAAAM"
            + "AU8AaABMAAEATgAAADYADP0ADgcATwH8AAkB/wBPAAUHAE8HAE8BAQcAaQABBwBq/AAGBwBrLCYh"
            + "ISb5ABf6AAX6AAUAAgBsAF8AAQBGAAADuAAFAAwAAAFfKrQACLYAHEwruQAdAQCZAVAruQAeAQDA"
            + "AAZNLLYAHE4tuQAdAQCZATUtuQAeAQDAAAY6BBkEtgAfBKQBHiq0AAQZBLYAH7YACzYFKrQABBkE"
            + "tgAftgALNgYVBRUGn//uGQQVBbYACsAAFDoHGQQVBrYACsAAFDoIGQfBACCZAA4ZBBkItgAhV6f/"
            + "rBkIwQAgmQAOGQQZB7YAIVen/5kZBxkItAAitgAjOgmnAAo6C7IAJDoJGQgZB7QAIrYAIzoKpwAK"
            + "OguyACQ6ChkJGQqmAB0ZBLgAJRQAJpeeAAgZB6cABRkItgAhV6cAbbIAKBkJtgApLqoAAAAAAABh"
            + "AAAAAQAAAAMAAAAcAAAANAAAAEwZBBkKsgAqpgAIGQenAAUZCLYAIVenADAZBBkKsgArpgAIGQen"
            + "AAUZCLYAIVenABgZBBkKsgAspgAIGQenAAUZCLYAIVen/t+n/sin/q2xAAIAngCqAK0AGAC0AMAA"
            + "wwAYAAQARwAAAHYAHQAAAE8AGwBQADQAUQA9AFMASwBUAGAAVgBsAFcAeABZAIAAWgCIAFsAiwBc"
            + "AJMAXQCbAF4AngBiAKoAYwC0AGQAwABlAMoAZwDRAGgA6wBqARAAbAElAG0BKABvAT0AcAFAAHIB"
            + "VQB2AVgAdwFbAHgBXgB5AEgAAACEAA0ArwAFAFIAYQALAMUABQBSAGEACwBLAQoAbQBDAAUAWQD8"
            + "AG4AQwAGAGwA6QBiAGMABwB4AN0AbwBjAAgAqgADAHAAcwAJALQAoQBwAHMACQDAAAMAdABzAAoA"
            + "ygCLAHQAcwAKADQBJAB1AD0ABAAbAUAAVAA9AAIAAAFfAEsATAAAAFkAAAAWAAIANAEkAHUAdgAE"
            + "ABsBQABUAHcAAgBOAAABFQAa/AAIBwB4/QAXBwB5BwB4/AATBwB5/AAWAf4APwEHAGkHAGkSTgcA"
            + "avwABgcAek4HAGr8AAYHAHpXBwB5/wABAAsHAE8HAHgHAHkHAHgHAHkBAQcAaQcAaQcAegcAegAC"
            + "BwB5BwBpBiROBwB5/wABAAsHAE8HAHgHAHkHAHgHAHkBAQcAaQcAaQcAegcAegACBwB5BwBpBk4H"
            + "AHn/AAEACwcATwcAeAcAeQcAeAcAeQEBBwBpBwBpBwB6BwB6AAIHAHkHAGkGTgcAef8AAQALBwBP"
            + "BwB4BwB5BwB4BwB5AQEHAGkHAGkHAHoHAHoAAgcAeQcAaf8AAwAFBwBPBwB4BwB5BwB4BwB5AAD6"
            + "AAL5AAL6AAIABAB7AHwAAQBGAAABNgACAAkAAABvAz0qtAAItgAcTi25AB0BAJkAXS25AB4BAMAA"
            + "BjoEGQS2ABw6BRkFuQAdAQCZAD4ZBbkAHgEAwAAGOgYZBrYAHDoHGQe5AB0BAJkAHhkHuQAeAQDA"
            + "ABQ6CCsZCLYALZkABoQCAaf/3qf/vqf/oBysAAAABABHAAAAKgAKAAAAfAACAH0AHgB+ADsAfwBY"
            + "AIAAYQCBAGQAggBnAIMAagCEAG0AhQBIAAAAPgAGAFgADABiAGMACAA7ACwAdQA9AAYAHgBMAFQA"
            + "PQAEAAAAbwBLAEwAAAAAAG8AfQBXAAEAAgBtAH4AQwACAFkAAAAWAAIAOwAsAHUAdgAGAB4ATABU"
            + "AHcABABOAAAAJQAH/QAKAQcAeP0AGgcAeQcAeP0AHAcAeQcAeCH5AAL5AAL6AAIAAQB/AIAAAQBG"
            + "AAABWwADAAYAAACqEi5MKrQACLYAHE0suQAdAQCZAIUsuQAeAQDAAAZOLbYAHDoEGQS5AB0BAJkA"
            + "VBkEuQAeAQDAAAY6BRkFtgAMmQAauwAvWbcAMCu2ADESMrYAMbYAM0ynACa7AC9ZtwAwK7YAMRkF"
            + "A7YACsAAFLQAIrYANBI1tgAxtgAzTKf/qLsAL1m3ADArtgAxEja2ADG2ADNMp/94uwAvWbcAMCu2"
            + "ADESN7YAMbYAM7AAAAAEAEcAAAAqAAoAAACJAAMAigAeAIsAOgCMAEIAjQBZAI8AfACQAH8AkQCT"
            + "AJIAlgCTAEgAAAAqAAQAOgBCAHUAPQAFAB4AdQBUAD0AAwAAAKoASwBMAAAAAwCnAIEAggABAFkA"
            + "AAAWAAIAOgBCAHUAdgAFAB4AdQBUAHcAAwBOAAAAIwAG/QALBwCDBwB4/QAYBwB5BwB4/AA0BwB5"
            + "+gAi+gAC+QAWAAIAhACFAAEARgAAAdAABAALAAAApQYGxQA4Ak4CNgQVBASjAJYCNgUVBQSjAIcV"
            + "BARgNgYVBQRgNgcbFQRgKrQABWAqtAAFcDYIHBUFYCq0AAVgKrQABXA2CSq0AAgbFQRgKrQABWAq"
            + "tAAFcLYACsAABhwVBWAqtAAFYCq0AAVwtgAKwAAGOgotFQQEYDIVBQRgGQq2AAyZAAgQIKcADxkK"
            + "A7YACsAAFLQAIlWEBQGn/3mEBAGn/2otsAAAAAQARwAAADIADAAAAJcABwCYABAAmQAZAJoAHwCb"
            + "ACUAnAA1AJ0ARQCeAHMAnwCXAJkAnQCYAKMAogBIAAAAcAALAB8AeACGAEMABgAlAHIAhwBDAAcA"
            + "NQBiAIgAQwAIAEUAUgCJAEMACQBzACQAdQA9AAoAEwCKAIoAQwAFAAoAmQCLAEMABAAAAKUASwBM"
            + "AAAAAAClAEoAQwABAAAApQBJAEMAAgAHAJ4AjACNAAMAWQAAAAwAAQBzACQAdQB2AAoATgAAAFkA"
            + "Bv0ACgcAOAH8AAgB/wB2AAsHAE8BAQcAOAEBAQEBAQcAeQACBwCOAf8ACwALBwBPAQEHADgBAQEB"
            + "AQEHAHkAAwcAjgEB/wAGAAUHAE8BAQcAOAEAAPoABQACAI8AAAACAJAAOwAAABoAAwA6ABIAABAI"
            + "AGUAFABmQBkAcQAUAHJAGQ==";
}

হ্যাঁ, এটি চালাতে জেডিকে দরকার, তবে আমি মনে করি না যে এটি কোনও সমস্যা হবে।


1
অভিশাপ, আপনি আমাকে এটি মারধর। আমি এই সঠিক কৌশলটি নিয়ে একটি সাবোটেজ এজেন্ট ওল্ফের সাথে কাজ করছিলাম।
mackthehobbit

1
এই শ্রেণি কি করে?
justhalf

3
@ আসরাল্ফ এটি নীচের কাছাকাছি বেস 64 এ এনকোড করা ফাইলটির সাথে গেম শ্রেণিকে নতুন সংজ্ঞা দেয়। এই ফাইলটির একটি উদাহরণ রয়েছে যাচাই করা আছে; যদি এটি আমার নেকড়ে হয় তবে অন্যটি সর্বদা মারা যায়।
14mRh4X0r

1
অন্য সমস্ত প্রাণীকে আত্মহত্যা করতে এবং এই বিষয়টিকে হাইপোনাফল বলার জন্য আমার ঠিক এই প্রক্রিয়াটি ব্যবহার করার ধারণা ছিল। আমি এটিকে সঠিকভাবে চালিত করতে পরিচালনা করি নি তবে আপনি করেছেন - শ্রদ্ধা!
ফ্রাঙ্কোইস বুর্জোয়া

12

Wion

প্রত্যাশিত মান হিসাবে যতদিন সম্ভব বেঁচে থাকার জন্য যথাসাধ্য চেষ্টা করার চেষ্টা করুন। এটি সিংহের সমান্তরালে চলে যাওয়ার চেষ্টা করে (এটি কোনও দেখায় কিনা)।

এটি নেকড়েগুলিকে উপেক্ষা করে, যেহেতু এটি সিদ্ধান্ত নেয় যে তারা অনুমানযোগ্য। যদি এটি কোনও নেকড়ের মুখোমুখি হয় তবে এটি প্রায় অর্ধশত মারামারি জিততে হবে (প্যাটার্ন ম্যাচিংয়ের চেষ্টা না করা পর্যন্ত এটি সর্বোত্তম)। আমার নেকড়েদের একে অপরের সাথে লড়াই করা উচিত নয়। যদি এটি সিংহের মুখোমুখি হয় (যা এটি সম্ভবত না হওয়া উচিত) তবে লড়াইয়ের প্রায় 3/4 জয়ের উচিত। ভাল্লুক এবং শিলা সর্বদা হারাতে হবে।

অনুমান করে যে অন্য কৌশলটি ব্যবহার করে সিমুলেশনটিতে কোনও নেকড়ে রয়েছে, তারা আমার নেকড়েদের এড়ানো বুদ্ধিমানের কাজ হবে, যেহেতু তাদের কোনও মুখোমুখি হের সম্ভাবনা 50% রয়েছে। গড়ে এটি কমপক্ষে পাশাপাশি অন্য কোনও কৌশল সম্পাদন করা উচিত।

আমি যদি নিয়মগুলি সঠিকভাবে বুঝতে পারি তবে এটি হওয়া উচিত সর্বোত্তম কৌশল।

package animals;
import java.util.Random;

public class Wion extends Animal {
    private boolean down;
    public Wion() { super('W'); down=true;}
    public Attack fight(char opponent) {
        switch (opponent) {
            case 'B':
            case 'L':
                return Attack.SCISSORS;
            case 'S':
                return Attack.PAPER;
            default:
                Random rn = new Random();
                int i = Math.abs(rn.nextInt() % 4);
                while (i==3) {i = Math.abs(rn.nextInt() % 4);}
                return Attack.values()[i];
        }
    }
    public Move move() {
        down=!down;
        if(!down) { return Move.DOWN; }
        return Move.RIGHT;
    }
}

আমি কেন সত্যই জানি না কেন আমার পরীক্ষায় এটি এত খারাপ হয়। এটি কাগজে ভাল লাগছে, তবে বাস্তবে এটি ইমোওয়াল্ফের সমতুল্য :(
জিওবিটস

@ জিওবিটস আমি সত্যিই এটি টিবিএইচ পরীক্ষা করিনি। আমার ধারণা আমি কোনও নিয়মকে ভুল বুঝেছি, ভুল করেছি, বা আমার এলোমেলো আক্রমণ বনাম নেকড়ে অভিন্নভাবে এলোমেলো নয়।
টিম সেগুইন

@ জিওবিটস আমি আক্রমণটির যুক্তি সরিয়ে নিয়েছি। আমার সন্দেহ হ'ল এটি কখনও কখনও আত্মহত্যা করছিল।
টিম সেগুইন

1
হ্যাঁ, সমস্যাটি কী হয়েছে তা আমি ইতিমধ্যে বুঝতে পেরেছি। আমার যুক্তি কেবলমাত্র এমন জনসংখ্যার সাথে কাজ করতে পারে যা বেশিরভাগ এক অন্য ধরণের নেকড়ে থাকে। এরকম ক্ষেত্রে অন্য নেকড়েদের মুখোমুখি হার আমার হিসাবে প্রায় একই হারে বৃদ্ধি / হ্রাস পাবে। তবে বহু জাতের ক্ষেত্রে, আমার এনকাউন্টারের হারের যে কোনও বৃদ্ধি অন্য সমস্ত নেকড়েদের মধ্যে গড় হিসাবে গড়ে উঠবে, তাই আমার আনুপাতিকভাবে আরও বড় হবে। আমি এটিকে সংশোধন করার জন্য কিছুটা ন্যূনতম উপায়ের কথা ভাবছি, তবে দুর্ভাগ্যক্রমে আমার আরও এই মুহূর্তে মনোনিবেশ করার জন্য আরও গুরুত্বপূর্ণ জিনিস রয়েছে।
টিম সেগুইন

1
তবে আমি একমত যে নেকড়ে অন্য এক জাতের নেকড়ে থাকলে এই পদ্ধতিটি সর্বোত্তম।
justhalf

12

একটি সমষ্টিগত স্মৃতি সঙ্গে নেকড়ে

আরে একটি উলফ প্যাক

এই নেকড়ে প্যাকটির ধারণাটি হ'ল কে জীবিত বা মৃত তা স্মরণে রাখে, মৃত নেকড়ে ও জীবিত নেকড়ে কী আক্রমণ হিসাবে ব্যবহৃত হয় তা যাচাই করে এবং তদনুসারে পছন্দটির সম্ভাবনা পরিবর্তন করে।

এখানে আর কোড রয়েছে:

infile <- file("stdin")
open(infile)
repeat{
    input <- readLines(infile,1)
    type <- substr(input,1,1)
    id <- substr(input,2,3)
    if(nchar(input)>3){
        info <- substr(input,4,nchar(input))
    }else{
        info <- NULL
    }
    attack <- function(id,info){
        if(info%in%c("B","L")){choice <- "S"}
        if(info=="S"){choice <- "P"}
        if(info=="W"){
            if(exists("memory")){
                dead <- memory$ID[memory$Status=="Dead"]
                veteran <- memory[memory$Attack!="" & !is.na(memory$Attack), ]
                if(nrow(veteran[!is.na(veteran[,1]),])>0){
                    deadvet<-veteran[veteran$ID%in%dead,]
                    deadvet<-unlist(lapply(split(deadvet,deadvet$ID),function(x)tail(x$Attack,1)))
                    deadvet <- table(factor(deadvet,levels=c("R","P","S","")))
                    livevet <- table(factor(veteran$Attack,levels=c("R","P","S","")))-deadvet
                    probR <- (1+livevet['R'])/(1+livevet['R']+deadvet['R'])
                    probS <- (1+livevet['S'])/(1+livevet['S']+deadvet['S'])
                    probP <- (1+livevet['P'])/(1+livevet['P']+deadvet['P'])
                    choice <- sample(c("S","P","R"),1,prob=c(probS,probP,probR))
                    memory <- rbind(memory, data.frame(ID=id, Status="Alive", Attack=choice))
                }else{
                    choice <- sample(c("S","P","R"),1)
                    memory <- rbind(memory, data.frame(ID=id, Status="Alive", Attack=choice))
                }
            }else{
                choice <- sample(c("S","P","R"),1)
                memory <- data.frame(ID=id, Status="Alive", Attack=choice)
            }
        }
        paste(choice,id,sep="")
    }
    move <- function(id,info){
        choice <- "H"
        paste(choice,id,sep="")
    }
    initialize <- function(id){
        if(exists("memory")){
            memory <- rbind(memory,data.frame(ID=id,Status="Alive",Attack=""))
        }else{
            memory <- data.frame(ID=id,Status="Alive",Attack="")
        }
        confirmed_dead <- memory$ID[memory$Status=="Dead"]
        last_seen <- memory[!memory$ID%in%confirmed_dead,]
        last_seen <- last_seen[last_seen$Attack=="",]
        lid <- table(last_seen$ID)
        turns <- max(lid)
        dead <- lid[lid<(turns-1)]
        if(length(dead)>0){
            dead_id <- names(dead)
            for(i in dead_id){
                memory <- rbind(memory, data.frame(ID=i, Status="Dead", Attack=""))
            }
        }
        paste("K",id,sep="")
    }
    result <- switch(type,"A"=attack(id,info),"M"= move(id,info),"S"=initialize(id))
    cat(result,"\n",sep="")
    flush(stdout())
}

এটি @ প্রোগ্রামারড্যান র‌্যাপার ব্যবহার করে (আপনাকে ধন্যবাদ!), ওল্ফ কালেক্টিভ মেমরির সাথে কাস্টম নাম এবং "রুপ্রিপ্ট ওল্ফ কালেক্টিভ মেমরি.আর" হিসাবে অনুরোধ হিসাবে।


বেশ কয়েকটি জিনিস - প্রথমে, আমি নিশ্চিত যে আউটপুটগুলি ফ্লাশ করা হচ্ছে না। দ্বিতীয়ত, একবার আপনার প্রক্রিয়াটি মোড়কের দ্বারা ডাকা হয়ে গেলে, এটি চলমান রাখা হয় । আপনার বর্তমান ডিজাইনটি ধরে নিয়েছে যে প্রতিটি সময় নেকড়ের কাছে যোগাযোগ পাঠানোর সময় আপনার প্রক্রিয়াটি আহ্বান করা হয় - প্রক্রিয়া আমন্ত্রণের ক্ষেত্রে এটি খুব ব্যয়বহুল হত, সুতরাং পরিবর্তে আমি প্রক্রিয়াটি শুরু করি এবং যোগাযোগের চ্যানেলগুলি উন্মুক্ত রেখে দেব। সুতরাং, আপনার একটি প্রধান লুপ থাকা উচিত যা ক্রমাগত থেকে লাইনগুলি পড়েন stdinএবং এর জবাবে একটি লাইন লিখেন stdout, এর পরে একটি flush.console()। [চলমান]
প্রোগ্রামারডান

[অবিরত] সিমুলেশন শেষ হওয়ার পরে আমার প্রক্রিয়া মোড়কটিকে শিশু প্রক্রিয়াটি সমাপ্ত করা উচিত।
প্রোগ্রামারডান

@ রুশ এখানে @ প্ল্যানাপাসের আর জমা দেওয়ার জন্য একটি বৈধ মোড়কের সংক্ষিপ্তসার রইল। আর ডাউনলোড করতে এখানে যান Install আর binআপনার ফ্যাট ভেরিয়েবল বা সমতুল্যে আর এর ফোল্ডার যুক্ত করুন এবং আপনার ভাল হওয়া উচিত (আমার পক্ষে ভাল কাজ করেছেন)।
প্রোগ্রামারডান

আমি মনে করি অপরাধী হ'ল readlinesআদেশ। একটি readlineবা সমতুল্য ব্যবহার করার চেষ্টা করুন । readlinesইওএফ অবধি অবরুদ্ধ হবে।
প্রোগ্রামারডান

আমি সবেমাত্র এটি যুক্ত readLinesকরতাম scanreadLinesদ্বিতীয় যুক্তিটির 1অর্থ এটি প্রথম নিউলাইন অক্ষরে থামানো উচিত।
প্ল্যানাপাস

12

MimicWolf

এই নেকড়েটির লক্ষ্য হ'ল অন্যান্য নেকড়ে নকল করা। এটি খুঁজে পেয়েছে যে একটি নেকড়ে এটি তার সাধ্যের সেরাটিকে অনুসরণ করে। মিমিকওল্ফ এর মতো প্রশ্ন জিজ্ঞাসা করে না: আমি কীভাবে এই নেকড় / ভালুক / সিংহ / পাথর এড়াতে পারি?

না, মিমিকওল্ফ কেবল এই জাতীয় প্রশ্ন করে: আমার অনুসরণ করার জন্য নেকড়ে কোথায়? আমি যে নেকড়কে অনুসরণ করছি তা কোথায় যাবে বলে আমি মনে করি? আমি যে নেকড়েটিকে অনুসরণ করছিলাম তা কি অন্যটি নেকড়ে? আমি যে নেকড়ে অনুসরণ করছিলাম সে কোথায় গেল?

আমি স্বীকার করব যে সেই বেশিরভাগ প্রশ্নের এখনও ভাল উত্তর দেওয়া হয়নি, তবে আপাতত আমার মিমিকওয়ালফের জমা দেওয়া আছে

   package animals;
   import java.util.*;

public class MimicWolf extends Animal {

final int TURN_MEMORY = 5;

Random rand = new Random();

Animal.Move lastMove = Animal.Move.UP;

boolean mimicingWolf = false;

Pos[] wolfPreviousPos = new Pos[TURN_MEMORY];
RelativePos[] relativePositions = new RelativePos[TURN_MEMORY];
Move[] wolfPreviousMove = new Move[TURN_MEMORY - 1];

int turnsWithLostWolf = 0;

public MimicWolf() {
    super('W');
}

public Animal.Attack fight(char c) {
    switch (c) {
        case 'B':
            return Animal.Attack.SCISSORS;
        case 'L':
            return Animal.Attack.SCISSORS;
        case 'S':
            return Animal.Attack.PAPER;
        default:
            int x = rand.nextInt(4);
            return Animal.Attack.values()[x];
    }
}

public Animal.Move move() {
    Pos wolfPos = null;
    wolfPos = lookForSurroundingWolf();

    if (turnsWithLostWolf == 4) {
        mimicingWolf = false;
        wolfPreviousPos = new Pos[5];
        relativePositions = new RelativePos[5];
        turnsWithLostWolf = 0;
    }

    if (mimicingWolf) {
        int indexOfLastMove = 0;
        for (int i = 0; wolfPreviousPos[i] != null && i < wolfPreviousPos.length; i++) {
            indexOfLastMove = i;
        }

        //is wolf still visible??
        Pos wolfNewPos = isWolfVisible(wolfPreviousPos[indexOfLastMove]);
        if (wolfNewPos.x == -1) {//wolf is not visible
            turnsWithLostWolf++;
            return moveOppositeDirection(lastMove);
        } else {
            return mimicWolf(wolfNewPos, indexOfLastMove); //need Better way to mimic
        }
    } else {
        //check if new wolf around
        if (wolfPos.x == -1) {
            return searchForWolf();
        } else {
            mimicingWolf = true;
            return mimicWolf(wolfPos, 0);
        }
    }
}

private Animal.Move searchForWolf() {
    Animal.Move newMove = null;
    while (newMove == null || newMove == lastMove) {
        newMove = Animal.Move.values()[rand.nextInt(3)];
    }

    lastMove = newMove;
    return newMove;
}

private Pos lookForSurroundingWolf() {
    for (Integer i = 0; i < surroundings.length; i++) {
        for (Integer j = 0; j < surroundings[0].length; j++) {
            if (i == 1 && j == 1) {
                //this is myself >.<
            } else if (surroundings[i][j] == 'W') {
                return new Pos(i, j);
            }
        }
    }

    return new Pos(-1, -1);
}

/*
    for mimicWolf when movesMimiced == 1 or 2 this is the base case, Any
    number greater the wolf will attempt to mimic the next move based on pattern
    of previous moves
        we assume that we are following the same wolf as last time
 */

private Animal.Move mimicWolf(Pos wolfCurrentPos, int movesMimiced) {
    wolfPreviousPos[movesMimiced] = wolfCurrentPos;
    insertToRelativePos(wolfCurrentPos, movesMimiced);
    if (movesMimiced == 0) {
        Move m1 = null, m2 = null;
        if (wolfPreviousPos[0].x == 0) {
            m1 = Move.LEFT;
        } else if (wolfPreviousPos[0].x == 2) {
            m1 = Move.RIGHT;
        }

        if (wolfPreviousPos[0].y == 0) {
            m2 = Move.UP;
        } else if (wolfPreviousPos[0].y == 2) {
            m2 = Move.DOWN;
        }

        return randOfMoves(m1, m2); //guess which way to go
    }
    wolfPreviousMove[movesMimiced - 1] =  getDirection(wolfPreviousPos[movesMimiced - 1], wolfPreviousPos[movesMimiced]);
    if (movesMimiced == 1) {
        //if pos 1 was a cornor
        if(relativePositions[0] == RelativePos.CORNER){
            if(relativePositions[1] == RelativePos.CORNER){
                if(wolfPreviousPos[0].equals(wolfPreviousPos[1])){
                    return lastMove;
                }
                return moveOppositeDirection(lastMove);
            }
            else if(relativePositions[1] == RelativePos.EDGE){
                return Move.HOLD; //he held so i will hold
            }
        }else if(relativePositions[1] == RelativePos.EDGE){
            if(relativePositions[1] == RelativePos.EDGE){
                return lastMove;
            }
            else if(relativePositions[1] == RelativePos.CORNER){
                //only possibility is that I held, and he moved
                return wolfPreviousMove[0];
            }
        }
    } else {
        //Return most common move the wolf I am copying has made
        int[] mostCommonMoveArr = {0,0,0,0,0};
        for(int i = 0; i <= movesMimiced; i++){
            switch(wolfPreviousMove[i]){
                case UP:
                    mostCommonMoveArr[0]++;
                case RIGHT:
                    mostCommonMoveArr[1]++;
                case DOWN:
                    mostCommonMoveArr[2]++;
                case LEFT:
                    mostCommonMoveArr[3]++;
                case HOLD:
                    mostCommonMoveArr[4]++;
            }
        }

        int maxValue = -1;
        int maxLocal = 0;
        for(int i = 0; i < 5; i++){
            if(mostCommonMoveArr[i] > maxValue)
                maxValue =  mostCommonMoveArr[i];
                maxLocal = i;
        }

        return Move.values()[maxLocal];
    }

    return Move.HOLD; //shouldn't happen
}

private Pos isWolfVisible(Pos lastPos) {
    Pos mimicedWolfPos = lookForSurroundingWolf();
    while (mimicedWolfPos.x != -1 && mimicedWolfPos.y != -1) {
        //did we find the wolf?
        if (lastPos.x == mimicedWolfPos.x || lastPos.y == mimicedWolfPos.y) {
            return mimicedWolfPos;
        }

        surroundings[mimicedWolfPos.x][mimicedWolfPos.y] = ' ';
        mimicedWolfPos = lookForSurroundingWolf();
    }

    return new Pos(-1, -1);
}

private Animal.Move moveOppositeDirection(Move m) {
    switch (m) {
        case UP:
            return Move.DOWN;
        case RIGHT:
            return Move.LEFT;
        case DOWN:
            return Move.UP;
        case LEFT:
            return Move.RIGHT;
        case HOLD:
            return Move.LEFT; //No idea why this would happen but whatever
        default:
            return Move.HOLD;
    }
}

private Animal.Move getDirection(Pos firstPos, Pos secondPos){
    if(firstPos.equals(secondPos))
        return Move.HOLD;
    if(firstPos.x == secondPos.x){
        if(firstPos.y > secondPos.y)
            return Move.UP;
        return Move.DOWN;
    }
    if(firstPos.x > secondPos.x)
        return Move.RIGHT;
    return Move.LEFT;
}


private Animal.Move randOfMoves(Move m1, Move m2) {
    if (m1 == null) {
        return m2;
    } else if (m2 == null) {
        return m1;
    }

    int r = rand.nextInt(2);
    if (r == 0) {
        return m1;
    }
    return m2;
}

private class Pos {
    int x;
    int y;

    protected Pos(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object obj){
        Pos pos = (Pos) obj;
        return (this.x == pos.x && this.y == pos.y);
    }
}

private void insertToRelativePos(Pos pos, int posToAdd){
    if(pos.x == 1 || pos.y == 1){
        relativePositions[posToAdd] = RelativePos.EDGE;
    }else{
        relativePositions[posToAdd] = RelativePos.CORNER;
    }
}

private enum RelativePos{
    CORNER, EDGE
}
}

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


12

প্রবেশ নয়, বেশিরভাগ নেকড়ে কেবল স্থির হওয়ায় এটি দেখতে আসলে বেশ বিরক্তিকর, তাই আমি বন্যের মধ্যে একটি প্রাকৃতিক বিপর্যয় যুক্ত করেছি:

ভূমিকম্প!

প্রায় 5% সময়ে, ভূমিকম্পটি এলোমেলো মাত্রার সাথে ঘটবে, 100 সর্বোচ্চ, 20 সর্বনিম্ন। এটি একটি সেট করবে earthquakeCounterযা ভূমিকম্পের পরে সময়ের সাথে দ্রুত হ্রাস পাবে।

ভূমিকম্পের সময় কী ঘটে?

সমস্ত প্রাণীর মানের উপর নির্ভর করে এলোমেলোভাবে সরানোর সুযোগ থাকবে earthquakeCounter। সুতরাং মান যদি 75 হয় তবে প্রায় 75% প্রাণী (স্টোন সহ) এলোমেলোভাবে যে কোনও দিকে (সমানভাবে বিতরণ করা) চলে যাবে।

এটি, আশ্চর্যজনকভাবে, অনেক প্রাণীকে হত্যা করে, তাই কয়েকটি পরীক্ষার পরে সর্বাধিক প্রায় 50 টি প্রাণী হয়।

এছাড়াও, ভূমিকম্পটি জিইউআইতে দৃশ্যমান হবে, যা মাত্রার উপর নির্ভর করে পরিবর্তিত হয়।

আমি ভূমিকম্প দেখতে পাচ্ছি না!

ভূমিকম্প হওয়ার সুযোগটি বেশ পাতলা, মাত্র ৫%।

তবে হতাশ! আমি একটি "ভূমিকম্প!" অন্তর্ভুক্ত করেছি জিইউআই-তে বোতাম , যদি আপনি সমস্ত নেকড়েদের তাদের আরামের অঞ্চল থেকে ঠেলাঠেলি করতে চান ...

এখানে একটি স্ক্রিন শট হয়:

একটি ভূমিকম্প

কোডটি এখানে:

Wild.java

main() ফাংশন (গতি বাড়ানোর জন্য প্রথম 100 পুনরাবৃত্তির জন্য জিইউআই এড়িয়ে যেতে আপডেট করা হয়েছে):

public static void main(String[] args) {

    int size = Math.round((float)Math.sqrt(classes.length+3)*20);
    final Game game = new Game(size);

    Statistics stats = new Statistics(game, classes);

    String[] colors = generateColors(classes.length);
    int idx = 0;
    for(Class c : classes){
        Animal.setColor(c, colors[idx]);
        idx++;
        game.populate(c, 100);
    }
    stats.update();

    JFrame gui = new JFrame();
    Container pane = gui.getContentPane();

    JLabel boardLabel = new JLabel();
    boardLabel.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
    boardLabel.setText(game.toString());
    pane.add(boardLabel, BorderLayout.WEST);

    JLabel statsLabel = new JLabel();
    statsLabel.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
    statsLabel.setText(stats.toString());
    pane.add(statsLabel, BorderLayout.EAST);

    JButton earthquakeButton = new JButton();
    earthquakeButton.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {
            game.earthquake(true);
        }

    });
    earthquakeButton.setText("Earthquake!");
    pane.add(earthquakeButton, BorderLayout.SOUTH);

    gui.pack();
    gui.setVisible(true);

    for(int i=0; i<100; i++){
        game.iterate();
        stats.update();
    }

    while(true) {
        game.iterate();
        stats.update();
        boardLabel.setText(game.toString());
        statsLabel.setText(stats.toString());
        try { Thread.sleep(100); } catch (InterruptedException e) {}
    }
}

Game.java

package wild;

import animals.Animal;
import java.util.ArrayList;
import java.util.Random;
import animals.Animal.Attack;
import animals.Animal.Move;

public class Game {

    private ArrayList<ArrayList<ArrayList<Animal>>> board;
    private final Random gen = new Random();
    protected final int SIZE;
    private static int earthquakeCounter = 0;

    protected Game(int size) {
        this.SIZE = size;
        board = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            board.add(new ArrayList<ArrayList<Animal>>());
            for (int j = 0; j < size; j++) {
                board.get(i).add(new ArrayList<Animal>());
            }
        }
    }

    protected <T extends Animal> void populate(Class<T> species, int num) {
        while (num > 0) {
            int row = gen.nextInt(SIZE);
            int col = gen.nextInt(SIZE);
            if (board.get(row).get(col).isEmpty()) {
                try { board.get(row).get(col).add(species.newInstance()); } 
                catch (InstantiationException | IllegalAccessException e) {}
                num--;
            }
        }
    }

    protected void iterate() {
        earthquake(false);
        moveAll();
        flatten();
    }

    private void moveAll() {
        Game game = new Game(SIZE);
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                if (!board.get(i).get(j).isEmpty()) {
                    Animal a = board.get(i).get(j).get(0);
                    a.surroundings = getArea(i, j);
                    Move aMove;
                    try { aMove = a.move(); } 
                    catch (Exception e) { aMove = Move.HOLD; }
                    if(gen.nextInt(100)<earthquakeCounter){
                        aMove = Move.values()[gen.nextInt(4)];
                    }
                    switch(aMove) {
                        case UP:
                            game.board.get((i-1+SIZE)%SIZE).get(j).add(a);
                            break;
                        case RIGHT:
                            game.board.get(i).get((j+1)%SIZE).add(a);
                            break;
                        case DOWN:
                            game.board.get((i+1)%SIZE).get(j).add(a);
                            break;
                        case LEFT:
                            game.board.get(i).get((j-1+SIZE)%SIZE).add(a);
                            break;
                        case HOLD:
                            game.board.get(i).get(j).add(a);
                            break;
                    }
                }
            }
        }
        board = game.board;
    }

    /**
     * Give a random chance for an earthquake to happen
     */
    protected void earthquake(boolean force){
        if(force || (earthquakeCounter==0 && gen.nextInt(1000)>950)){
            earthquakeCounter = 20+gen.nextInt(80);
        } else {
            earthquakeCounter /= 2;
        }
    }

    private void flatten() {
        for (ArrayList<ArrayList<Animal>> row : board) {
            for (ArrayList<Animal> cell : row) {
                while (cell.size() > 1) {
                    int rand1, rand2;
                    rand1 = gen.nextInt(cell.size());
                    do { rand2 = gen.nextInt(cell.size()); } while (rand1 == rand2);

                    Animal a = cell.get(rand1);
                    Animal b = cell.get(rand2);
                    Attack aTack, bTack;
                    try { aTack = a.fight(b.letter); } 
                    catch (Exception e) { aTack = Attack.SUICIDE; }
                    try {  bTack = b.fight(a.letter); }
                    catch (Exception e) { bTack = Attack.SUICIDE; }

                    if (aTack == bTack) {
                        cell.remove((Animal)(Math.random() > 0.5 ? a : b));
                    } else {
                        switch (aTack) {
                            case ROCK:
                                cell.remove((Animal)(bTack == Attack.PAPER ? a : b));
                                break;
                            case PAPER:
                                cell.remove((Animal)(bTack == Attack.SCISSORS ? a : b));
                                break;
                            case SCISSORS:
                                cell.remove((Animal)(bTack == Attack.ROCK ? a : b));
                                break;
                        }
                    } 
                }
            }
        }
    }

    protected int poll(Class c) {
        int count = 0;
        for (ArrayList<ArrayList<Animal>> row : board) {
            for (ArrayList<Animal> cell : row) {
                for (Animal a : cell) {
                    if(c.isInstance(a))
                        count++;
                }
            }
        }
        return count;
    }

    public String toString() {
        String s = "<html>";
        s += "<span style='background:"+getBackgroundColor()+"'>";
        for (ArrayList<ArrayList<Animal>> row : board) {
            for (ArrayList<Animal> cell : row) {
                if (cell.isEmpty())
                    s += "&nbsp;&nbsp;";
                else
                    s += "<span style='color:"+ Animal.color.get(cell.get(0).getClass()) +"'>" + cell.get(0).letter + "</span>&nbsp;";
            }
            s+="<br>";
        }
        s += "</span>";
        return s + "</html>";
    }

    private String getBackgroundColor(){
        int shade = 255-(int)Math.floor(255*earthquakeCounter/100.0);
        String result = String.format("#%02x%02x%02x", shade, shade, shade);
        return result;
    }

    private char[][] getArea(int i, int j) {
        char[][] area = new char[3][3];
        for(int k = -1; k <= 1; k++) {
            for(int l = -1; l <= 1; l++) {
                int temp1 = k+1;
                int temp2 = l+1;
                int temp3 = (i+k+SIZE)%SIZE;
                int temp4 = (j+l+SIZE)%SIZE;
                ArrayList<Animal> cell = board.get((i+k+SIZE)%SIZE).get((j+l+SIZE)%SIZE);
                area[k+1][l+1] = (char)(cell.isEmpty() ? ' ' : cell.get(0).letter);
            }
        }
        return area;
    }
}

5
কিছু পুরুষ কেবল পৃথিবী দেখতে চান ... ভূমিকম্প
কমনগ্যুই

5
আমার জড়িত ওলভরা কাঁদছে।
johnchen902

12

মাল্টিওয়াল্ফ (জাভা)

এই নেকড়ে এই প্রোগ্রামিং চ্যালেঞ্জের অন্যান্য নেকড়েদের সম্পর্কে জানে। এটি তাদেরকে ইনস্টল করে ('পোষা প্রাণী হিসাবে') যদি তারা উপলব্ধ থাকে এবং প্রতিটি নেকড়ে-পোষা প্রাণী এটির মালিক এবং সবচেয়ে জনপ্রিয় প্রতিক্রিয়া চয়ন করে কী করতে হবে তা নির্ধারণ করতে তাদের ব্যবহার করে।

এই নেকড়েটিকে অসীম-পুনরাবৃত্তি-নিরাপদ হওয়া উচিত - অর্থাত্ অন্য কেউ যদি একই ধরণের ধারণা প্রয়োগ করে - এবং অন্য প্রাণীদের ডেকে ডাকার সময় এটি সনাক্ত করা সনাক্ত করে Attack.ROCK/ এর একটি ডিফল্ট ক্রিয়া ফিরিয়ে আনবে Move.HOLD

আমার পরীক্ষায়, এর বিভিন্ন ফলাফল রয়েছে। আমি নিশ্চিত না যে এটি অনুমোদিত হবে কি না। তবে যদি এটি হয় এবং কিছু অসম্ভব অলৌকিক ঘটনা ঘটে যার ফলে এটি জয়লাভ করে তবে আমি মনে করি যে জয়ের শিরোনামটি নেকড়ে যেটি "দ্বিতীয়" আসে তার হাতে দেওয়া উচিত - এটি কেবল ন্যায্য, আমি সম্ভবত এর যুক্তিটি চুরি করেছি।

এটি আত্মহত্যা এড়ায়।

সম্পাদনা করুন - আমি বিশ্বাস করি যে নেকড়ে এটি সঠিকভাবে কাজ করতে রেফারেন্সের পরে এই ওল্ফটি লোড করা দরকার।

package animals;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;

public class MultiWolf extends Animal {

    private static final LinkedList<Animal> pets = new LinkedList<>();
    private static boolean inPetCall = false;

    private static void attemptLoadPet(String className) {
        try {
            Object pet = Class.forName(className).newInstance();

            if (pet instanceof Animal) {
                pets.add((Animal) pet);
            }
        } catch (Exception ex) {
            // this wolf is not available
            System.out.println(className + " is not available for MultiWolf cheating.");
        }
    }

    static {
        attemptLoadPet("animals.AlphaWolf");
        attemptLoadPet("animals.CamperWolf");
        attemptLoadPet("animals.GamblerWolf");
        attemptLoadPet("animals.GatheringWolf");
        attemptLoadPet("animals.LazyWolf");
        attemptLoadPet("animals.Sheep");
        attemptLoadPet("animals.Wion");

        attemptLoadPet("animals.MOSHPITFRENZYWolf");
        attemptLoadPet("animals.PassiveAgressiveWolf");
        attemptLoadPet("animals.StoneEatingWolf");
        attemptLoadPet("animals.HerjanWolf");
        attemptLoadPet("animals.HonorWolf");
        attemptLoadPet("animals.MimicWolf");
        attemptLoadPet("animals.LionHunterWolf");
        attemptLoadPet("animals.OmegaWolf");
        attemptLoadPet("animals.WolfWithoutFear");
        attemptLoadPet("animals.WolfRunningWithScissors");
        // attemptLoadPet("animals.SmartWolf");
        // According to Rusher, the above cheating of a non-Java wolf breaks the non-Java-entry wrapper.
        attemptLoadPet("animals.ShadowWolf");
        attemptLoadPet("animals.HybridWolf");
        attemptLoadPet("animals.ProAlpha");
        attemptLoadPet("animals.ForrestWolf");
        attemptLoadPet("animals.WhenIGrowUp");
        attemptLoadPet("animals.MigratingWolf");
        attemptLoadPet("animals.BlindWolf");
    }

    public MultiWolf() {
        super('W');
    }

    @Override
    public Attack fight(char opponent) {
        if (inPetCall) {
            // stop infinite recursion
            return Attack.ROCK;
        }

        inPetCall = true;

        HashMap<Attack, Integer> collect = new HashMap<>();

        collect.put(Attack.ROCK, 0);
        collect.put(Attack.PAPER, 0);
        collect.put(Attack.SCISSORS, 0);
        collect.put(Attack.SUICIDE, -9001);

        for (Animal a : pets) {
            a.surroundings = this.surroundings;
            Attack atk = a.fight(opponent);
            collect.put(atk, collect.get(atk)+1);
        }

        int top=0;
        Attack atk=Attack.ROCK;

        for (Entry<Attack, Integer> ent : collect.entrySet()) {
            if (ent.getValue() > top) {
                atk = ent.getKey();
                top = ent.getValue();
            }
        }

        inPetCall = false;

        return atk;
    }

    @Override
    public Move move() {
        if (inPetCall) {
            // stop infinite recursion
            return Move.HOLD;
        }

        inPetCall = true;

        HashMap<Move, Integer> collect = new HashMap<>();

        collect.put(Move.DOWN, 0);
        collect.put(Move.HOLD, 0);
        collect.put(Move.LEFT, 0);
        collect.put(Move.RIGHT, 0);
        collect.put(Move.UP, 0);


        for (Animal a : pets) {
            a.surroundings = this.surroundings;
            Move mv = a.move();
            collect.put(mv, collect.get(mv)+1);
        }

        int top=0;
        Move mv=Move.HOLD;

        for (Entry<Move, Integer> ent : collect.entrySet()) {
            if (ent.getValue() > top) {
                mv = ent.getKey();
                top = ent.getValue();
            }
        }

        inPetCall = false;

        return mv;
    }

}

যদি আমি সঠিকভাবে মনে রাখি তবে আপনি ওয়াইল্ডক্লাচের মাধ্যমে ক্লাসগুলি পেতে পারতেন, যেহেতু এটি একটি স্থির ক্ষেত্র ... সুতরাং আপনাকে নেকড়ের প্রত্যেকবার নতুন নেকড়ে এখানে পোস্ট করার সময় আপডেট করতে হবে না;)
কমনগুয়ে

সেটা সত্য. তবে আমি এখন এটি এইভাবে করেছি, সম্ভবত এটি ছেড়ে চলেছে। এই মাল্টিওয়াল্ফ থেকে কিছু কম-বিজয়ী নেকড়েও সরিয়ে ফেলতে পারে। উইন আমার রানগুলিতে প্রতিবার বিলুপ্ত হয়ে গেছে বলে মনে হচ্ছে, আমি মাল্টিওয়াল্ফ থেকে এটি কেটে নেওয়ার কথা ভাবছি কারণ আমি ভাবছি যে এটি ক্রিয়াকলাপের মান হ্রাস করছে কিনা।
অলিভিয়ার দ্যলিভ

আমি বিশ্বাস করি যে "আপনি অন্য ওল্ফ শ্রেণীর দ্বারা নির্মিত ফাইলগুলি নাও পড়তে পারেন বা এটি সংশোধন করতে পারেন" এই নিয়মটি অন্য নেকড়ে শ্রেণীর ফাইলগুলি নিজেরাই অন্তর্ভুক্ত করার উদ্দেশ্যে করা হয়েছিল। সুতরাং আমি মনে করি যে এই এন্ট্রিটি, যদিও একটি দুর্দান্ত ধারণা, নিয়মের বিপরীতে।
রানার 1212

1
@ রানার ১১১২ আমি অবাক হয়েছি, তবে নাম দিয়ে ক্লাসগুলি লোড করা সম্পর্কে আমি এ থেকে কিছুটা শিখেছি এবং প্যাকেজে সমস্ত ক্লাস সন্ধান করার সহজ উপায় নেই। কিছুটা মজা
অলিভিয়ার দ্য ওলিভ

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

12

পাথর খাওয়া নেকড়ে

এখানে আমার জমা দেওয়া। যদি তার আশেপাশে কোনও পাথর, সিংহ বা নেকড় দেখতে না পায় তবে এই নেকড়ে রাখে। যদি সে কোনও পাথর দেখে এবং অন্য নেকড়ে বা সিংহ দ্বারা আক্রান্ত হওয়ার ঝুঁকি না থাকে তবে সে তা খাওয়ার চেষ্টা করে। কোনও বিপদ দেখলে সে পালিয়ে যায়!

সম্পাদনা 1 : বিপদ অ্যালগরিদমের জন্য উন্নত পর্যবেক্ষণ। তিনি এখন বিপদ থেকে ভাল পালিয়েছেন :)

package animals;

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


public class StoneEatingWolf extends Animal{

    public StoneEatingWolf() {
        super('W');
    }

    @Override
    public Attack fight(char c) {
        switch (c){
            case 'L': return Attack.SCISSORS;
            case 'B': return Attack.SCISSORS;
            case 'W': return getRandomAttack();
            case 'S': return Attack.PAPER;
            default: return getRandomAttack();
        }
    }

    private Attack getRandomAttack(){
        List<Attack> att = new ArrayList<>();
        att.add(Attack.PAPER);
        att.add(Attack.PAPER);
        att.add(Attack.ROCK);
        att.add(Attack.SCISSORS);
        Collections.shuffle(att);
        return att.get(0);
    }

    @Override
    public Move move() {
        List<Move> m = new ArrayList<>();

        //First see if there is any dangerous animal. If it is, then flee
        if (isThereAnyDangerousAnimal()){
            m.add(Move.UP);
            m.add(Move.RIGHT);
            m.add(Move.LEFT);
            m.add(Move.DOWN);
            getSafeMoves(m);
        }else{
        //No danger: Look for stones to eat
            if (isThereAnimalAtNorth('S')){
                m.add(Move.UP);
            }
            if (isThereAnimalAtEast('S')){
                m.add(Move.RIGHT);
            }
            if (isThereAnimalAtWest('S')){
                m.add(Move.LEFT);
            }
            if (isThereAnimalAtSouth('S')){
                m.add(Move.DOWN);
            }
        }

        if (m.isEmpty()){
            return Move.HOLD;
        } else {
            Collections.shuffle(m);
            return m.get(0);
        }
    }

    private void getSafeMoves(List<Move> lm){

        if (isThereAnimalAtNorth('L') || isThereAnimalAtNorth('W')){
            lm.remove(Move.UP);
        }
        if (isThereAnimalAtEast('L') || isThereAnimalAtEast('W')){
            lm.remove(Move.RIGHT);
        }
        if (isThereAnimalAtSouth('L') || isThereAnimalAtSouth('W')){
            lm.remove(Move.DOWN);
        }
        if (isThereAnimalAtWest('L') || isThereAnimalAtWest('W')){
            lm.remove(Move.LEFT);
        }

    }

    private boolean isThereAnimalAtNorth(char an){
        if (surroundings[0][0] == an || surroundings [0][1] == an || surroundings [0][2] == an){
            return true;
        }
        return false;
    }

    private boolean isThereAnimalAtSouth(char an){
        if (surroundings[2][0] == an || surroundings [2][2] == an || surroundings [2][2] == an){
            return true;
        }
        return false;
    }

    private boolean isThereAnimalAtEast(char an){
        if (surroundings[0][2] == an || surroundings [1][2] == an || surroundings [2][2] == an){
            return true;
        }
        return false;
    }

    private boolean isThereAnimalAtWest(char an){
        if (surroundings[0][0] == an || surroundings [1][0] == an || surroundings [2][0] == an){
            return true;
        }
        return false;
    }

    private boolean isThereAnyDangerousAnimal(){
        if (isThereAnimalAtEast('L') ||
                isThereAnimalAtEast('W') ||
                isThereAnimalAtNorth('L') ||
                isThereAnimalAtNorth('W') ||
                isThereAnimalAtSouth('L') ||
                isThereAnimalAtSouth('W') ||
                isThereAnimalAtWest('L') ||
                isThereAnimalAtWest('W')){
            return true;
        }
        return false;
    }

    }

সম্পাদনা 2 : কিছু পরিসংখ্যান

আমি যে অনুকরণগুলি চালিয়েছিলাম তার মধ্যে স্টোনএটিংওয়াল্ফকে শীর্ষে 5-6 ওল্ফ তৈরি করার ব্যবস্থা করেছি:

1000 পুনরাবৃত্তির 40 টি নাটকের পরে গড় ফলাফল

আমি মারামারিগুলির কিছু বিশ্লেষণ করি যেখানে পাথর খাওয়ার নেকড়ে রাখা আছে। 1000 পুনরাবৃত্তির 40 নাটক চালানো আমি এই ফলাফলগুলি পেয়েছি:

ফলাফলের চার্টে লড়াই করুন

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

PAPER       447
ROCK        881
SCISSORS    581
SUICIDE     230

মনে হচ্ছে ROCKআক্রমণগুলির স্পষ্ট পক্ষপাতিত্ব আছে । এটি জানতে পেরে আমি আমার নেকড়ে PAPERআক্রমণকে আরও কিছুটা ঘন ঘন আক্রমণ করেছিলাম ।


2
দয়া করে শ্রেণিবদ্ধ ডেটা প্লট করতে কোনও লাইন গ্রাফ ব্যবহার করবেন না। এটি আপনার গ্রাফের দিকে তাকিয়ে আমাকে ক্যান্সার দেয়।
এজেম্যান্সফিল্ড

@AJMansfield শুনে শুনে দুঃখিত। আশা করি আপনি সুস্থ হয়ে উঠবেন;) যাইহোক আমি ভবিষ্যতের যে কোনও চার্ট তৈরি করব তা বিবেচনায় নেব।
এভেরোয়েস

আপনি এখনও উইন্ডোজ এক্সপি ব্যবহার করছেন? ও
জাস্টহাল্ফ

আপনি কেন ROCKসিংহের সাথে লড়াই করতে (50% জয়) ব্যবহার করছেন ? এটি ব্যবহার করা সবচেয়ে ভাল SCISSORS(75% জয়)
জাস্টহেল্ফ

@ সংস্থাফাল্ট আমার সংস্থা এখনও এক্সপি ব্যবহার করে ... এবং আপনি কাঁচি সম্পর্কে ঠিক বলেছেন। সংশোধন করা হয়েছে। ধন্যবাদ :)
অ্যাভারোয়েস

11

HonorWolf

আমার নেকড়ে অন্য নেকড়ে থেকে পালাচ্ছে। যদি সে পালাতে না পারে তবে সে সম্মানের সাথে লড়াই শুরু করে।

package animals;
public class HonorWolf extends Animal {

    private int moves = 0;

    public HonorWolf() { 
        super('W'); 
    }

    @Override   
    public Attack fight(char opponent) { 
        switch(opponent) {
         case 'L':
            return Attack.SCISSORS; 
         case 'B':
            return Attack.SCISSORS;
         case 'S':
            return Attack.PAPER;
        default:
            return Attack.PAPER;
        }
    }

    public Move move() {
        int numWolves = 0, numLions = 0;

        moves++;

        for (int y = 0; y != 3; y++) {
            for (int x = 0; x != 3; x++) {
                if(surroundings[y][x] != ' ') {
                    if(surroundings[y][x] == 'W') {
                        numWolves++;
                    } else if(surroundings[y][x] == 'L') {
                        numLions++;
                    }
                }
            }       
        }

        if (numWolves == 1 && numLions == 0) {
            return Move.HOLD;
        }

        if (surroundings[0][1] == 'L' && moves%2 != 0) {
            return Move.UP;
        } 

        if (surroundings[1][0] == 'L' && moves%2 == 0) {
            return Move.LEFT;
        }

        if (surroundings[0][1] == 'W') {
            if (surroundings[2][1] == ' ' || surroundings[2][1] == 'S') {
                return Move.DOWN;
            } else if (surroundings[1][2] == ' ' || surroundings[1][2] == 'S') {
                return Move.RIGHT;
            } else if (surroundings[1][0] == ' ' || surroundings[1][0] == 'S') {
                return Move.LEFT;
            } else {
                return Move.UP;
            }
        }

        if (surroundings[1][0] == 'W') {
            if (surroundings[1][2] == ' ' || surroundings[1][2] == 'S') {
                return Move.RIGHT;
            } else if (surroundings[0][1] == ' ' || surroundings[0][1] == 'S') {
                return Move.UP;
            } else if (surroundings[2][1] == ' ' || surroundings[2][1] == 'S') {
                return Move.DOWN;
            } else {
                return Move.LEFT;
            }
        }

        if (surroundings[1][2] == 'W') {
            if (surroundings[1][0] == ' ' || surroundings[1][0] == 'S') {
                return Move.LEFT;
            } else if (surroundings[0][1] == ' ' || surroundings[0][1] == 'S') {
                return Move.UP;
            } else if (surroundings[2][1] == ' ' || surroundings[2][1] == 'S') {
                return Move.DOWN;
            } else {
                return Move.RIGHT;
            }
        }

        if (surroundings[2][1] == 'W') {
            if (surroundings[0][1] == ' ' || surroundings[0][1] == 'S') {
                return Move.UP;
            } else if (surroundings[1][0] == ' ' || surroundings[1][0] == 'S') {
                return Move.LEFT;
            } else if (surroundings[1][2] == ' ' || surroundings[1][2] == 'S') {
                return Move.RIGHT;
            } else {
                return Move.DOWN;
            }
        }

        return Move.HOLD;
    }
}

আমার প্রো আলফা উলফ আক্রমণকারী কৌশলটি পরিবর্তন করা দরকার। আমি যদি নেকড়ে আক্রান্ত হয়ে আক্রান্ত হয়ে থাকি: SCISSORS এর সাথে লড়াই কর;)
ইলিয়া গাজমান

11

দ্য ব্লাইন্ড নেকড়ে

অন্ধ নেকড়ে নড়াচড়া করতে ভয় পায় এবং কখনই জানে না এটি কী লড়াই করছে। প্রতিবার কাঁচি খেলে এটির মধ্যে সেরা প্রতিকূলতা রয়েছে, কারণ এটি কখনই আসল পাথরের দিকে চলে না ।

package animals;

public class BlindWolf extends Animal {
    public BlindWolf() { super('W'); }

    @Override
    public Attack fight(char c) { 
        return Attack.SCISSORS;
    }

    @Override
    public Move move() {
        return Move.HOLD;
    }
}

11

WhenIGrowUp

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

এই নেকড়েটি নেকড়ে বাঘের পাল্টা হিসাবে নকশাকৃত হয়েছিল যে সিংহের সাথে জায়গা বদলেছে।

package animals;

import java.util.Random;

/**
 *
 * @author Quincunx
 */
public class WhenIGrowUp extends Animal {

    Random r;
    boolean following;
    boolean toggle;

    public WhenIGrowUp() {
        super('W');
        r = new Random();
        following = false;
        toggle = false;
    }

    @Override
    public Attack fight(char c) {
        switch (c) {
            case 'B':
                return Attack.SCISSORS;
            case 'L':
            case 'S':
                return Attack.PAPER;
            default:
                return Attack.values()[r.nextInt(4)];
        }
    }

    @Override
    public Move move() {
        if (surroundings[1][2] == 'L') {
            return Move.RIGHT;
        }
        if (surroundings[2][1] == 'L') {
            return Move.DOWN;
        }
        Move direction = Move.values()[r.nextInt(5)];
        out:
        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                if (surroundings[y][x] == 'L') {
                    if (y == 0 && x == 1) {
                        direction = Move.UP;
                    } else if (y == 1 && x == 0) {
                        direction = Move.LEFT;
                    } else {
                        direction = Move.HOLD;
                    }
                    break out;
                }
            }
        }
        return direction;
    }
}

11

SpyWolf

স্পাইওয়ল্ফ এটির শত্রুদের জন্য গুপ্তচরবৃত্তি করে এবং তাদের ক্রিয়াকলাপটিকে লগ করে দেয় যাতে এটি দূরত্ব বজায় রেখে প্রত্যেককে ট্যাব রাখতে পারে। খুঁজে বের করতে চাইবে না!

package animals;

import static animals.Animal.Attack.*;
import static animals.Animal.Move.*;

import java.awt.Point;
import java.util.*;

public class SpyWolf extends Animal {

    private static final Random r = new Random();
    private static boolean hasTestedPRNG = false;
    private static int PRNG = -1;
    private boolean lionTracker = true;
    private boolean useScissors = false;

    private final ArrayList<MapTile> map = new ArrayList<MapTile>();
    private final Point location = new Point();

    public SpyWolf() {
        super('W');
    }

    @Override
    public Animal.Attack fight(char opponent) {
        switch (opponent) {
            case 'B':
            case 'L':
                return SCISSORS;
            case 'S':
                return PAPER;
            default:
                if (useScissors) {
                    useScissors = false;
                    return SCISSORS;
                }
                return PAPER;
        }
    }

    @Override
    public Animal.Move move() {

        Move m = HOLD;

        if (!hasTestedPRNG) {
            hasTestedPRNG = true;
            double d = 0;
            for (int i = 0; i < 100; i++)
                d += Math.random();
            if (d > 99) {
                PRNG = 1;
            } else if (d > 30 && d < 70) PRNG = 0;
        }

        lionTracker = !lionTracker;
        boolean adj = false;

        updateMap();

        scan: {
            if (PRNG < 1) {
                if (look(LEFT) == 'L' && !lionTracker) {
                    useScissors = true;
                    m = LEFT;
                    break scan;
                }

                if (look(UP) == 'L' & lionTracker) {
                    useScissors = true;
                    m = UP;
                    break scan;
                }
            }

            int x = 0, y = 0;
            ArrayList<Move> moves = new ArrayList<Move>(4);

            for (Move i : Move.values())
                moves.add(i);

            if (look(UP) == 'W') {
                y += 54;
                moves.remove(UP);
                adj = true;
            }
            if (look(DOWN) == 'W') {
                y -= 54;
                moves.remove(DOWN);
                adj = true;
            }
            if (look(LEFT) == 'W') {
                x += 54;
                moves.remove(LEFT);
                adj = true;
            }
            if (look(RIGHT) == 'W') {
                x -= 54;
                moves.remove(RIGHT);
                adj = true;
            }

            if (moves.isEmpty() || !adj) break scan;

            for (MapTile t : map) {
                if (t.x >= location.x - 2 && t.x <= location.x + 2 && t.y >= location.y - 2 && t.y <= location.y + 2 && t.d) {
                    int dist = Math.abs(t.x - location.x) + Math.abs(t.y - location.y);
                    y += t.y > location.y ? -60 / dist : 60 / dist;
                    x += t.x < location.x ? 60 / dist : -60 / dist;
                }
            }
            m = moveDir(x, y);
            if (!moves.contains(m)) m = HOLD;
        }
        switch (m) {
            case UP:
                location.y--;
                return m;
            case DOWN:
                location.y++;
                return m;
            case LEFT:
                location.x--;
                return m;
            case RIGHT:
                location.x++;
                return m;
            default:
                return m;
        }
    }

    private void updateMap() {
        for (int y = -1; y < 2; y++)
            xloop: for (int x = -1; x < 2; x++) {
                if (x == 0 && y == 0) continue;
                for (MapTile t : map)
                    if (t.x == x + location.x && t.y == y + location.y) {
                        t.d = surroundings[y + 1][x + 1] == 'W';
                        continue xloop;
                    }
                map.add(new MapTile(x + location.x, y + location.y, surroundings[y + 1][x + 1] == 'W'));
            }
    }

    private Move moveDir(int x, int y) {
        if (x == 0) return y < 0 ? UP : y > 0 ? DOWN : HOLD;
        if (y == 0) return x < 0 ? LEFT : RIGHT;
        if (x < 0) {
            if (y < 0) {
                if (y < x)
                    return UP;
                else if (x < y) return LEFT;
                return r.nextBoolean() ? UP : LEFT;
            } else {
                if (-y < x)
                    return DOWN;
                else if (x < -y) return LEFT;
                return r.nextBoolean() ? DOWN : LEFT;
            }
        }
        if (y < 0) {
            if (y < -x)
                return UP;
            else if (-x < y) return RIGHT;
            return r.nextBoolean() ? UP : RIGHT;
        } else {
            if (y > x)
                return DOWN;
            else if (x < y) return RIGHT;
        return r.nextBoolean() ? DOWN : RIGHT;
        }
    }

    private char look(Move direction) {
        switch (direction) {
            case UP:
                return surroundings[0][1];
            case DOWN:
                return surroundings[2][1];
            case LEFT:
                return surroundings[1][0];
            case RIGHT:
                return surroundings[1][2];
            default:
                return surroundings[1][1];
        }
    }

    private static class MapTile {
        int x, y;
        boolean d;

        MapTile(int x, int y, boolean d) {
            this.x = x;
            this.y = y;
            this.d = d;
        }
    }
}

এটি বেশ ভাল ভাড়া, কিন্তু সেই লম্পট হাইব্রিড ওল্ফ খুব ঠকানো! স্পাইওয়ল্ফ স্পাই স্কুলে ফিরে যেতে পারে এবং উন্নত অ্যান্টি-ওল্ফ কৌশলগুলি প্রশিক্ষণ দিতে পারে, আমরা দেখব।


1
আপনি এটাকে খোঁড়া বলছেন, আমি এটাকে বুদ্ধিমান বলি;)
কমনগ্যুই

5
Ahhhhh! এত gotoগুলো! এবং এমন একটি ভাষায় যা তাদের নেই!
এজেম্যান্সফিল্ড

9

HybridWolf

আমি আর বাঘ তৈরি করা ছাড়া প্রতিরোধ করতে পারি না। এই আক্রমণটি / চলনটি বেছে নেয়, যা অন্যান্য ভাল নেকড়েদের করবে এইটিকে এটি আলাদা (তার কোড অনুসারে, এর আচরণে নয়)।
অবশ্যই সমস্ত নেকড়ে ভাল, তবে আমি বলতে চাইছি সবচেয়ে পয়েন্ট সহ :)

package animals;

import java.util.ArrayList;
import java.util.Random;

public class HybridWolf extends Animal{
    private final Class[] classes = {ProAlpha.class, OmegaWolf.class, SpyWolf.class, HerjanWolf.class, DeepWolf.class, ProtoWolf.class};
    private final ArrayList<Animal> wolves = new ArrayList<Animal>(); 

    public HybridWolf() {
        super('W');
        for(Class c: classes) {
            try {
                wolves.add((Animal)c.newInstance());
            } catch (Exception ex) {}
        }
    }

    @Override
    public Attack fight(char opponent) {
        switch(opponent){
        case 'B':
        case 'L':
            return Attack.SCISSORS;
        case 'S': 
            return Attack.PAPER;
        default:
            try {
                int[] attacks = new int[3];
                Attack bestAttack = randomAttack();
                for(Animal wolf : wolves) {
                    wolf.surroundings = this.surroundings;
                    attacks[wolf.fight(opponent).ordinal()]++;
                }
                for(int i =0; i < 5; i++) {
                    if(attacks[i] > attacks[bestAttack.ordinal()]) {
                        bestAttack = Attack.values()[i];
                    }
                }
                return bestAttack;
            } catch (Exception e) {
                return randomAttack();
            }
        }
    }

    @Override
    public Move move() {
        try {
            int[] moves = new int[5];
            Move bestMove = Move.HOLD;
            for(Animal wolf : wolves) {
                wolf.surroundings = this.surroundings;
                moves[wolf.move().ordinal()]++;
            }
            for(int i =0; i < 5; i++) {
                if(moves[i] > moves[bestMove.ordinal()]) {
                    bestMove = Move.values()[i];
                }
            }
            return bestMove;
        } catch (Exception e) {
            return Move.HOLD;
        }
    }

    public Attack randomAttack() {
        Random rand = new Random();
        switch (rand.nextInt(3)){
            case 1: return Attack.SCISSORS;
            case 2: return Attack.ROCK;
            default: return Attack.PAPER;
        }
    }

}

এটি আমার আগের আলফাওল্ফের চেয়ে স্কোরগুলি আরও ভাল, তবে ওমেগা / অনার / প্রোআল্ফা মাঝে মাঝে আমাকে মারধর করে ... আরও ভাল জমা দেওয়া এখানে, এই নেকড়ে যত ভাল পাবে: ডি


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

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

@ রুশার এমন কিছু এন্ট্রি রয়েছে যা তাদের পক্ষে মতবিরোধগুলি পরিবর্তন করার চেষ্টা করে। উদাহরণস্বরূপ গাম্বলার নেকড়ে জাভা এর ম্যাথ.র্যান্ডম () এর এলোমেলো নম্বর জেনারেটরটি সর্বদা 1 ফেরত দেয়! বিজয়ী নেকড়েরা যে লড়াইয়ে এড়ানো নেকড়ের নল হিসাবে এইগুলি ফলাফলের উপর খুব কম প্রভাব ফেলে!
মোগি

@ মোগি গ্যাম্বারওয়াল্ফ হ'ল একটি আইনী দাখিল (এবং খুব চালাক)। আপনি ঠিক বলেছেন, ফলাফল খুব বেশি পরিবর্তন করেনি। যদি জিনিসগুলি হাতছাড়া হয়ে যায়, তবে আমি কেবল "ঠিক আছে, তিনি জিতেন তবে এই ফলাফলটি এখানে অন্তর্ভুক্ত না করানো হলেই হবে" say এইভাবে অন্য প্রত্যেকে এখনও নির্মূল না হওয়া উপভোগ করতে পারে।
রেইনবোল্ট

2
@ মোগি যদি চ্যালেঞ্জের নির্দিষ্টকরণগুলিতে কিছু নির্দিষ্টভাবে নিষিদ্ধ না করা হয় তবে এটি আইনত আইনসম্মত, এবং এই সাইটের theতিহ্যটি হল লোকেরা উত্তর পোস্ট করার পরে নিয়মগুলি পরিবর্তন করা উচিত নয়।
প্লানাপাস

9

EvoWolf

আপনারা বোকা বুদ্ধিমানভাবে নেকড়ে নকশাগুলি! ডিভল্ফ এবং হার্জান ওল্ফের মতো অন্যান্য শক্ত নেকড়েদের সাথে ইভোওল্ফ ওয়াইল্ডে বাস করে তাই বেঁচে থাকার জন্য এটি বিকশিত হতে হয়েছিল।

কোডটি সেরা নেকড়েটিকে বিকশিত করার জন্য একটি জেনেটিক অ্যালগরিদম ব্যবহার করে (আমি লায়নহান্টার ওল্ফকে লক্ষ্য করি না যতক্ষণ না আমি নেকড়েদের বিরুদ্ধে প্রশিক্ষণের জন্য দখল করছিলাম)। প্রতিটি প্রাণীর জন্য / আক্রমণ আক্রমণ কম্বো, নিরাপদ থাকার সময় চলাচলের দিকনির্দেশ এবং আশেপাশের প্রতিটি প্রাণীর চলাচলের দিকের জন্য আলাদা জিন। 1000 রাউন্ডের পরে, সর্বাধিক সংখ্যক ঘুরে আসা নেকড়েদের বংশজাত হওয়ার সর্বাধিক সম্ভাবনা থাকে (অর্থাত্ আপনি যত বেশি সময় বেঁধে যাবেন তার সাধ্যের সম্ভাবনা বেশি বেশি)। আমরা প্রায় 10% বাচ্চাদের একটি এলোমেলো রূপান্তর এনে দেই এমন একটি আশা যা এটির সাহায্য করে।

এখানে EvoWolf কোড, এছাড়া আপনি প্রয়োজন হবে evowolf.txt আপনার কাজের ডিরেক্টরির মধ্যে - এটি সাম্প্রতিক GENEPOOL রয়েছে। আপনি যদি আদিম এলোমেলো থেকে আপনার নিজের নেকড়ে বিবর্তিত করতে চান, তবে evowolf.txt অন্তর্ভুক্ত করবেন না তবে প্রদত্ত একটি বর্তমানে সেরা বিবর্তন। এটি বিকশিত হওয়া সত্যিই ঝরঝরে, শুরুতে কেবল ২-৩ টি বেঁচে থাকে তবে এটি 60০ অবধি উঠে যায়।

package animals;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Random;

public class EvoWolf extends Animal {
    public EvoWolf() { super('W'); birth();}
    public Attack fight(char c) { 
        List<Attack> attacks = getAttacks(c);
        if(attacks.size() == 0)
            return Attack.SUICIDE; //Discourage wolves without attacks, Darwin Award

        return attacks.get(random.nextInt(attacks.size()));
    }

    public Move move() {
        ++turns;
        List<Move> moves = new ArrayList<Move>();
        if(isSafe())
            moves = getSafeMoves();
        else
            moves = getThreatenedMoves();

        return (Move)moves.toArray()[random.nextInt(moves.size())];
    }

    /*====STATIC METHODS====*/
    //Shared RNG
    public static Random random = new Random();

    //Collection of 100 sets of genes
    public static String[] genePool = null;

    //Get the genes from disk or randomly generate some
    public static void readGenePool(){
        genePool = new String[100];
        int gIdx = 0;
        try (BufferedReader br = new BufferedReader(new FileReader("evowolf.txt"))){
            String sCurrentLine; 
            while ((sCurrentLine = br.readLine()) != null) {
                genePool[gIdx] = sCurrentLine;
                ++gIdx;
            }
        } catch (IOException e) {

        } 

        //if can't read genes, make some
        if(gIdx < 100){
            primordial(gIdx);
        }
    }
    public static void primordial(int idx){
        for(;idx < 100; ++idx){
            genePool[idx] = getRandomGenes();
        }
    }

    public static String getRandomGenes(){
        StringBuilder sb = new StringBuilder();
        for(int idx = 0; idx < GENE_COUNT; ++idx){
            if(random.nextBoolean())
                sb.append("1");
            else
                sb.append("0");
        }
        return sb.toString();
    }

    //Evolve wolves
    public static void nextGen(){
        //Check survival of current gen
        int survivors = 0;
        for(int idx = 0; idx < 100; ++idx){
            survivors = survivors + (generation[idx].turns == 1000 ? 1 : 0);
        }
        if(survivors > 65)
            writeGenePool(Long.toString(survivors));

        //Weighted resivour sampling
        //Take the highest of r^(1/w) where r is a random an w is the weight
        for(int idx = 0; idx < 100; ++idx){
            genePool[idx] = mateFitWolves();
        }
        writeGenePool("");
        birthCount = 0;
    }

    //Pick two wolves randomly by weighted fitness and mate them
    public static String mateFitWolves(){
        EvoWolf w1 = null;
        double weight1 = -1;
        EvoWolf w2 = null;
        double weight2 = -1;

        for(int idx = 0; idx < 100; ++idx){
            double weight = generation[idx].getWeightSample();
            if(weight > weight1){
                weight2 = weight1;
                w2 = w1;
                weight1 = weight;
                w1 = generation[idx];
            } else if(weight > weight2){
                weight2 = weight;
                w2 = generation[idx];
            }
        }

        return mateFitWolves(w1, w2);
    }

    //Make offspring
    public static String mateFitWolves(EvoWolf w1, EvoWolf w2){
        StringBuilder sb = new StringBuilder();
        //Random splice
        for(int rIdx = 0; rIdx < w1.genes.length(); ++rIdx){
            if(random.nextBoolean())
                sb.append(w1.genes.charAt(rIdx));
            else
                sb.append(w2.genes.charAt(rIdx));
        }


        //Random mutation
        while(random.nextInt(10) == 0){
            int mIdx = random.nextInt(w1.genes.length());
            if(sb.charAt(mIdx) == '0')
                sb.setCharAt(mIdx, '1');
            else
                sb.setCharAt(mIdx, '0');
        }


        return sb.toString();
    }

    //Save the next generation's gene pool back to disk
    public static void writeGenePool(String survivors){
        try {
            String str = "";
            if(!survivors.equals(""))
                str = Long.toString(System.currentTimeMillis());

            File file = new File("evowolf" + survivors + str + ".txt");

            // if file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            for(int gIdx = 0; gIdx < genePool.length; ++gIdx){
                bw.write(genePool[gIdx]);
                bw.write('\n');
            }
            bw.close();
        } catch (IOException e) {

        }
    }

    //Keep track of the wolves in this generation
    public static int birthCount = 0;
    public static EvoWolf[] generation = new EvoWolf[100];

    /*====INSTANCE METHODS====*/
    //Populate this wolf from the gene pool
    public void birth(){
        if(genePool == null){
            readGenePool();
        }
        genes = genePool[birthCount];
        generation[birthCount] = this;
        birthCount = (birthCount + 1) % 100;    
    }

    //How long wolf has been alive
    public int turns = 0;

    //Fitness based on how long wolf survived
    public double getWeightSample(){
        return Math.pow(random.nextDouble(), 1.0/turns);
    }


    /*===GENETICS===*/
    public String genes = null;
    //Genes are made up of 182+ bits (stored at a string)
    //Each turns on the possibility of that move or attack in a given situation
    //  Attack: BLSW * RPSX = 16 bits [0-15] = Animal->Attacks
    //  Threatened Moves: BLSW * 12345678 * UDLRH = 160 bits [16-175] = Y -> X -> Animal -> Moves
    //  Safe Moves: UDLRH = 5 bits [176-180] = Moves
    //  Extra: default move [181], move combination [182]
    public static final int GENE_INDEX_ATTACKS = 0;
    public static final int GENE_INDEX_THREATENED_MOVES = GENE_INDEX_ATTACKS + (4 * 4);
    public static final int GENE_INDEX_SAFE_MOVES = GENE_INDEX_THREATENED_MOVES + (8 * 4 * 5);
    public static final int GENE_INDEX_DEFAULT_MOVE = GENE_INDEX_SAFE_MOVES + (5);
    public static final int GENE_INDEX_COMBINE_MOVES = GENE_INDEX_DEFAULT_MOVE + (1);
    public static final int GENE_COUNT = GENE_INDEX_COMBINE_MOVES + 1;
    public static int getAnimalIndex(char c){
        switch (c) {
            case 'B':
                return 0;
            case 'L':
                return 1;
            case 'S':
                return 2;
            case 'W':
            default: //Shouldn't occur but we'll assume it's the dangerous wolf
                return 3;
        } 
    }

    public static int getXYIndex(int x, int y){
        int idx = (y * 3) + x;
        if(idx > 4) //We don't need to look at ourself
            --idx;
        return idx;
    }

    public List<Attack> getAttacks(char c){
        List<Attack> attacks = new ArrayList<Attack>();
        int idx = GENE_INDEX_ATTACKS + getAnimalIndex(c);
        if(genes.charAt(idx + 0) == '1')
            attacks.add(Attack.ROCK);
        if(genes.charAt(idx + 1) == '1')
            attacks.add(Attack.PAPER);
        if(genes.charAt(idx + 2) == '1')
            attacks.add(Attack.SCISSORS);
        /*
        if(genes.charAt(idx + 3) == '1')
            attacks.add(Attack.SUICIDE);
        */
        //Suicide didn't remove itself from the gene pool like I thought so I manually removed it

        return attacks;
    }

    public boolean isSafe(){
        for(int x = 0; x <= 2; ++x){
            for(int y = 0; y <= 2; ++y){
                if(y == 1 && x == 1)
                    continue;
                if(surroundings[y][x] != ' ')
                    return false;
            }
        }
        return true;
    }

    public List<Move> getSafeMoves(){
        List<Move> moves = new ArrayList<Move>();
        int idx = GENE_INDEX_SAFE_MOVES;
        if(genes.charAt(idx + 0) == '1')
            moves.add(Move.UP);
        if(genes.charAt(idx + 1) == '1')
            moves.add(Move.DOWN);
        if(genes.charAt(idx + 2) == '1')
            moves.add(Move.LEFT);
        if(genes.charAt(idx + 3) == '1')
            moves.add(Move.RIGHT);
        if(genes.charAt(idx + 4) == '1')
            moves.add(Move.HOLD);

        return moves;
    }

    public List<Move> getThreatenedMoves(){
        List<Move> moves = new ArrayList<Move>();
        if(genes.charAt(GENE_INDEX_COMBINE_MOVES) == '0')
            moves.addAll(EnumSet.of(Move.UP, Move.DOWN, Move.LEFT, Move.RIGHT, Move.HOLD));

        for(int x = 0; x <= 2; ++x){
            for(int y = 0; y <= 2; ++y){
                if(y == 1 && x == 1)
                    continue;
                if(genes.charAt(GENE_INDEX_COMBINE_MOVES) == '1')
                    moves.addAll(getThreatenedMoves(x,y));
                else
                    moves.retainAll(getThreatenedMoves(x,y));
            }
        }

        if(moves.size() == 0){
            if(this.genes.charAt(GENE_INDEX_DEFAULT_MOVE) == '1')
                moves.addAll(EnumSet.of(Move.UP, Move.DOWN, Move.LEFT, Move.RIGHT, Move.HOLD));
            else
                moves.add(Move.HOLD);
        }

        return moves;
    }

    public EnumSet<Move> getThreatenedMoves(int x, int y){
        //Lookup what moves we can make for a cell unless it is blank (allow any)
        if(surroundings[y][x] != ' ')
            return getThreatenedMoves(x,y,surroundings[y][x]);
        else if(genes.charAt(GENE_INDEX_COMBINE_MOVES) == '1')
            return EnumSet.noneOf(Move.class);
        else
            return EnumSet.of(Move.UP, Move.DOWN, Move.LEFT, Move.RIGHT, Move.HOLD);
    }

    public EnumSet<Move> getThreatenedMoves(int x, int y, char c){
        int aIdx = getAnimalIndex(c);
        int sIdx = getXYIndex(x,y);
        int idx = GENE_INDEX_THREATENED_MOVES + (sIdx * 20) + (aIdx * 5);

        EnumSet<Move> moves = EnumSet.noneOf(Move.class);

        if(genes.charAt(idx + 0) == '1')
            moves.add(Move.UP);
        if(genes.charAt(idx + 1) == '1')
            moves.add(Move.DOWN);
        if(genes.charAt(idx + 2) == '1')
            moves.add(Move.LEFT);
        if(genes.charAt(idx + 3) == '1')
            moves.add(Move.RIGHT);
        if(genes.charAt(idx + 4) == '1')
            moves.add(Move.HOLD);

        return moves;
    }

    public static String setAt(String str, int index, char replace){     
        if(str==null){
            return str;
        }else if(index<0 || index>=str.length()){
            return str;
        }
        char[] chars = str.toCharArray();
        chars[index] = replace;
        return String.valueOf(chars);       
    }
}

আমি স্ট্যাটিস্টিক্স.জভা এবং ওয়াইল্ড.জভাতে কিছু পরিবর্তন করেছি কেবল আমাকে দেখানোর জন্য যে কতগুলি মোড় এবং প্রজন্ম কেটে গেছে। আপনি 1000 টার্ন চালানোর পরে, অফস্রিং EvoWolf.nextGen();গণনা করতে কল করুন । এটি প্রতিযোগিতার জন্য প্রয়োজনীয় নয়, কেবলমাত্র যদি আপনি নিজের সেটটি বিকাশ করতে চান।

এখানে সমস্ত ফাইল সম্পাদনা করুন: ফিক্সড লিঙ্ক

যতদূর সেরা হিসাবে বিকশিত হচ্ছে, এ ধরণের শীর্ষ 10 এর চেয়ে ভাল আর কিছু পাওয়া যায় না সীমাবদ্ধতার অংশটি হ'ল এর আগের চালগুলির খুব কম স্মৃতি রয়েছে। যদিও এটি ওল্ভস উইথকলেক্টেমোমেটারির মতো কাজ করে যা পূর্ববর্তী প্রজন্মের অভিজ্ঞতাগুলি প্রভাবিত করবে যে পরবর্তী প্রজন্ম কীভাবে দীর্ঘমেয়াদী বৈশ্বিক স্মৃতি হিসাবে পরিবেশন করবে। এটা নিশ্চিত মজা ছিল। পূর্ববর্তী লিঙ্কে একটি এক্সেল শীট রয়েছে যা আপনাকে জিন পুল বিশ্লেষণ করতে সহায়তা করতে পারে। 1 টি এবং 0 এর সমস্ত 1 এবং 0 এর সাথে কমা দিয়ে তারপরে স্প্রেডশীটে পেস্ট করুন।

কিছু আকর্ষণীয় নোট, যার বেশিরভাগই প্রত্যেকের কৌশলকে নিশ্চিত করে:

  • যুদ্ধ এড়ানোর চেয়ে প্রকৃত আক্রমণগুলি কম গুরুত্বপূর্ণ। অথবা হতে পারে সমস্ত নন-ওল্ভগুলি দ্রুত মুছে ফেলা হবে যাতে তারা কোনও হুমকি নয়। প্রতিযোগিতার প্রজন্মের ভাল্লসের বিরুদ্ধে আরপিএসের মধ্যে একটি এমনকি সুযোগ রয়েছে যদিও আপনার এস কে ফেলে দেওয়া উচিত though
  • উপরের মত, আমাকে নিজেই আত্মহত্যাটি অক্ষম করতে হয়েছিল যেহেতু এটি বিকশিত হচ্ছিল না যদিও আপনি ভাবেন যে এটি হবে।
  • যখন কেউ আশেপাশে না থাকে তবে হোল্ডিং হ'ল সেরা পদক্ষেপ
  • কেউ যখন আশেপাশে থাকে তখন পালানোও ভাল বলে মনে হয়
  • এলোমেলো দিক সরিয়ে যাওয়ার পরিবর্তে আপনার ধরে রাখা উচিত (এই পছন্দটি একটি অতিরিক্ত জিন ছিল যা বিকশিত হয়েছিল)
  • যখন 1 টিরও বেশি প্রাণী আশেপাশে থাকে তখন প্রতিটি আশেপাশের / প্রাণীর চলাচলের ছেদ থেকে বেরিয়ে এলোমেলো পদক্ষেপ নেওয়া ইউনিয়নের চেয়ে আরও ভাল (আরও একটি অতিরিক্ত জিন)

8

SmartWolf

ফলাফলগুলি (1000 পুনরাবৃত্তি) এ রয়েছে (আমি এটি আপডেট করতে থাকব তবে এটির গড়পড়তা ছাড়াই একটি স্বাধীন পরীক্ষা হিসাবে দেখব কারণ অনেক নেকড়ে এটি বেশ ধীর)।

এখানে চিত্র বর্ণনা লিখুন

সংকলন:

* নিক্স (মনো প্রয়োজনীয়):

gmcs SmartWolf.cs

উইন্ডোজ:

csc SmartWolf.cs

কার্যকারী ডিরেক্টরিতে অনুলিপি করুন।

দ্রষ্টব্য: উইন্ডোজ ব্যবহার করার সময়, আপনাকে "mono SmartWolf.exe"কেবল "SmartWolf.exe"মোড়কের কোডের সাথে প্রতিস্থাপন করতে হবে ।

SmartWolf.cs:

using System;
using System.Collections.Generic;
using System.Linq;

namespace SmartWolf
{
    #region Enums
    enum Attack
    {
        Rock, Paper, Scissors, Suicide
    }
    enum Movement
    {
        Up, Down, Left, Right, Hold
    }
    enum Animal
    {
        Stone, Lion, Wolf, Bear, Empty
    }
    #endregion
    class KnowledgeBase
    {
        static Random rnd = new Random();
        public List<KeyValuePair<KeyValuePair<Animal, Attack>, int>> knowledge = new List<KeyValuePair<KeyValuePair<Animal, Attack>, int>>();
        public KnowledgeBase ()
        {
        }
        public void PunishMove (KeyValuePair<Animal, Attack> move)
        {
            if (knowledge.Count (t => t.Key.Key == move.Key && t.Key.Value == move.Value) == 0) {
                knowledge.Add (new KeyValuePair<KeyValuePair<Animal, Attack>, int> (move, -1));
            } else {
                int i = knowledge.FindIndex (t => t.Key.Equals (move));
                knowledge[i] = new KeyValuePair<KeyValuePair<Animal, Attack>, int>(knowledge[i].Key, knowledge[i].Value - 1);
            }

        }
        public void RewardMove (KeyValuePair<Animal, Attack> move)
        {
            if (knowledge.Count (t => t.Key.Key == move.Key && t.Key.Value == move.Value) == 0) {
                knowledge.Add (new KeyValuePair<KeyValuePair<Animal, Attack>, int> (move, 1));
            } else {
                int i = knowledge.FindIndex (t => t.Key.Equals (move));
                knowledge[i] = new KeyValuePair<KeyValuePair<Animal, Attack>, int>(knowledge[i].Key, knowledge[i].Value + 1);
            }
        }
        public Attack GetBestMove (Animal opponent)
        {
            Attack best = GetRandomMove();
            int j = 0;
            foreach (var pair in knowledge) {
                if(pair.Key.Key == opponent && j < pair.Value)
                {
                    best = pair.Key.Value;
                    j = pair.Value;
                }
            }
            if(j < 2)
                return GetRandomMove ();
            return best;
        }
        public static Attack GetRandomMove()
        {
            int r = rnd.Next (3);
            return r == 0 ? Attack.Paper :
                r == 1 ? Attack.Rock :
                    r == 2 ? Attack.Scissors :
                    Attack.Scissors;
        }
    }
    class MainClass
    {
        static KnowledgeBase knowledge = new KnowledgeBase();
        public static void Main (string[] args)
        {
            List<SmartWolf> list = new List<SmartWolf> ();
            List<int> temp = new List<int>();
            int l = 0;
            while (true) {
                string str = Console.ReadLine ();
                int id = int.Parse (str.Substring (1, 2));
                if(str.StartsWith ("S"))
                {
                    list.Add (new SmartWolf(id));
                    Console.WriteLine("K" + id.ToString ().PadLeft (2, '0'));
                } else if(str.StartsWith ("M"))
                {
                    if(temp.Contains (id))
                    {
                        for(int i = 0; i < 100; i++)
                        {
                            SmartWolf s = list.Where (t => t.ID == i).ToList ()[0];
                            if(s.AttackedInLastRound == 0 && !temp.Contains(i))
                            {
                                s.IsAlive = false;
                                knowledge.PunishMove (s.LastMove);
                                s.AttackedInLastRound = -1;
                            } else if(s.AttackedInLastRound == 0 && temp.Contains (i))
                            {
                                knowledge.RewardMove (s.LastMove);
                                s.AttackedInLastRound = -1;
                            }
                            if(s.AttackedInLastRound > 0)
                                s.AttackedInLastRound--;
                        }
                        temp.Clear();
                        l++;
                    }
                    temp.Add (id);

                    Console.WriteLine('H' + id.ToString ().PadLeft (2, '0'));
                } else if(str.StartsWith ("A"))
                {
                    Animal enemy = str[3] == 'W' ? Animal.Wolf :
                                   str[3] == 'L' ? Animal.Lion :
                                   str[3] == 'S' ? Animal.Stone :
                                   str[3] == 'B' ? Animal.Bear : Animal.Empty;
                    Attack atk = knowledge.GetBestMove (enemy);
                    Console.WriteLine((atk == Attack.Paper ? "P" :
                                      atk == Attack.Rock ? "R" : 
                                      atk == Attack.Scissors ? "S" :
                                      "P") + id.ToString ().PadLeft (2, '0'));
                    list.Where (t => t.ID == id).ToList ()[0].AttackedInLastRound = 2;
                    list.Where (t => t.ID == id).ToList ()[0].LastMove = new KeyValuePair<Animal, Attack>(enemy, atk);
                }
            }
        }
    }
    class SmartWolf
    {
        public int ID;
        public bool IsAlive = true;
        public KeyValuePair<Animal, Attack> LastMove = new KeyValuePair<Animal, Attack>(Animal.Empty, Attack.Suicide);
        public int AttackedInLastRound = -1;
        public SmartWolf(int n)
        {
            ID = n;
        }
    }
}

র্যাপার (@ প্রোগ্রামারড্যানের কৃতিত্ব, আমি এটি কেবল এখানেই অন্তর্ভুক্ত করছি যাতে কেবল পেস্ট অনুলিপি করা সহজ):

package animals;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Remote SmartWolf wrapper class. 
 */
public class SmartWolf extends Animal {
    /**
     * Simple test script that sends some typical commands to the
     * remote process.
     */
    public static void main(String[]args){
        SmartWolf[] wolves = new SmartWolf[100];
        for(int i=0; i<10; i++) {
            wolves[i] = new SmartWolf();
        }
        char map[][] = new char[3][3];
        for (int i=0;i<9;i++)
            map[i/3][i%3]=' ';
        map[1][2] = 'W';
        for(int i=0; i<10; i++) {
            wolves[i].surroundings=map;
            System.out.println(wolves[i].move());
        }
        for(int i=0; i<10; i++) {
            System.out.println(wolves[i].fight('S'));
            System.out.println(wolves[i].fight('B'));
            System.out.println(wolves[i].fight('L'));
            System.out.println(wolves[i].fight('W'));
        }
        wolfProcess.endProcess();
    }
    private static WolfProcess wolfProcess = null;

    private static SmartWolf[] wolves = new SmartWolf[100];
    private static int nWolves = 0;

    private boolean isDead;
    private int id;

    /**
     * Sets up a remote process wolf. Note the static components. Only
     * a single process is generated for all Wolves of this type, new
     * wolves are "initialized" within the remote process, which is
     * maintained alongside the primary process.
     * Note this implementation makes heavy use of threads.
     */
    public SmartWolf() {
        super('W');
        if (SmartWolf.wolfProcess == null) {
            SmartWolf.wolfProcess = new WolfProcess();
            SmartWolf.wolfProcess.start();
        }

        if (SmartWolf.wolfProcess.initWolf(SmartWolf.nWolves, MAP_SIZE)) {
            this.id = SmartWolf.nWolves;
            this.isDead = false;
            SmartWolf.wolves[id] = this;
        } else {
            SmartWolf.wolfProcess.endProcess();
            this.isDead = true;
        }
        SmartWolf.nWolves++;
    }

    /**
     * If the wolf is dead, or all the wolves of this type are dead, SUICIDE.
     * Otherwise, communicate an attack to the remote process and return
     * its attack choice.
     */
    @Override
    public Attack fight(char opponent) {
        if (!SmartWolf.wolfProcess.getRunning() || isDead) {
            return Attack.SUICIDE;
        }
        try {
            Attack atk = SmartWolf.wolfProcess.fight(id, opponent);

            if (atk == Attack.SUICIDE) {
                this.isDead = true;
            }

            return atk;
        } catch (Exception e) {
            System.out.printf("Something terrible happened, this wolf has died: %s", e.getMessage());
            isDead = true;
            return Attack.SUICIDE;
        }
    }

    /**
     * If the wolf is dead, or all the wolves of this type are dead, HOLD.
     * Otherwise, get a move from the remote process and return that.
     */
    @Override
    public Move move() {
        if (!SmartWolf.wolfProcess.getRunning() || isDead) {
            return Move.HOLD;
        }
        try {
            Move mv = SmartWolf.wolfProcess.move(id, surroundings);

            return mv;
        } catch (Exception e) {
            System.out.printf("Something terrible happened, this wolf has died: %s", e.getMessage());
            isDead = true;
            return Move.HOLD;
        }
    }

    /**
     * The shared static process manager, that synchronizes all communication
     * with the remote process.
     */
    static class WolfProcess extends Thread {
        private Process process;
        private BufferedReader reader;
        private PrintWriter writer;
        private ExecutorService executor;
        private boolean running;

        public boolean getRunning() {
            return running;
        }

        public WolfProcess() {
            process = null;
            reader = null;
            writer = null;
            running = true;
            executor = Executors.newFixedThreadPool(1);
        }

        public void endProcess() {
            running = false;
        }

        /**
         * WolfProcess thread body. Keeps the remote connection alive.
         */
        public void run() {
            try {
                System.out.println("Starting SmartWolf remote process");
                ProcessBuilder pb = new ProcessBuilder("mono SmartWolf.exe".split(" "));
                pb.redirectErrorStream(true);
                process = pb.start();
                System.out.println("SmartWolf process begun");
                // STDOUT of the process.
                reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); 
                System.out.println("SmartWolf reader stream grabbed");
                // STDIN of the process.
                writer = new PrintWriter(new OutputStreamWriter(process.getOutputStream(), "UTF-8"));
                System.out.println("SmartWolf writer stream grabbed");
                while(running){
                    this.sleep(0);
                }
                reader.close();
                writer.close();
                process.destroy(); // kill it with fire.
                executor.shutdownNow();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("SmartWolf ended catastrophically.");
            }
        }

        /**
         * Helper that invokes a read with a timeout
         */
        private String getReply(long timeout) throws TimeoutException, ExecutionException, InterruptedException{
            Callable<String> readTask = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    return reader.readLine();
                }
            };

            Future<String> future = executor.submit(readTask);
            return future.get(timeout, TimeUnit.MILLISECONDS);
        }

        /**
         * Sends an initialization command to the remote process
         */
        public synchronized boolean initWolf(int wolf, int map_sz) {
            while(writer == null){
                try {
                this.sleep(0);
                }catch(Exception e){}
            }
            boolean success = false;
            try{
                writer.printf("S%02d%d\n", wolf, map_sz);
                writer.flush();
                String reply = getReply(5000l);
                if (reply != null && reply.length() >= 3 && reply.charAt(0) == 'K') {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        success = true;
                    }
                }
                if (reply == null) {
                    System.out.println("did not get reply");
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("SmartWolf %d failed to initialize, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("SmartWolf %d failed to initialize, %s\n", wolf, e.getMessage());
            }
            return success;
        }

        /**
         * Send an ATTACK command to the remote process.
         */
        public synchronized Attack fight(int wolf, char opponent) {
            Attack atk = Attack.SUICIDE;
            try{
                writer.printf("A%02d%c\n", wolf, opponent);
                writer.flush();
                String reply = getReply(1000l);
                if (reply.length() >= 3) {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        switch(reply.charAt(0)) {
                            case 'R':
                                atk = Attack.ROCK;
                                break;
                            case 'P':
                                atk = Attack.PAPER;
                                break;
                            case 'S':
                                atk = Attack.SCISSORS;
                                break;
                            case 'D':
                                atk = Attack.SUICIDE;
                                break;
                        }
                    }
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("SmartWolf %d failed to attack, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("SmartWolf %d failed to attack, %s\n", wolf, e.getMessage());
            }
            return atk;
        }

        /**
         * Send a MOVE command to the remote process.
         */
        public synchronized Move move(int wolf, char[][] map) {
            Move move = Move.HOLD;
            try{
                writer.printf("M%02d", wolf);
                for (int row=0; row<map.length; row++) {
                    for (int col=0; col<map[row].length; col++) {
                        writer.printf("%c", map[row][col]);
                    }
                }
                writer.print("\n");
                writer.flush();
                String reply = getReply(1000l);
                if (reply.length() >= 3) {
                    int id = Integer.valueOf(reply.substring(1));
                    if (wolf == id) {
                        switch(reply.charAt(0)) {
                            case 'H':
                                move = Move.HOLD;
                                break;
                            case 'U':
                                move = Move.UP;
                                break;
                            case 'L':
                                move = Move.LEFT;
                                break;
                            case 'R':
                                move = Move.RIGHT;
                                break;
                            case 'D':
                                move = Move.DOWN;
                                break;
                        }
                    }
                }
            } catch (TimeoutException ie) {
                endProcess();
                System.out.printf("SmartWolf %d failed to move, timeout\n", wolf);
            } catch (Exception e) {
                endProcess();
                System.out.printf("SmartWolf %d failed to move, %s\n", wolf, e.getMessage());
            }
            return move;
        }
    }
}

সত্যিই তেমন দুর্দান্ত নয়, শীর্ষে কিছু নেকড়ে বাঘের সাথে 1000 পুনরাবৃত্তির জন্য গড় ~ 75 বেঁচে থাকার হার।

সমাধানে একটি এমএল পদ্ধতির ব্যবহার করে।


আমি মনে করি আপনার নেকড়ে যা করে আমি মোটামুটি বুঝতে পেরেছি, তবে আপনি কি আরও বিস্তারিতভাবে ব্যাখ্যা করতে পারেন? এছাড়াও এটি সম্ভবত কোন ভাষা তা আপনার উল্লেখ করা উচিত (আমি নিশ্চিত এটি বেশিরভাগ মানুষের কাছে স্পষ্ট তবে এটি আমার পক্ষে সুস্পষ্ট ছিল না)।
প্ল্যানাপাস

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

1
আপনি আবরণ ব্যবহার করে দেখে খুশি! আপনারা কীভাবে আপনার কোডটি সংকলন করবেন এবং mono@ রুশার ব্যবহারের জন্য কী তা নির্দেশাবলীর অন্তর্ভুক্ত করা উচিত ।
প্রোগ্রামারডান

1
মার্কডাউন ব্যর্থ। যদি আপনি উত্সটি দেখেন তবে '#' আছে, কিন্তু যেহেতু এটি একটি শিরোনামের ব্লকে ছিল তাই মার্কডাউন এটিকে উপেক্ষা করেছেন। সংশোধন করা হয়েছে। : ডি
প্রোগ্রামারডান

2
এফওয়াইআই - আমি @ প্রোগ্রামারড্যানের মোড়কের সাহায্যে এটি সংকলন করতে এবং সফলভাবে চালাতে সক্ষম হয়েছি (এবং এবারও তার সহায়তা ছাড়াই)। আপনি পরবর্তী ফলাফল হতে হবে। দেরি করার জন্য দুঃখিত!
রেইনবোল্ট

7

প্যাসিভ-আগ্রাসী নেকড়ে (একটি স্কালার নেকড়ে)

প্রথম 500 টার্নের জন্য যা কিছু সম্ভব তা এড়িয়ে চলে field তারপরে এটি নির্ধারিত দিকের দিকে আক্রমণ করে এমন জিনিসগুলিকে আক্রমণ করে যা এটি বিভিন্ন সীমাতে আসে।

package animals;

import animals._
import scala.util.Random

class PassiveAgressiveWolf extends Animal('W') {

    val myId=PassiveAgressiveWolf.nextId
    var movecounter=0

    def fight(opponent: Char) = {
        PassiveAgressiveWolf.lastopponents(myId-1)=opponent
        opponent match {
            case 'B' => Animal.Attack.SCISSORS
            case 'L' => Animal.Attack.SCISSORS
            case 'S' => Animal.Attack.ROCK
            case _ => Random.shuffle(List(Animal.Attack.SCISSORS, Animal.Attack.ROCK, Animal.Attack.PAPER)).head
        }
    }

    def move = {
        movecounter+=1
        if(movecounter < 500) avoidall else seen match {
            case ('B', pos: Int) => seenbear(pos)
            case ('S', pos: Int) => seenstone(pos)
            case ('L', pos: Int) => seenlion(pos)
            case ('W', pos: Int) => seenwolf(pos)
            case (' ', _) => myDirection
        }
    }

    def myDirection = myId % 4 match {
        case 0 => if(surroundings(0)(1)==' ') Animal.Move.LEFT else randommove
        case 1 => if(surroundings(1)(0)==' ') Animal.Move.DOWN else randommove
        case 2 => if(surroundings(1)(2)==' ') Animal.Move.RIGHT else randommove
        case 3 => if(surroundings(2)(1)==' ') Animal.Move.UP else randommove
    }

    def randommove = Random.shuffle(List(Animal.Move.UP, Animal.Move.LEFT, Animal.Move.RIGHT, Animal.Move.DOWN)).head

    def seen = {
        surroundings(1)(1)=' '
        val surroundingsflat=surroundings.flatten.mkString
        val seenbeasts = for {
            beast <- "BSLW" if surroundingsflat contains beast
        } yield (beast, surroundingsflat.indexOf(beast))
        seenbeasts.headOption.getOrElse((' ', 0))
    }

    def seenbear(pos: Int) = chase(pos)

    def seenstone(pos: Int) = pos match {
        case 1 => Animal.Move.LEFT
        case 3 => Animal.Move.UP
        case _ => myDirection
    }

    def seenlion(pos: Int) = pos match {
        case 1 => Animal.Move.LEFT
        case 3 => Animal.Move.UP
        case 5 => Animal.Move.HOLD
        case 7 => Animal.Move.HOLD
        case 0 => Animal.Move.UP
        case 2 => Animal.Move.HOLD
        case 6 => Animal.Move.HOLD
        case 8 => Animal.Move.HOLD
    }

    def seenwolf(pos: Int) = chase(pos)

    def chase(pos: Int) = pos match {
        case 1 => Animal.Move.UP
        case 3 => Animal.Move.LEFT
        case 5 => Animal.Move.RIGHT
        case 7 => Animal.Move.DOWN
        case 0 => Animal.Move.UP
        case 2 => Animal.Move.UP
        case 6 => Animal.Move.DOWN
        case 8 => Animal.Move.DOWN
    }

    def avoidall = {
        val safemoves = for {
            move <- List(
                            (0, 1, Animal.Move.UP), 
                            (1, 0, Animal.Move.LEFT), 
                            (1, 2, Animal.Move.RIGHT), 
                            (2, 1, Animal.Move.DOWN)
                        ) if(surroundings(move._1)(move._2)==' ')
        } yield move
        if(safemoves.length < 4) Random.shuffle(safemoves).head._3 else Animal.Move.HOLD
    }

}

object PassiveAgressiveWolf {
    private var id=0
    private def nextId = {id+=1; id}

    private var lastopponents=Array.fill[Char](100)(' ');
}

একটি জেভিএম ভিত্তিক ভাষা হিসাবে, স্কালাকে তুলনামূলকভাবে সহজেই সংহত করা যায়।

আপনি যদি প্রোগ্রামটি নিজেই সংকলন করে থাকেন তবে স্কাল ফাইলটি জাভা .classফাইলগুলির সাথে (ফাইলগুলি নয় .java) রাখুন এবং ব্যবহার করুন

scalac PassiveAggressiveWolf.scala

এটি সংকলন করতে। তারপরে আপনি জাভা ক্লাসগুলির সাথে PassiveAggressiveWolf.classমেইন Wild.javaক্লাসে ব্যবহার করতে পারেন । scala-library.jarআপনার ক্লাসপথেও আপনাকে যুক্ত করতে হবে (আমি কমান্ড লাইন বিকল্পটি ব্যবহার করছি -cp /path/to/scala-library.jar)।

বিকল্পভাবে, আমি উত্পন্ন ক্লাস ফাইল এবং scala-library.jarস্কেলা ২.১০.৩ এর জন্য একটি জার আপলোড করেছি যাতে আপনি সেগুলি ডাউনলোড করতে পারেন।

প্যাসিভ অ্যাগ্রেসিভ ওল্ফ.জার
স্কালা-লাইব্রেরি.জার


আপনার ডাউনলোডে সহজেই 10 টি ফাইলকে একটি জিপ ফাইলে প্যাক করতে পারেন।
johnchen902

@ jhnchen902 আমার কাছে চ্যাটে পরামর্শ দেওয়া হয়েছিল যে আমি আমার ক্লাসগুলি ধারণ করার জন্য একটি জার তৈরি করি create আমি কাজের পরে এই সন্ধ্যায় তা করতে সন্ধান করব। এটি এটিকে 2 টি ডাউনলোডে কমিয়ে দেবে এবং আশাকরি রুশর এতে অন্তর্ভুক্ত থাকা সমস্যাগুলি সমাধান করবে।
গ্যারেথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.