Survival Game - AlienWar


96

AlienWar

Game ini berlangsung di sebuah planet yang sangat ramai di mana alien adalah ras yang unggul. Tugas Anda adalah menciptakan alien Anda sendiri dan mengalahkan yang lainnya.

Papan

Ini adalah papan 2 dimensi.
Panjang satu sisi papan adalah Math.ceil(sqrt(species * 100 * 2.5))= ~ 40% dari papan yang digunakan. Papan adalah sebuah planet, jadi jika Anda berjalan keluar dari peta di barat, Anda kembali ke timur. Jika Anda berjalan di utara, Anda akan menemukan diri Anda di selatan.

Kemampuan

Setiap spesies di planet ini memiliki kemampuan. Di sini mereka:

Nama         Benefit 
life HP = lifeLVL * 5 (berkurang dengan setiap hit yang Anda ambil, 0 = mati), base HP = 10
kekuatan Serangan Anda melakukan kerusakan int acak dalam kisaran [1 hingga strengthLVL]
defense Pilih int dalam range [0 hingga (50 / defenseLVL + 1)] secara acak , jika int == 0 lalu hindari serangan berikutnya
visi Memberi Anda visiLVL / 2 bidang di sekitar visi Anda
cleverness Mengaburkan (meningkatkan) setiap kemampuan secara acak dalam kisaran [0 hingga clevernessLVL / 2] saat mengirim ke alien lain

Permainan

  • Akan ada 100 contoh dari setiap pengiriman.
  • Setelah instancing, setiap alien dapat menetapkan 10 poin kemampuan secara total. Anda dapat mengatur titik yang berbeda untuk setiap instance.
  • Jika Anda menetapkan lebih dari 10 poin, instance mati.
  • Sebuah game terdiri dari 1000 putaran. Setiap putaran:
    • Setiap alien harus mengembalikan gerakan move(char[] fields). Ini termasuk Move.STAY.
    • Jika beberapa alien berada di lapangan, 2 akan dipilih secara acak:
      • Jika keduanya sepakat tentang perdamaian (mengembalikan salah wantToFight) mereka akan tinggal di tempat mereka, kalau tidak mereka akan bertarung.
      • Loop ini sampai hanya satu alien tetap di lapangan atau semua setuju pada perdamaian.
  • Jika alien membunuh sesuatu, dia mendapatkan 1/5 dari masing-masing kemampuan musuhnya . Pemenang HP akan diisi ulang dengan 2 * musuhLifeLVL .

  • Pemenang adalah orang dengan kemampuan terbanyak (jumlah kemampuan alien yang hidup).

Perkelahian

Kedua alien akan saling memukul "pada saat yang sama", ini berarti jika Anda membunuh alien lain, ia masih bisa memukul Anda satu kali.

Menghindar: Sebelum Anda terkena, permainan akan menghitung jika Anda dapat menghindari serangan dengan menggunakan rand.nextInt(50 / defenseLvl + 1) == 0. DefenseLvl tidak akan pernah lebih besar dari 50 saat menghitung skill menghindar Anda (karenanya kemungkinan menghindar maksimum adalah 50%).

Memukul: Jika Anda tidak menghindari serangan, Anda akan terkena dan HP Anda akan berkurang sebesar rand.nextInt(enemy.getStrengthLvl()) + 1.

Perkelahian berakhir ketika salah satu atau kedua alien yang terlibat mati. Pemenangnya, jika ada, mendapat hadiah.

Gamerules

  • Level dasar untuk setiap kemampuan (tanpa memberikan poin kemampuan) adalah 1 (basis HP adalah 10).
  • Nilai-nilai yang dikirim ketika diminta untuk bertarung adalah kehidupan (bukan HP!), Kekuatan, pertahanan, dan tingkat visi .
  • Kepintaran TIDAK dikirim saat diminta bertarung.
  • Semua angka mengambang akan DIUNDANG ke bilangan bulat terdekat saat menggunakan / mengirimnya, tetapi disimpan dan ditingkatkan sebagai float.
  • Peluang menghindar maksimum adalah 50%. Kalau tidak, perkelahian mungkin tidak akan pernah berakhir.

Mangsa

Ada 5 spesies yang sudah ada di lapangan. Karena mereka adalah mangsa, mereka memilih untuk tidak bertarung ketika diminta.

Paus: lvl 10 masa inap tetap   
Sapi: kekuatan 10 lvl Gerakan acak
Turtle: lvl 10 pertahanan South west
Elang: lvl 10 visi Memeriksa bidang, mencoba menghindari bahaya      
Manusia: kecerdasan 10 lvl timur laut

Mereka akan diwakili dengan huruf pertama mereka (yaitu Wuntuk paus) di peta (Alien dengan A, bidang kosong dengan spasi putih ' ').

Aturan tambahan

  • Refleksi tidak diizinkan.
  • Berinteraksi (instancing dll.) Dengan alien lain dilarang.
  • Menulis / Membaca sumber daya eksternal seperti file atau database juga dilarang.
  • Hanya pengajuan Java (versi 1.8) yang diizinkan (Java agak mudah, dan Anda tidak harus menjadi ahli untuk game ini).
  • Semua kiriman harus memperluas kelas alien dan akan ditempatkan dalam paket alien.
  • Saya akan menerima alien terbaik pada 19 Juli. Semua alien yang dikirim pada pukul 12:00 UTC hari itu akan diuji.
  • Maksimal 3 kiriman per pengguna karena sudah ada sangat banyak alien.

Contoh alien

package alien;

import planet.Move;

public class YourUniqueNameHere extends Alien {

    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 2; //life
        abilities[1] = 2; //strength
        abilities[2] = 2; //defense
        abilities[3] = 2; //vision
        abilities[4] = 2; //cleverness
    }

    public Move move(char[][] fields) {
        //you are in the middle of the fields, say fields[getVisionFieldsCount()][getVisionFieldsCount()]
        return Move.STAY;
    }

    public boolean wantToFight(int[] enemyAbilities) {
        //same order of array as in setAbilityPoints, but without cleverness
        return true;
    }

}

Program kontrol

Kode sumber untuk program kontrol dapat ditemukan di sini . Sekarang diperbarui dengan semua alien yang termasuk dalam menjalankan terbaru.

Skor akhir (20.07.2014, rata-rata 10 pertandingan)

alien.PredicatClaw 1635.4
alien.LazyBee 1618.8
alien.CartographerLongVisionAlien 1584.6
alien.PilihBuyung Anda 1571.2
alien.Bender 1524.5
alien.HerjanAlien 1507.5
alien.FunkyBob 1473.1
alien.SecretWeapon2 1467.9
alien.PredicatMata 1457.1
alien.CorporateAlien 1435.9
alien.GentleGiant 1422.4
alien.CropCircleAlien 1321.2
alien.VanPelt 1312.7
alien.NewGuy 1270,4
alien.BananaPeel 1162.6
alien.Rock 1159.2
alien.BullyAlien 1106.3
alien.Geoffrey 778.3
alien.SecretWeapon 754.9
alien.SecretWeapon3 752.9
alien.FunkyJack 550.3
alien. Batu 369.4
alien.Assassin 277.8
alien.Predicoward 170.1
mangsa.Cow 155.2
alien.Morphling 105.3
alien.Eli 99.6
alien. Prajurit 69.7
alien.Hunter 56.3
alien.Manager 37.6
alien.OkinawaLife 14.2
mangsa. Paus 10.5
alien.Gamer 4.5
alien.Randomite 0
alien.Guard 0
mangsa. Elang 0
alien.Rogue 0
alien.WeakestLink 0
alien.Fleer 0   
alien. Korban 0
alien. Menyimpan 0
alien.Junkie 0
alien.Coward 0
alien.CleverAlien 0
mangsa. Manusia 0
alien.BlindBully 0
mangsa. Penawaran 0
alien.AimlessWanderer 0

14
Tiga downvotes, apa yang ada di bumi? Dan saya tidak melihat satu pun komentar negatif. Apakah orang yang pasif secara agresif kesal karena ini terbatas pada Jawa?
Martin Ender

6
@ m.buettner Downvote saya adalah untuk pembatasan godawfulness yaitu Java (meskipun jika terbatas pada bahasa terbaik yang pernah saya buat, saya masih downvote untuk membatasi ke 1 bahasa). Saya tidak melihat gunanya menambahkan komentar karena sudah jelas untuk apa downvotes itu.
Gareth

6
Hmmm, saya memiliki perasaan campur aduk di sini
Pak Alien

5
@ user3334871 Saya tidak berpikir mengubah aturan apa pun setelah 17 jawaban masuk (dan berpotensi selusin lebih banyak orang yang mengerjakan pengiriman) adalah ide yang bagus. Karena hanya sedikit dari kita di sini (jika ada) yang merupakan perancang permainan profesional, cukup banyak KotH yang dibuat sendiri mungkin memiliki beberapa masalah penyeimbang - tetapi jika menjelajahi ruang strategi yang mungkin masih menyenangkan (yang tampaknya memang demikian, menilai dari jawaban, upvotes dan bintang), saya tidak berpikir itu banyak masalah.
Martin Ender

5
@ Manu Untuk matematis cenderung deskripsi tentang bagaimana papan tulis agak menyesatkan. Anda mengatakan itu adalah planet dan membungkus timur / barat. Tidak ada yang benar-benar menunjukkan bahwa ia membungkus utara / selatan juga. Bahkan, jika ya, secara teknis ini bukan bola lagi, tetapi torus: kotaku.com/classic-jrpg-worlds-are-actual-donuts-1239882216 . Anda juga dapat melihat bahwa dengan memperhatikan bahwa ketika Anda berjalan "keluar" di atas peta dunia (kutub utara), Anda tidak muncul di bawah (kutub selatan). Karenanya, saran Michael jelas valid, saya pikir.
Martin Ender

Jawaban:


11

PredicatClaw (rawr)

Alien kucing ini akan menelan Anda seluruhnya (oke mungkin dia akan mengunyah Anda sedikit lebih dulu) ... jika Anda tampak lemah berdasarkan algoritme prediksinya.

Berkembang biak Predicats yang memiliki cakar dan taring yang lebih sengit daripada rekannya.

EDIT: Prioritas target baru

package alien;

import planet.Move;

/* Predict + Cat = Predicat! */
public class PredicatClaw extends Alien {
    private static final int LIF=0, STR=1, DEF=2;
    private static final int WHALE=6, COW=1, TURTLE=4, EAGLE=3, HUMAN=2, ALIEN=-1, NONE=0;

    @Override
    public void setAbilityPoints( float[] abilities ) {
        abilities[LIF] = 4.5f;
        abilities[STR] = 5.5f;
    }

    @Override
    public Move move( char[][] fields ) {

        /* Some credits to Eagle for letting me learn how to do the moves */
        int vision = getVisionFieldsCount(); //count of fields / middle
        int fieldX;
        int fieldY;
        Move bestMove=Move.STAY;
        int bestScore=-1;

       for (Move move : Move.values()) {
            fieldX = vision + move.getXOffset();
            fieldY = vision + move.getYOffset();
            switch(fields[fieldX][fieldY]){
            case 'W' : 
                if(bestScore<WHALE){
                    bestMove=move;
                    bestScore=WHALE;
                }
                break;
            case 'C' :
                if(bestScore<COW){
                    bestMove=move;
                    bestScore=COW;
                }
                break;
            case 'T' :
                if(bestScore<TURTLE){
                    bestMove=move;
                    bestScore=TURTLE;
                }
                break;
            case 'E' :
                if(bestScore<EAGLE){
                    bestMove=move;
                    bestScore=EAGLE;
                }
                break;
            case 'H' :
                if(bestScore<HUMAN){
                    bestMove=move;
                    bestScore=HUMAN;
                }
                break;
            case 'A' :
                if(bestScore<ALIEN){
                    bestMove=move;
                    bestScore=ALIEN;
                }
                break;
            case ' ' :
                if(bestScore<NONE){
                    bestMove=move;
                    bestScore=NONE;
                }
                break;
            }
        }

        if(vision==1 && bestScore>1){
            return bestMove;
        }

        //check immediate outer field
        for (int i=vision-2; i<=vision+2; i++) {
            for(int j=vision-2; j<=vision+2; j++){
                if(i==0 || i==4 || j==0 || j==4){
                    switch(fields[i][j]){
                    case 'W' :
                        bestMove = this.getBestMoveTo(i,j);
                        bestScore = WHALE;
                        break;
                    case 'C' :
                        if(bestScore<COW){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = COW;
                        }
                        break;
                    case 'T' :
                        if(i>=vision && j<=vision){
                            return this.getBestMoveTo(i-1,j+1);
                        }
                        if(bestScore<TURTLE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = TURTLE;
                        }
                        break;
                    case 'E' :
                        if(bestScore<EAGLE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = EAGLE;
                        }
                        break;
                    case 'H' :
                        if(i<=vision && j>=vision){
                            return this.getBestMoveTo(i+1,j-1);
                        }
                        if(bestScore<HUMAN){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = HUMAN;
                        }
                        break;
                    case 'A' :
                        if(bestScore<ALIEN){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = ALIEN;
                        }
                        break;
                    case ' ' :
                        if(bestScore<NONE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = NONE;
                        }
                        break;
                    }
                }
            }
        }

        return bestMove;
    }

    @Override
    public boolean wantToFight( int[] enemyAbilities ) {
        /*
            Fight IF
                1) I CAN BEAT YOU
                2) ????
                3) MEOW!
        */
        float e_hp = enemyAbilities[LIF]*5+10;
        float e_dmg = 1 + enemyAbilities[STR]/2;
        float e_hit = 1 - (1/(50/this.getDefenseLvl()+1));

        float m_hp = this.getCurrentHp();
        float m_dmg = 1 + this.getStrengthLvl()/2;
        float m_hit = 1 - (1/(50/enemyAbilities[DEF]+1));

        return (e_hp/(m_dmg*m_hit) < m_hp/(e_dmg*e_hit));
    }

    private Move getBestMoveTo(int visionX, int visionY){
        int vision = getVisionFieldsCount();

        if(visionX < vision && visionY < vision){
            return Move.NORTHWEST;
        }
        else if(visionX > vision && visionY < vision){
            return Move.NORTHEAST;
        }
        else if(visionX < vision && visionY > vision){
            return Move.SOUTHWEST;
        }
        else if(visionX > vision && visionY < vision){
            return Move.SOUTHEAST;
        }
        else if(visionX == vision && visionY < vision){
            return Move.NORTH;
        }
        else if(visionX == vision && visionY > vision){
            return Move.SOUTH;
        }
        else if(visionX > vision && visionY == vision){
            return Move.EAST;
        }
        else if(visionX < vision && visionY == vision){
            return Move.WEST;
        }
        else{
            return Move.WEST;
        }

    }
}

1
Sial! Predikat itu ganas! Saya perhatikan bahwa kami berdua sepakat pada wantToFightalgoritma yang kurang lebih sama .
James_pic

@ James_pic, saya melihat pikiran-pikiran hebat berpikir sama. : D
Mark Gabriel

27

Manajer

Ini seorang manajer. Secara alami, kepintarannya adalah 0 dan ia selalu berusaha untuk pergi ke tempat yang tidak disinari matahari. Dan, tentu saja, dia hanya akan melawan yang lemah dan sangat baik dalam menghindari masalah:

public class Manager extends Alien {

    private static final int STRENGTH = 5;

    @Override
    public void setAbilityPoints( float[] abilities ) {
        abilities[/* strength   */ 1] = STRENGTH;
        abilities[/* defense    */ 2] = 5;
        abilities[/* cleverness */ 4] = 0; // just to make sure
    }

    @Override
    public Move move( char[][] fields ) {
        return Move.WEST;
    }

    @Override
    public boolean wantToFight( int[] enemyAbilities ) {
        return enemyAbilities[1] < STRENGTH;
    }
}

+1, jika hanya untuk intro. : P
apnorton

6
Setiap kali saya membaca komentar itu ("hanya untuk memastikan") saya harus tertawa :-D
Matthias


@ 11684 setiap pengembang yang baik tahu itu, tentu saja, tetapi dalam kasus saya, saya benar-benar bermaksud manajer;)
Ingo Bürk

18

KartografiLongVisionAlien

Alien ini adalah varian yang konsisten melakukan salah satu upaya saya untuk menghasilkan alien yang berpotensi menang.

Ini memiliki visi 5x5 awal yang digunakan untuk membangun peta internal daerah sekitarnya memberikannya kemampuan menghindar musuh yang unggul.

Dalam pengujian saya tentang 100 putaran, rata-rata, itu menyelinap di depan semua alien lainnya. (09/07/2014)

GIF DIPERBARUI menunjukkan efek bidang penolakan / tarik

Saya telah memodifikasi kode Game untuk menghasilkan animasi GIF simulasi. Anda dapat melihat simulasi semacam itu di sini

 package alien;

 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Random;
 import planet.Move;
 import planet.Planet;

 /**
  * Created by moogie on 09/07/14.
  * 
  * This Alien attempts to map the visible and guess the movements within the immediate non-visible area around the alien.
  * To this end, the alien can initially see 5x5 grid. It applies weights on the cells of its internal map based on the 
  * prey/alien/blanks within its field of view. It then performs a simple blur to guess movements and then chooses the optimum move
  * based on the contents of its internal map.
  * 
  * If it is asked to fight, it performs battle simulations to determine whether it should nominate to fight.
  */
 public class CartographerLongVisionAlien extends Alien
 {
   private final static byte LIFE = 0, STR = 1, DEF = 2, VIS = 3, CLV = 4;

   // Plant Entity symbols
   private static final char TURTLE = 'T';
   private static final char HUMAN = 'H';
   private static final char WHALE = 'W';
   private static final char COW = 'C';
   private static final char EAGLE = 'E';
   private static final char ALIEN = 'A';
   private static final HashMap<Character, Move> preyMovement = new HashMap<>();

   static 
   {
     preyMovement.put(WHALE, Move.STAY);
     preyMovement.put(TURTLE, Move.SOUTHWEST);
     preyMovement.put(HUMAN, Move.NORTHEAST);
   };

   // Map constants
   public static final int MAP_SIZE_DIV_2 = 10;
   public static final int MAP_SIZE = MAP_SIZE_DIV_2 * 2 + 1;
   private static final int MAP_SIZE_MINUS_ONE = MAP_SIZE - 1;
   private static final double FADE_FACTOR=0.85;

   // Planet constants
   private static final int STARTING_HP = 10;
   private static final int START_HEALING_FACTOR = 5;
   private static final int MAX_DEFENCE = 50;

   // Battle Simulation constants
   private static final double AMBIGUOUS_ENEMY_HP_FACTOR = 2;
   private static final int SIMULATED_BATTLE_COUNT = 100;
   private static final int SIMULATED_BATTLE_THREASHOLD = (int)(SIMULATED_BATTLE_COUNT*1.0);

   private Random rand = new Random(Planet.rand.nextLong());

   /** The alien's map of the immediate and mid-range area */
   public double[][] map = new double[MAP_SIZE][MAP_SIZE];

   public void setAbilityPoints( float[] abilities )
   {
     // +0.5 gain due to rounding trick "borrowed" from PredicatClaw http://codegolf.stackexchange.com/a/32925/20193
     abilities[LIFE] = 3.5f; // We do need some hit points to ensure that we can survive the melee of the beginning game.
     abilities[STR] = 4.5f; // A Moderate attack strength means that we do not have to go through as many fight rounds.
     abilities[DEF] = 0; // We will get from prey and other aliens
     abilities[VIS] = 2; // A minimum of 2 is required to get a 5x5 field of view
     abilities[CLV] = 0; // We will get from prey and other aliens
   }

   /**
    * simulate alien memory fade. This allows an alien to eventually venture back to areas already traversed.
    */
   private void fadeMap()
   {
     for ( int y = 0; y < MAP_SIZE; y++ )
     {
       for ( int x = 0; x < MAP_SIZE; x++ )
       {
         map[x][y] *= FADE_FACTOR;
       }
     }
   }

   /**
    * shift the maps with the movement of the alien so that the alien is always at the centre of the map
    * 
    * @param move
    */
   private void shiftMaps( Move move )
   {
     int i, j;
     final int offsetX = -move.getXOffset();
     final int offsetY = -move.getYOffset();
     double[][] tempMap = new double[MAP_SIZE][MAP_SIZE];
     for ( int y = 0; y < MAP_SIZE; y++ )
     {
       for ( int x = 0; x < MAP_SIZE; x++ )
       {
         i = x + offsetX;
         j = y + offsetY;

         if ( i >= 0 && i <= MAP_SIZE_MINUS_ONE && j >= 0 && j <= MAP_SIZE_MINUS_ONE )
         {
           tempMap[i][j] = map[x][y];
         }
       }
     }
     map = tempMap;
   }

   /**
    * Updates a cell in the alien's map with the desirability of the entity in the cell
    * 
    * @param x
    * @param y
    * @param chr
    */
   private void updateMap( int x, int y, char chr )
   {
     // Note that these desire values are just guesses... I have not performed any analysis to determine the optimum values!
     // That said, they seem to perform adequately.
     double desire = 0;

     int i=x;
     int j=y;
     switch ( chr )
     {
       case WHALE:
         desire=2;
         break;
       case TURTLE:
       case HUMAN:
         desire=1;
         Move preyMove = preyMovement.get( chr );

         // predict movement into the future
         while ( i >= 0 && i <= MAP_SIZE_MINUS_ONE && j >= 0 && j <= MAP_SIZE_MINUS_ONE )
         {
           map[i][j] = ( map[i][j] + desire ) / 2;
           i+=preyMove.getXOffset();
           j+=preyMove.getYOffset();
           desire/=2;
         }
         break;
       case COW:
         desire = 0.5;
         break;
       case EAGLE:
         desire = 1;
         break;
       case ALIEN:
         desire = -10;
         break;
     }

     map[x][y] = ( map[x][y] + desire ) / 2;
   }

   /**
    * Apply a blur the map to simulate the movement of previously seen entities that are no longer within the field of view.
    */
   private void convolve()
   {
     double[][] tempMap = new double[MAP_SIZE][MAP_SIZE];

     int count;
     double temp;
     for ( int y = 0; y < MAP_SIZE; y++ )
     {
       for ( int x = 0; x < MAP_SIZE; x++ )
       {
         count = 0;
         temp = 0;
         for ( int i = x - 1; i < x + 2; i++ )
         {
           for ( int j = y - 1; j < y + 2; j++ )
           {
             if ( i >= 0 && i <= MAP_SIZE_MINUS_ONE && j >= 0 && j <= MAP_SIZE_MINUS_ONE )
             {
               temp += map[i][j];
               count++;
             }
           }
         }
         temp += map[x][y] * 2;
         count += 2;

         tempMap[x][y] = temp / count;
       }
     }
     map = tempMap;
   }

   /**
    * Determine the move that minimises the risk to this alien and maximises any potential reward.
    * 
    * @param fields
    * @return
    */
   private Move findBestMove( char[][] fields )
   {
     List<Move> moveOptions = new ArrayList<>();
     double bestMoveScore = -Double.MAX_VALUE;
     double score;

     // find the moves that have the best score using the alien's map
     for ( Move move : Move.values() )
     {
       int x = MAP_SIZE_DIV_2 + move.getXOffset();
       int y = MAP_SIZE_DIV_2 + move.getYOffset();
       score = map[x][y];
       if ( score == bestMoveScore )
       {
         moveOptions.add( move );
       }
       else if ( score > bestMoveScore )
       {
         bestMoveScore = score;
         moveOptions.clear();
         moveOptions.add( move );
       }
     }

     Move move = moveOptions.get( rand.nextInt( moveOptions.size() ) );

     // if the best move is to stay...
     if ( move == Move.STAY )
     {
       // find whether there are no surrounding entities in field of vision...
       int midVision = getVisionFieldsCount();
       boolean stuck = true;
       out: for ( int i = 0; i < fields.length; i++ )
       {
         for ( int j = 0; j < fields.length; j++ )
         {
           if ( !( i == midVision && j == midVision ) && fields[i][j] != ' ' )
           {
             stuck = false;
             break out;
           }
         }
       }

       // there there are no other entities within field of vision and we are healthy... choose a random move
       if ( stuck && getCurrentHp() > getLifeLvl() * 2 )
       {
         move = Move.getRandom();
       }
     }
     return move;
   }

   /**
    * Update the alien's map with the current field of vision
    * 
    * @param fields
    */
   private void mapVisibleSurroundings( char[][] fields )
   {
     int midVision = getVisionFieldsCount();

     // update the map with currently visible information
     for ( int y = -midVision; y <= midVision; y++ )
     {
       for ( int x = -midVision; x <= midVision; x++ )
       {
         char chr = fields[midVision + x][midVision + y];
         updateMap( MAP_SIZE_DIV_2 + x, MAP_SIZE_DIV_2 + y, chr );
       }
     }

     // ensure that the map where this alien currently sits is marked as empty.
     updateMap( MAP_SIZE_DIV_2, MAP_SIZE_DIV_2, ' ' );
   }

   public Move move( char[][] fields )
   {
     Move returnMove = null;

     // pre-move decision processing
     mapVisibleSurroundings( fields );
     convolve();

     returnMove = findBestMove( fields );

     // post-move decision processing
     fadeMap();
     shiftMaps( returnMove );

     return returnMove;
   }

   public boolean wantToFight( final int[] enemyAbilities )
   {
     double toughnessFactor =((double) enemyAbilities[STR])/(enemyAbilities[LIFE]*10); // a fudge-factor to ensure that whales are attacked.
     if (enemyAbilities[VIS]>=3 && enemyAbilities[LIFE]>4.5f) toughnessFactor*=3.5; // make sure that we do not attack other Cartogapher aliens 
     return winsBattleSimulation( enemyAbilities, toughnessFactor );
   }

   /**
    * Perform simulations to determine whether we will win against the enemy most of the time.
    * 
    * @param enemyAbilities
    * @return
    */
   private boolean winsBattleSimulation( int[] enemyAbilities, double toughnessFactor )
   {
     int surviveCount = 0;
     for ( int i = 0; i < SIMULATED_BATTLE_COUNT; i++ )
     {
       int estimatedEnemyHitPoints =
           STARTING_HP + (int)( enemyAbilities[LIFE] * START_HEALING_FACTOR * AMBIGUOUS_ENEMY_HP_FACTOR * toughnessFactor );
       int enemyPoints = estimatedEnemyHitPoints;
       int myHitPoints = getCurrentHp();
       int myDefenceLevel = getDefenseLvl() < MAX_DEFENCE ? getDefenseLvl() : MAX_DEFENCE;
       int enemyDefenceLevel = enemyAbilities[DEF] < MAX_DEFENCE ? enemyAbilities[DEF] : MAX_DEFENCE;

       while ( !( myHitPoints <= 0 || enemyPoints <= 0 ) )
       {
         if ( rand.nextInt( MAX_DEFENCE / myDefenceLevel + 1 ) != 0 )
         {
           myHitPoints -= rand.nextInt( enemyAbilities[STR] ) + 1;
         }

         if ( rand.nextInt( MAX_DEFENCE / enemyDefenceLevel + 1 ) != 0 )
         {
           enemyPoints -= rand.nextInt( getStrengthLvl() ) + 1;
         }
       }
       if ( myHitPoints > 0 )
       {
         surviveCount++;
       }
     }
     return ( surviveCount >= SIMULATED_BATTLE_THREASHOLD );
   }

 }

Diperbarui untuk menambah prediksi mangsa di masa depan dan memastikan bahwa paus kemungkinan akan diserang
Moogie

4
Yay! Akhirnya seorang alien menang yang tidak hanya mengandalkan kekuatan dan kehidupan, tetapi juga visi :)
CommonGuy

3
Sangat sulit untuk mendapatkan alien yang merupakan pemain yang konsisten! Para pendatang top lainnya sebagian besar semuanya mengikuti ide yang sama: menghindari alien, menyerang mangsa dan hanya memulai perkelahian yang hampir dijamin Anda akan menang. Alien ini mengikuti ide yang sama, tetapi dengan penghindaran alien yang lebih baik. Ini memberinya keunggulan sekecil apa pun karena lebih "mahal" untuk mendapatkan lebih banyak kemampuan jika Anda kalah.
Moogie

Saya memang mencoba ide-ide lain yang lebih eksotis tetapi tidak ada informasi yang cukup terbuka. yaitu ukuran peta, jumlah alien dll
Moogie

Kerja bagus! Saya juga sedikit frustrasi dengan kurangnya informasi - mengekstrak info tambahan dari masa lalu adalah kreatif.
Benny

15

Pilih Pertempuran Anda

Alien ini melarikan diri dari alien lain, tetapi berlari menuju mangsa (selama itu tidak akan membawanya ke alien).

Saya menggunakan algoritma genetika untuk membantu saya memilih nilai awal. Hasilnya menunjukkan bahwa kita harus mengandalkan kekuatan dan kehidupan untuk melewati pertempuran awal. Visi berguna nantinya, tetapi kita bisa mengambilnya dari musuh yang kalah.

Kami hanya bertempur, kami pikir kami bisa menang dengan nyaman - kami memperkirakan berapa banyak gerakan yang diperlukan untuk membunuh alien kami, berapa banyak yang diperlukan untuk membunuh musuh kami, dan hanya bergabung dalam pertempuran jika kami "dua kali lebih keras" dari lawan kita.

package alien;

import planet.Move;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import static java.lang.Math.*;

public class ChooseYourBattles extends Alien {
    private static final boolean DEBUG = false;
    private static final int LIFE = 0;
    private static final int STRENGTH = 1;
    private static final int DEFENCE = 2;
    private static final int VISION = 3;
    private static final int CLEVERNESS = 4;
    private static final Set<Character> prey = new HashSet<>();
    {
        Collections.addAll(prey, 'H', 'T', 'W', 'C', 'E');
    }

    public void setAbilityPoints(float[] abilities) {
        // Rounding promotes these to 4 and 7 - 11 points!
        abilities[LIFE] = 3.5f;
        abilities[STRENGTH] = 6.5f;
    }

    @Override
    public Move move(char[][] fields) {
        if (DEBUG) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < 2 * getVisionFieldsCount() + 1; j++) {
                for (int i = 0; i < 2 * getVisionFieldsCount() + 1; i++) {
                    char chr = fields[i][j];
                    if (chr == ' ') chr = '.';
                    if (i == getVisionFieldsCount() && j == getVisionFieldsCount()) chr = 'X';
                    sb.append(chr);
                }
                sb.append('\n');
            }
            String view = sb.toString();
            System.out.println(this.toString());
            System.out.println(view);
        }

        Move bestMove = null;
        int bestEnemyDistance = Integer.MIN_VALUE;
        int bestPreyDistance = Integer.MAX_VALUE;

        for (Move tryMove: Move.values()) {
            int currentDistanceToEnemy = Integer.MAX_VALUE;
            int currentDistanceToPrey = Integer.MAX_VALUE;
            int x = getVisionFieldsCount() + tryMove.getXOffset();
            int y = getVisionFieldsCount() + tryMove.getYOffset();
            for (int i = 0; i < 2 * getVisionFieldsCount() + 1; i++) {
                for (int j = 0; j < 2 * getVisionFieldsCount() + 1; j++) {
                    char chr = fields[i][j];
                    if (chr == 'A' && (i != getVisionFieldsCount() || j != getVisionFieldsCount())) {
                        // Use L-infinity distance, but fll back to L-1 distance
                        int distance = max(abs(i - x), abs(j - y)) * 100 + abs(i -x) + abs(j - y);
                        if (distance < currentDistanceToEnemy) currentDistanceToEnemy = distance;
                    } else if (prey.contains(chr)) {
                        int distance = max(abs(i - x), abs(j - y)) * 100 + abs(i -x) + abs(j - y);
                        if (distance < currentDistanceToPrey) currentDistanceToPrey = distance;
                    }
                }
            }
            if (currentDistanceToEnemy > bestEnemyDistance
                    || (currentDistanceToEnemy == bestEnemyDistance && currentDistanceToPrey < bestPreyDistance)) { // Prefer to stay put
                bestMove = tryMove;
                bestEnemyDistance = currentDistanceToEnemy;
                bestPreyDistance = currentDistanceToPrey;
            }
        }

        if (DEBUG) {
            System.out.println("Going " + bestMove);
            System.out.println();
        }
        return bestMove;
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        // Estimate whether likely to survive the encounter - are we at least "twice as hard" as our opponent
        return getCurrentHp() * (50.0 + getDefenseLvl()) / (enemyAbilities[STRENGTH])
                > 2.0 * (enemyAbilities[LIFE] * 5 + 10) * (50.0 + enemyAbilities[DEFENCE])/ (getStrengthLvl());
    }

    @Override
    public String toString() {
        return "ChooseYourBattles" + System.identityHashCode(this)
                + ": HP " + getCurrentHp()
                + ", LFE " + getLifeLvl()
                + ", STR " + getStrengthLvl()
                + ", DEF " + getDefenseLvl()
                + ", VIS " + getVisionLvl()
                + ", CLV " + getClevernessLvl();
    }
}

Jika Anda ingin menjalankan program pemuliaan / algoritma genetika Anda sendiri, saya punya salinan program kontrol bercabang untuk tujuan ini .


Bagaimana ini melewati pemeriksaan pada checkAbilitesOkmetode?
FreeAsInBeer

checkAbilitiesOkmemeriksa apakah float dalam array bertambah hingga 10.0. Namun, nilai float dibulatkan menjadi int dalam logika game, dan Java putaran 0,5 ke atas.
James_pic

@justhalf masih menetapkan 10 poin, mereka hanya didistribusikan secara cerdas.
CommonGuy

1
Saya harus mengatakan bahwa itu bukan ide saya pada awalnya - saya meminjamnya dari PredicatClaw
James_pic

1
Sangat bagus. Konstanta stat Anda mungkin lebih baik daripada milik saya dan wantToFight Anda pasti lebih pintar, saya hanya malas. :)
Benny

12

Pencandu

Alien ini kecanduan sesuatu . Dia memulai perang pada perbaikan yang cukup buruk.

Sementara perbaikannya menjadi kuat ( fix > 3) dia senang untuk duduk dalam keadaan pingsan dan siap untuk apa pun.

Namun, begitu perbaikannya mulai hilang ( fix <= 3) dia mulai tersandung di sekitar tanpa arah yang jelas mencoba untuk mencari tahu apa yang terjadi. Jika diminta untuk bertarung, ia menjadi berhati-hati dan hanya bertarung jika ia berpikir ia bisa menang.

Setelah perbaikannya habis, menjadi pecandu dia, dia harus memulai kembali lingkaran setan.

public class Junkie extends Alien {
    private int fix = 10;

    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 4; //life
        abilities[1] = 3; //strength
        abilities[2] = 3; //defense
    }

    public Move move(char[][] fields) {
        fix -= 1;
        if (fix == 0) {
            fix = 10;
        }
        else if(fix <= 3 && fix > 0) {
            return Move.getRandom();
        }

        return Move.STAY;
    }

    public boolean wantToFight(int[] enemyAbilities) {
        if(fix > 3) {
            return true;
        }
        // Am I stronger than their defense and can I withstand their attack?
        else if(enemyAbilities[2] < getStrength() && enemyAbilities[1] < getDefense()) {
            return true;
        }

        return false;
    }
}

Saya cukup yakin itu aman untuk dihapus && fix > 0karena redundansi.
Timtech

10

Kulit pisang

Hanya mencoba menjebak orang-orang yang perlu sedikit memukul. Mengalahkannya tidak akan membuat Anda lebih sehat.

package alien;

import planet.Move;
public class BananaPeel extends Alien{
    public void setAbilityPoints(float[] abilities){
        abilities[0] = 0.5f;  // banana peels barely hold themselves together
        abilities[1] = 9.5f;  // banana peels can't help tripping people up
        abilities[2] = 0;  // banana peels can't defend themselves
        abilities[3] = 0;  // banana peels can't see
        abilities[4] = 0;  // banana peels can't think
    }

    public Move move(char[][] fields){
        return Move.STAY; // banana peels can't move
    }

    public boolean wantToFight(int[] enemyAbilities){
        return enemyAbilities[0] == 0 || enemyAbilities[1] == 0;
    }
}

Penting juga untuk memperhatikan bahwa [0] adalah kehidupan daripada kesehatan sehingga 100 akan menjadi 510 HP (atau kurang, tergantung pada kerusakan yang sudah diambil) tetapi saya tidak tahu apakah alien akan mendapatkan setinggi itu ..
Gigala

@Gigala Pemikiran bagus, saya sudah mengubahnya sedikit.
Timtech

9

Van Pelt

Pemburu dari Jumanji. Dia berburu ketika dia tidak terluka, menghindari kapan dia dan adalah hakim yang layak atas apa yang bisa dia bunuh. Kulit pisang terus menjebaknya, tetapi mengajarinya beberapa trik baru.

package alien;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import planet.Move;

public class VanPelt extends Alien {

    private static final int LIFE = 0;
    private static final int STRENGTH = 1;
    private static final int DEFENSE = 2;
    private static final int VISION = 3;
    private static final int CLEVER = 4;

    // we all agreed before starting to move a certain direction if we're not
    // hunting or avoiding, helps avoid self-collisions... since we can't tell 
    // who we're fighting
    private static Move randomMove = Move.getRandom();

    @Override
    public void setAbilityPoints(float[] abilities) {
        abilities[LIFE] = 3.5f;
        abilities[STRENGTH] = 6f;
        abilities[VISION] = 0.5f;
    }

    @Override
    public Move move(char[][] fields) {
        int curHealth = this.getCurrentHp();
        List<Target> targets = new LinkedList<Target>();
        int vision = getVisionFieldsCount();
        boolean foundMe = false;
        for (int x = 0; x < fields.length; x++) {
            for (int y = 0; y < fields[x].length; y++) {
                switch (fields[x][y]) {
                case ' ' :
                    continue;
                case 'A' :
                    if (!foundMe && x == vision && y == vision) {
                        foundMe = true;
                        continue;
                    }
                    break;
                }
                targets.add(new Target(-vision + x, -vision + y, fields[x][y]));
            }
        }
        // if we're low health we need to move away from danger
        double desiredX = 0;
        double desiredY = 0;
        if (curHealth < this.getLifeLvl() * 7) {
            for (Target t : targets) {
                if (t.id == 'A') {
                    // closer aliens are more dangerous
                    desiredX -= vision / t.x;
                    desiredY -= vision / t.y;
                }
            }
        } else {
            // seek and destroy closest prey
            Collections.sort(targets);
            for (Target t : targets) {
                if (t.id != 'A') {
                    desiredX = t.x;
                    desiredY = t.y;
                    break;
                }
            }
        }
        desiredX = (int)Math.signum(desiredX);
        desiredY = (int)Math.signum(desiredY);
        for (Move m : Move.values()) {
            if (m.getXOffset() == desiredX && m.getYOffset() == desiredY) {
                return m;
            }
        }

        return randomMove;
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        // we don't want to fight if we're hurt
        int curHealth = this.getCurrentHp();
        if (curHealth < this.getLifeLvl() * 4) {
            return false;
        }
        // determine if we're fighting prey
        int count = 0;
        int abilityMaxed = 0;
        int total = 0;
        for (int i = 0; i < enemyAbilities.length; i++) {
            total += enemyAbilities[i];
            if (enemyAbilities[i] == 11) {
                count++;
                abilityMaxed = i;
            }
        }
        // very likely to be prey, ignoring cows... they're dangerous
        if (abilityMaxed != STRENGTH && (count == 1 || total < 10)) {
            return true;
        }

        // else use a scoring system with tinkered constants
        double score = enemyAbilities[LIFE] * 4.0 
                + enemyAbilities[DEFENSE] * 0.5 
                + enemyAbilities[STRENGTH] * 5.0;

        double myScore = this.getDefenseLvl() * 0.5 +
                this.getStrengthLvl() * 5.0 +
                this.getCurrentHp() * 2.5;

        return myScore > score * 2;
    }



    private class Target implements Comparable<Target> {
        public int x, y;
        public char id;
        public int distanceSq;

        public Target(int x, int y, char id) {
            // adjust for known movement patterns
            switch(id) {
            case 'T' :
                x += Move.SOUTHWEST.getXOffset();
                y += Move.SOUTHWEST.getYOffset();
                break;
            case 'H' :
                x += Move.NORTHEAST.getXOffset();
                y += Move.NORTHEAST.getYOffset();
                break;
            }
            this.x = x;
            this.y = y;
            this.id = id;

            distanceSq = x * x + y * y;
        }

        @Override
        public int compareTo(Target other) {
            return distanceSq - other.distanceSq;
        }
    }

}

Belajar untuk menghindari Kulit Pisang, eh? : P
Timtech

8

Okinawa Life

Tidak heran saya akan menjadi yang terakhir berdiri.

package alien;

import planet.Move;


public class OkinawaLife extends Alien{
    public void setAbilityPoints(float[] abilities){
        abilities[0] = 8.5f;
        abilities[1] = 0.5f;
        abilities[3] = 1;
    }

    public Move move(char[][] fields){
        int vision = getVisionFieldsCount(); //count of fields / middle
        char me = fields[vision][vision]; //middle of fields
        int leastDanger = Integer.MAX_VALUE;
        Move bestMove = Move.STAY;
        for (Move move : Move.values()) {
            int danger = 0;
            for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                switch(fields[fieldX][fieldY])  {
                    case 'A': danger++;
                    case ' ': break;
                    case 'C': break;
                    case 'E': break;
                    case 'H': break;
                    default: danger--;
                }
            }
            if (danger < leastDanger) {
                bestMove = move;
                leastDanger = danger;
            }
        }
        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities){
        return enemyAbilities[1] == 0;
    }
}

7

Pemburu

Saya juga agak mencuri gerakan elang, kecuali sekarang dia ingin pergi ke segala sesuatu selain alien lainnya. Berusaha memburu dan membudidayakan mangsa sebanyak mungkin, dan bertarung hanya ketika tampaknya memiliki peluang bagus untuk menang.

package alien;

import planet.Move;

public class Hunter extends Alien   {
    private final static byte LIFE=0, STR=1, DEF=2, VIS=3, CLV=4;

    public void setAbilityPoints(float[] abilities) {
        abilities[LIFE] = 0;
        abilities[STR] = 9;
        abilities[DEF] = 0;
        abilities[VIS] = 1;
        abilities[CLV] = 0;
    }

    public Move move(char[][] fields)   {
        int vision = getVisionFieldsCount(); //count of fields / middle
        char me = fields[vision][vision]; //middle of fields
        int leastDanger = Integer.MAX_VALUE;
        Move bestMove = Move.STAY;
        for (Move move : Move.values()) {
            int danger = 0;
            for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                switch(fields[fieldX][fieldY])  {
                    case 'A': danger++;
                    case ' ': break;
                    default: danger--;
                }
            }
            if (danger < leastDanger) {
                bestMove = move;
                leastDanger = danger;
            }
        }
        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities)    {
        return ((double)this.getCurrentHp() * this.getDefenseLvl()) / (double)enemyAbilities[STR] > (enemyAbilities[LIFE] * enemyAbilities[DEF]) / this.getStrengthLvl();
    }
}

7

Lebih dari 9000!

package alien;

import planet.Move;

public class Over9000 extends Alien {
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 10;
    }

    public Move move(char[][] fields) {
        return Move.WEST;
    }

    public boolean wantToFight(int[] enemyAbilities) {
        return enemyAbilities[1] <= 9000;
    }

    @Override
    public int getStrengthLvl() {
        return 9001; // It's over 9000!!!!!!111
    }
}

Ya, ini merupakan upaya curang yang terang-terangan, tetapi mencicit melalui aturan. Jika getter di planet.Speciefinal, celah ini akan ditutup.


4
Oh tidak! Saya tahu saya lupa sesuatu ... Saya akan menutup celah dan +1;)
CommonGuy

Saya agak kecewa bahwa jawaban ini memiliki lebih banyak suara daripada entri saya yang lain, yang lebih tua, yang saat ini menang.
James_pic

7

Batu

Saya pikir itu hanya menyerang orang yang lemah dan "pintar".

package alien;

import planet.Move;

public class Rock extends Alien{
    public void setAbilityPoints(float[] abilities){
        abilities[0] = 0.5f;
        abilities[1] = 9.5f;
    }

    public Move move(char[][] fields){
        return Move.STAY;
    }

    public boolean wantToFight(int[] enemyAbilities){
        return enemyAbilities[0] + enemyAbilities[1] + enemyAbilities[2] + enemyAbilities[3] < 10;
    }
}

3
Saya tidak yakin seberapa baik Rock akan bertahan begitu musuh-musuhnya mulai mendapatkan beberapa buff karena memenangkan pertempuran. Terlihat bagus.
Kyle Kanos

@KyleKanos saya mengerti; namun, saya berasumsi bahwa saya akan bertarung dengan kebanyakan mangsa / alien, selama mereka tidak pandai. Bukankah ini akan memberinya beberapa penggemar juga?
Timtech

Sekarang melihat kembali komentar saya, saya pikir itu benar-benar sama sekali tidak ingin saya katakan. Saya ingin mengatakan bahwa wantToFightkondisi tidak akan memberi trueketika musuh mulai menggosok dengan level; Anda akan dengan cepat beralih ke cinta damai yang kuat.
Kyle Kanos

@KyleKanos Oh, saya mengerti. Saya sudah mengubahnya sedikit.
Timtech

6

Morphling

Tidak bisa memikirkan nama lain, orang ini secara acak membagikan 10 poin untuk kemampuannya. Hampir bergerak seperti Okinawa Life (terima kasih atas usahamu) dan hanya ingin bertarung jika kekuatannya lebih besar dari kekuatan musuh.

package alien;

import planet.Move;
import java.util.Random;


public class Morphling extends Alien {

    @Override
    public void setAbilityPoints(float[] abilities) {
        Random rand = new Random();
        for(int attr = 0, maxPoints = 10, value = rand.nextInt(maxPoints); attr <5 && maxPoints > 0 ; attr++, maxPoints -=value, value = rand.nextInt(maxPoints)){
            abilities[attr] = value;
            if(attr == 4 && (maxPoints-=value) > 0){
                abilities[1]+=maxPoints;
            }
        }
    }

    @Override
    public Move move(char[][] fields) {
        int vision = getVisionFieldsCount(); //count of fields / middle
        char me = fields[vision][vision]; //middle of fields
        int leastDanger = Integer.MAX_VALUE;
        Move bestMove = Move.STAY;
        for (Move move : Move.values()) {
            int danger = 0;
            for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                switch(fields[fieldX][fieldY])  {
                    case 'A': danger++;
                    case ' ': break;
                    case 'T': break;
                    case 'E': break;
                    case 'H': break;
                    default: danger--;
                }
            }
            if (danger < leastDanger) {
                bestMove = move;
                leastDanger = danger;
            }
        }
        return bestMove;
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        return getStrengthLvl() > enemyAbilities[1];
    }

}

Ahh, kamu tahu, kamu benar. Kurung penutup telah membunuh saya tantangan ini (harus mengedit milikku beberapa kali karena itu). Saya melihatnya sekarang, dan itu benar. Terima kasih telah menunjukkan itu!
user3334871

@ user3334871 meskipun saya diuji dengan saran Anda dan morf saya hanya bertahan lebih baik: D
Sikorski

@Sikorski Yah, senang saya bisa membantu, tidak yakin mengapa itu akan lebih baik, haha.
user3334871

@ Sikorski Saya kira itu hanya berarti bahwa tinggal diam sering lebih aman daripada membuat langkah paling berbahaya jika semua gerakan berbahaya.
Martin Ender

Ahh, strategi "Rusa di Lampu Depan", aku menyukainya.
user3334871

6

Bender "Bending" Rodriguez

Saya cukup liberal dengan komentar kode. Anda dapat membacanya dalam konteks untuk melihat apa yang sedang terjadi, tetapi saya juga akan menambahkan beberapa cuplikan di bawah ini.

Ringkasan

Alien ini beroperasi dengan prinsip bahwa membunuh manusia yang kecil itu mudah dan menggembungkan kekuatan yang Anda rasakan, yang akan mengintimidasi alien lain agar menjauh.

Paus dan Rajawali juga bisa ditekuk. =)

Gerakan

Pindah ke barat atau selatan kecuali jika Anda menemukan sesuatu yang menarik untuk diserang:

  • Untuk mangsa yang pergerakannya diketahui, kami menambahkan keinginan mereka ke kotak di mana mereka akan menjadi giliran berikutnya.
  • Bagi mereka yang tidak, kami membagi keinginan mereka secara merata di antara kotak-kotak yang mereka dapat pindah ke belokan berikutnya.
    • Alien mendapat bonus negatif ke kotak yang ada karena kulit pisang.

Jika Anda tidak menemukan sesuatu yang menarik di dekat Anda, cari tahu apakah selatan, barat, atau barat daya adalah pilihan yang lebih menjanjikan.

Memilih satu atau dua arah yang berlaku mengurangi kemungkinan bahwa Bender yang diberikan akan menemukan rekan senegaranya, dan memilih penghitung arah ke mangsa utamanya akan membantunya membunuh semua manusia lebih cepat.

Saya mungkin bisa mengubah angka-angka dalam matriks keinginan dengan algoritma genetik James_pic untuk hasil yang lebih baik, tapi saya tidak tahu bagaimana melakukannya.

Agresivitas

Bender kebanyakan menargetkan mangsa, dan cukup konservatif dengan mangsanya wantToFight. Siapa pun di atas Kekuatan 4 dijauhi kecuali Anda berpikir Anda sedang berurusan dengan manusia yang pintar. Kemanusiaan yang cerdas ditunjukkan dengan memiliki lebih banyak Pertahanan dan Visi daripada yang dimiliki alien. Ini disesuaikan selama kejadian oleh statistik kemampuan Bender sendiri, untuk menjelaskan alien membunuh kura-kura dan elang.

package alien;

import planet.Move;
import java.util.HashMap;

/// The Bender "Kill All Humans" Alien
///
/// This alien operates on the principle that killing puny
/// Humans is easy and inflates your perceived strength,
/// which will intimidate other aliens into steering clear.
///
/// Whales and Eagles are also bendable. =)
public class Bender extends Alien {

    private static final boolean DEBUG = false;
    private final int LIF = 0, STR = 1, DEF = 2, VIS = 3, CLV = 4;
    protected static HashMap<Character, Integer> preyDesirability = new HashMap<Character, Integer>() {{
        put('A', -5);
        put('W',  5);
        put('C',  0); // Originally -2, but Cows don't attack
        put('T',  2);
        put('E',  3);
        put('H',  4);
    }};
    private static final int bananaTweak = -2;

    private static final HashMap<Character, Move> preyMovement = new HashMap<Character, Move>() {{
        put('W', Move.STAY);
        put('T', Move.SOUTHWEST);
        put('H', Move.NORTHEAST);
    }};

    public void setAbilityPoints(float[] abilities) {
        abilities[LIF] = 3.5f; // Shiny metal ass
        abilities[STR] = 5.5f; // Bending strength
        abilities[DEF] = 0;
        abilities[VIS] = 1;    // Binocular eyes
        abilities[CLV] = 0;
    }

    /// Looks for humans to intercept!
    ///
    /// Generally speaking, move either west or south
    /// unless you have found something interesting to
    /// attack:
    /// - For the prey whose movement is known, we add
    ///   their desirability to the index at which they
    ///   will be next turn.
    /// - For those we do not, we divide their desirability
    ///   equally among the squares that they may move to
    ///   next turn. Aliens get a bonus negative to their
    ///   existing square because of banana peels.
    public Move move(char[][] fields) {

        int vision = getVisionFieldsCount();
        // I am at fields[vision][vision]

        if (DEBUG) {
            System.out.format("\n----- %s -----\n", this);
        }

        float[][] scoringMap = new float[fields.length][fields.length];
        for (int y = 0; y < fields.length; y++) {
            for (int x = 0; x < fields.length; x++) {

                // Ignore my square and blanks
                if (x == vision && y == vision ||
                    fields[x][y] == ' ') {
                    continue;
                }

                // Check out the prey 8^]
                char organism = fields[x][y];
                float desirability = preyDesirability.get(organism);

                // If we know where it's going, score tiles accordingly...
                if (preyMovement.containsKey(organism)) {
                    Move preyMove = preyMovement.get(organism);
                    if (DEBUG) {
                        System.out.println(String.format("Prey %s will move %s", organism, preyMove));
                    }
                    int newPreyX = x + preyMove.getXOffset();
                    int newPreyY = y + preyMove.getYOffset();
                    try {
                        scoringMap[newPreyX][newPreyY] += desirability;
                        if (DEBUG) {
                            System.out.println(String.format(
                                "Adding %.1f to %d, %d",
                                desirability,
                                newPreyX,
                                newPreyY));
                        }
                    }
                    catch(Exception e) {
                        if (DEBUG) {
                            System.out.println(String.format(
                                "Failed adding %.1f to %d, %d",
                                desirability,
                                newPreyX,
                                newPreyY));
                        }
                    }
                }
                // ...otherwise, divide its score between its
                //    available moves...
                else {
                    for (int j = y - 1; j <= y + 1; j++) {
                        for (int i = x - 1; i <= x + 1; i++) {
                            try {
                                scoringMap[i][j] += desirability / 9.;
                            }
                            catch (Exception e) {
                                if (DEBUG) {
                                    //System.out.println(e);
                                }
                            }
                        }
                    }
                }
                // ...and if it is an alien, add a handicap
                //    for bananas and rocks.
                if (organism == 'A') {
                    scoringMap[x][y] += bananaTweak;
                }
            }
        }

        // Evaluate immediate surroundings 8^|
        //
        // +-----------+
        // |           |
        // |   # # #   |
        // |   # B #   |
        // |   # # #   |
        // |           |
        // +-----------+
        float bestScore = -10;
        int[] bestXY = new int[2];
        for (int y = vision - 1; y <= vision + 1; y++) {
            for (int x = vision - 1; x <= vision + 1; x++) {

                if (DEBUG) {
                    System.out.format("\nx:%d, y:%d", x, y);
                }
                // Look for the best score, but if scores
                // are tied, try for most southwest high score
                if (scoringMap[x][y] > bestScore ||
                    scoringMap[x][y] == bestScore && (
                        x <= bestXY[0] && y > bestXY[1] ||
                        y >= bestXY[1] && x < bestXY[0])
                    ) {
                    bestScore = scoringMap[x][y];
                    bestXY[0] = x;
                    bestXY[1] = y;
                    if (DEBUG) {
                        System.out.format("\nBest score of %.1f found at %d, %d", bestScore, x, y);
                    }
                }
            }
        }

        if (DEBUG) {
            StringBuilder sb = new StringBuilder();
            sb.append("\n-----\n");
            for (int y = 0; y < fields.length; y++) {
                for (int x = 0; x < fields.length; x++) {
                    sb.append(String.format("%5s", fields[x][y]));
                }
                sb.append("\n");
            }
            for (int y = 0; y < scoringMap.length; y++) {
                for (int x = 0; x < scoringMap.length; x++) {
                    sb.append(String.format("%5.1f", scoringMap[x][y]));
                }
                sb.append("\n");
            }
            System.out.println(sb.toString());
        }

        // If something looks tasty, go for it :^F
        if (bestScore > 0.5) {
            for (Move m : Move.values()) {
                if (m.getXOffset() == bestXY[0] - vision &&
                    m.getYOffset() == bestXY[1] - vision) {
                    if (DEBUG) {
                        System.out.println("Using immediate circumstances.");
                        System.out.println(m);
                    }
                    return m;
                }
            }
        }

        // If nothing looks good, do a lookahead to
        // the south, west, and southwest to guess
        // which is best. 8^[
        //
        // There is potential in recursively applying our
        // vision data with updated score rankings, but
        // that would be hard. :P
        float westScore = 0, southScore = 0, southWestScore = 0;
        for (int y = vision - 1; y < vision + 1; y++) {
            for (int x = 0; x < vision; x++) {
                // +-----------+
                // |           |
                // | # # #     |
                // | # # B     |
                // | # # #     |
                // |           |
                // +-----------+
                westScore += scoringMap[x][y] / (vision - x);
            }
        }
        for (int y = vision; y < fields.length; y++) {
            for (int x = vision - 1; x < vision + 1; x++) {
                // +-----------+
                // |           |
                // |           |
                // |   # B #   |
                // |   # # #   |
                // |   # # #   |
                // +-----------+
                southScore += scoringMap[x][y] / (y - vision);
            }
        }
        for (int y = vision; y < fields.length; y++) {
            for (int x = 0; x < vision; x++) {
                // +-----------+
                // |           |
                // |           |
                // | # # B     |
                // | # # #     |
                // | # # #     |
                // +-----------+
                southWestScore += scoringMap[x][y] / Math.sqrt((y - vision) + (vision - x));
            }
        }
        if (southScore > westScore && southScore > southWestScore) {
            if (DEBUG) {
                System.out.println(Move.SOUTH);
            }
            return Move.SOUTH;
        }
        if (westScore > southScore && westScore > southWestScore) {
            if (DEBUG) {
                System.out.println(Move.WEST);
            }
            return Move.WEST;
        }
        if (DEBUG) {
            System.out.println(Move.SOUTHWEST);
        }
        return Move.SOUTHWEST;
    }

    public boolean wantToFight(int[] enemyAbilities) {

        // Be afraid...
        if (enemyAbilities[STR] > 4) {

            // ...unless you suspect you are being lied to
            if (enemyAbilities[DEF] + enemyAbilities[VIS] > 4 * sumMyAbilities() / 5.) {

                // Enemy has more than expected attribute levels of unhelpful
                // abilities. Assume you're dealing with a clever bastard.
                return true;
            }

            return false;
        }
        return true;
    }

    int sumAbilities(int[] abilities){
        int sum = 0;
        for (int ability : abilities){
            sum += ability;
        }
        return sum;
    }

    int sumMyAbilities(){
        return sumAbilities(new int[]{
            getLifeLvl(),
            getStrengthLvl(),
            getDefenseLvl(),
            getVisionLvl(),
            getClevernessLvl()
        });
    }
}

Saya perhatikan bahwa ada kesalahan logika loop di mana variabel yang bertambah bukan apa yang sedang dibandingkan secara langsung dan hanya menghindari rekursi tak terbatas dengan cara pembungkus integer overflow. Semoga Anda baik-baik saja dengan saya memperbarui jawaban Anda. (itu menyebabkan simulasi berhenti dari waktu ke waktu)
Moogie

@ Moogie Heh. Jadi saya hanya melakukannya dengan baik secara tidak sengaja? Terima kasih sudah menangkapnya.
Michael

Saya membahas semuanya dan memperbaiki beberapa masalah lagi.
Michael

5

pejuang

Ini adalah alien yang berpikiran sangat sederhana yang hanya ingin bertarung. Dia tidak peduli dengan musuh-musuhnya atau tentang lingkungannya.

public class Warrior extends Alien {

    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 5;
        abilities[1] = 5;
    }

    public Move move(char[][] fields) {
        return Move.getRandom(); //enemies are everywhere!
    }

    public boolean wantToFight(int[] enemyAbilities) {
        return true; //strong, therefore no stronger enemies.
    }
}

Anda sekarang memiliki seseorang untuk menguji alien Anda sendiri.


4

Pengecut

Saya pada dasarnya mencuri pola gerakan Elang untuk menghindari bahaya dan menumpuk pertahanan jika saya diserang.

public class Coward extends Alien{
    public void setAbilityPoints(float[] abilities){
        abilities[0] = 1;  // life
        abilities[1] = 0;  // str
        abilities[2] = 2; // def
        abilities[3] = 7;  // vis
        abilities[4] = 0;  // clv
    }

    // shamelessly stole Eagle's movement to avoid danger
    public Move move(char[][] fields){
        int vision = getVisionFieldsCount(); 
        char me = fields[vision][vision];
        int leastDanger = Integer.MAX_VALUE;
        Move bestMove = Move.STAY;
        for (Move move : Move.values()) {
            int danger = 0;
            for (int i = 1; i <= vision; i++) {
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                if (fields[fieldX][fieldY] != ' ') {
                    danger++;
                }
            }
            if (danger < leastDanger) {
                bestMove = move;
                leastDanger = danger;
            }
        }
        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities){
        return false;
    }
}

Koreksi saya jika saya salah, tetapi karena setiap kemampuan memiliki titik dasar 1, maka menempatkan vision=1harus memadai?
justhalf

@justhalf: Pembacaan singkat saya tentang kode tampaknya menyarankan bahwa setAbilityPointsmenulis nilai-nilai 1 secara berlebihan, tetapi melihat lebih dalam, saya pikir Anda benar. Saya akan membiarkannya karena visi yang lebih besar memungkinkan saya untuk melihat lebih jauh dan menghindari bahaya, tetapi terima kasih atas tangkapannya.
Kyle Kanos

Juga, math.round selalu membulatkan ke atas di 0,5, sehingga Anda mendapatkan visi ekstra jika Anda memiliki angka ganjil
Andreas

@ Manu: Saya telah menukar nilai visi & pertahanan saya untuk meningkatkan melarikan diri.
Kyle Kanos

4

Tersenyum dgn menghina

PANIK

WAHYU

RUUUUUUUUUUNUN

AAAAAAAAAAAAAAAAAAAAAAA


Hindari pertempuran jika memungkinkan.

package alien; import planet.Move;

public class Fleer extends Alien
{
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 1; //life
        abilities[1] = 0; //strength
        abilities[2] = 4; //defense
        abilities[3] = 4; //vision
        abilities[4] = 1; //cleverness
    }

    public Move move(char[][]fields) {
        int vision = getVisionFieldsCount(); //count of fields / middle
        char me = fields[vision][vision]; //middle of fields
        int leastDanger = Integer.MAX_VALUE;
        Move bestMove = Move.STAY;
        ArrayList<Integer> dangerOnSides = new ArrayList<Integer>();
        for (Move move : Move.values()) {
            int danger = 0;
            for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                if (fields[fieldX][fieldY] != ' ') {
                    danger++;
                }
            }
            if (danger < leastDanger) {
                bestMove = move;
                leastDanger = danger;
            }
            dangerOnSides.add(danger);
        }

        boolean noDanger = false;
        for (int i : dangerOnSides) {
           if (i == 0) {
              noDanger = true;
           }
           else { noDanger = false; break; }
        }

        if (noDanger) {
              // Hahhhhhhhh.......
              return Move.STAY;
        }

        int prev = -1;
        boolean same = false;
        for (int i : dangerOnSides) {
           if (prev == -1)
           { prev = i; continue; }
           if (i == prev) {
              same = true;
           }
           else { same = false; break; }

           prev = i;
        }

        if (same) {
              // PANIC
              return Move.getRandom();
        }

        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities) {
        return false;
    }
}

Anda harus memberikan nama yang berbeda ini ... dan memberikan penghargaan pada jawaban yang Anda salin dari: codegolf.stackexchange.com/a/32787/9498
Justin

2
@ Quincunx Itu kebetulan, tidak melihat yang ...
stommestack

Maaf, saya baru menyadari bahwa keduanya menjawab salinan dari Eagle. Anda tidak menyalin jawaban yang lain, saya hanya tidak membaca dengan cukup hati-hati. Namun, nama yang berbeda akan sesuai.
Justin

1
Mengubah nama!
stommestack

2
Harus dinamai Rincewind.
Magus

4

Predicoward (mendengkur)

Trah Predicats yang telah hidup (sejauh ini) karena ketakutan dan menjauh dari masalah. Karena gaya hidup mereka, mereka tidak mengembangkan naluri bertempur, tetapi persepsi mereka luar biasa.

Jenis mereka dibenci oleh sesama Predicats mereka.

Suntingan: Mengubah Jarak Manhattan menjadi Jarak Tertimbang sebagai gantinya

package alien;

import planet.Move;
import java.util.ArrayList;
import java.awt.Point;

/* Predict + Cat = Predicat! */
public class Predicoward extends Alien {
    /*
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - P - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -
        - - - - - - - - - - - - -

        Risk score = sum of weighted distances of all aliens within vision range
    */
    @Override
    public void setAbilityPoints( float[] abilities ) {
        abilities[3] = 10;
    }

    @Override
    public Move move( char[][] fields ) {
        /* Some credits to Eagle for letting me learn how to do the moves */
        int vision = getVisionFieldsCount(); //count of fields / middle

        Move bestMove=Move.STAY;
        int bestRiskScore=10000;
        int riskScore=0;
        ArrayList<Point> aliens = new ArrayList<Point>();

        //generate alien list
        for (int x=0; x<=vision*2; x++) {
            for(int y=0; y<=vision*2; y++){
                if(x==vision && y==vision) continue;
                if(fields[x][y]=='A'){
                    aliens.add(new Point(x,y));
                }
            }
        }

        for (Move move : Move.values()) {
            int x = vision + move.getXOffset();
            int y = vision + move.getYOffset();
            riskScore = 0;

            for(Point alienCoord : aliens){
                riskScore += this.getDistance(x, y, alienCoord);
            }

            if(riskScore < bestRiskScore){
                bestRiskScore = riskScore;
                bestMove = move;
            }
        }

        return bestMove;
    }

    @Override
    public boolean wantToFight( int[] enemyAbilities ) {
        //I don't want to fight :(
        return false;
    }

    //Return weighted distance (more weight for near opponents)
    private int getDistance(int x, int y, Point to){
        int xDist = Math.abs(x-(int)to.getX());
        int yDist = Math.abs(y-(int)to.getY());
        int numberOfMovesAway = Math.max(xDist, yDist);

        if(numberOfMovesAway==0){
            return 1000;
        }
        else if(numberOfMovesAway==1){
            return 100;
        }
        else if(numberOfMovesAway==2){
            return 25;
        }
        else{
            return 6-numberOfMovesAway;
        }
    }
}

2
Kelihatan bagus! Tapi tolong keluarkan pernyataan cetak Anda, itu akan membingungkan saya ketika saya menjalankan kontes.
CommonGuy

Oh, saya meninggalkan pernyataan cetak? Saya akan mengubahnya nanti. Ha ha. Plus ini belum final. Saat ini, Predicoward payah. Algoritma penghindaran aliennya akan segera ditingkatkan. :) EDIT: Terima kasih untuk orang yang menghapus pernyataan cetak. : D (Jop?)
Mark Gabriel

EDIT: Predicowards sekarang jauh lebih baik dalam melarikan diri daripada predicowards kecil yang tidak kompetitif seperti kemarin. > :)
Mark Gabriel

Trivia: Ini Predicat favorit saya <3
Mark Gabriel

4

PredicatEyes (meow)

Trah Predicats yang memiliki penglihatan lebih tajam daripada rekan-rekannya yang memungkinkannya untuk mengorek musuh dengan baik.

EDIT: Prioritas target baru

package alien;

import planet.Move;

/* Predict + Cat = Predicat! */
public class PredicatEyes extends Alien {
    private static final int LIF=0, STR=1, DEF=2, VIS=3;
    private static final int WHALE=6, COW=1, TURTLE=4, EAGLE=3, HUMAN=2, ALIEN=-1, NONE=0;

    @Override
    public void setAbilityPoints( float[] abilities ) {
        abilities[LIF] = 4.5f;
        abilities[STR] = 4.5f;
        abilities[VIS] = 1;
    }

    @Override
    public Move move( char[][] fields ) {
        /* Some credits to Eagle for letting me learn how to do the moves */
        int vision = getVisionFieldsCount(); //count of fields / middle
        int fieldX;
        int fieldY;
        Move bestMove=Move.STAY;
        int bestScore=-1;

       for (Move move : Move.values()) {
            fieldX = vision + move.getXOffset();
            fieldY = vision + move.getYOffset();
            switch(fields[fieldX][fieldY]){
            case 'W' : 
                return move;
            case 'C' :
                if(bestScore<COW){
                    bestMove=move;
                    bestScore=COW;
                }
                break;
            case 'T' :
                if(bestScore<TURTLE){
                    bestMove=move;
                    bestScore=TURTLE;
                }
                break;
            case 'E' :
                if(bestScore<EAGLE){
                    bestMove=move;
                    bestScore=EAGLE;
                }
                break;
            case 'H' :
                if(bestScore<HUMAN){
                    bestMove=move;
                    bestScore=HUMAN;
                }
                break;
            case 'A' :
                if(bestScore<ALIEN){
                    bestMove=move;
                    bestScore=ALIEN;
                }
                break;
            case ' ' :
                if(bestScore<NONE){
                    bestMove=move;
                    bestScore=NONE;
                }
                break;
            }
        }

        if(vision==1 && bestScore>1){
            return bestMove;
        }

        //check immediate outer field
        for (int i=vision-2; i<=vision+2; i++) {
            for(int j=vision-2; j<=vision+2; j++){
                if(i==0 || i==4 || j==0 || j==4){
                    switch(fields[i][j]){
                    case 'W' :
                        bestMove = this.getBestMoveTo(i,j);
                        bestScore = WHALE;
                        break;
                    case 'C' :
                        if(bestScore<COW){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = COW;
                        }
                        break;
                    case 'T' :
                        if(i>=vision && j<=vision){
                            return this.getBestMoveTo(i-1,j+1);
                        }
                        if(bestScore<TURTLE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = TURTLE;
                        }
                        break;
                    case 'E' :
                        if(bestScore<EAGLE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = EAGLE;
                        }
                        break;
                    case 'H' :
                        if(i<=vision && j>=vision){
                            return this.getBestMoveTo(i+1,j-1);
                        }
                        if(bestScore<HUMAN){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = HUMAN;
                        }
                        break;
                    case 'A' :
                        if(bestScore<ALIEN){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = ALIEN;
                        }
                        break;
                    case ' ' :
                        if(bestScore<NONE){
                            bestMove = this.getBestMoveTo(i,j);
                            bestScore = NONE;
                        }
                        break;
                    }
                }
            }
        }

        return bestMove;
    }

    @Override
    public boolean wantToFight( int[] enemyAbilities ) {
        /*
            Fight IF
                1) I CAN BEAT YOU
                2) ????
                3) MEOW!
        */
        float e_hp = enemyAbilities[LIF]*5+10;
        float e_dmg = 1 + enemyAbilities[STR]/2;
        float e_hit = 1 - (1/(50/this.getDefenseLvl()+1));

        float m_hp = this.getCurrentHp();
        float m_dmg = 1 + this.getStrengthLvl()/2;
        float m_hit = 1 - (1/(50/enemyAbilities[DEF]+1));

        return (e_hp/(m_dmg*m_hit) < m_hp/(e_dmg*e_hit));
    }

    private Move getBestMoveTo(int visionX, int visionY){
        int vision = getVisionFieldsCount();

        if(visionX < vision && visionY < vision){
            return Move.NORTHWEST;
        }
        else if(visionX > vision && visionY < vision){
            return Move.NORTHEAST;
        }
        else if(visionX < vision && visionY > vision){
            return Move.SOUTHWEST;
        }
        else if(visionX > vision && visionY < vision){
            return Move.SOUTHEAST;
        }
        else if(visionX == vision && visionY < vision){
            return Move.NORTH;
        }
        else if(visionX == vision && visionY > vision){
            return Move.SOUTH;
        }
        else if(visionX > vision && visionY == vision){
            return Move.EAST;
        }
        else if(visionX < vision && visionY == vision){
            return Move.WEST;
        }
        else{
            return Move.getRandom();
        }

    }
}

3

Pangkas Lingkaran Alien

Lingkaran searah jarum jam tanpa batas waktu, dan tidak pernah ingin bertarung, dia senang membuat lingkaran tanaman. Namun, jika Anda benar-benar ingin bertarung, dia akan mengalahkan Anda.

package alien;

import planet.Move;

public class CropCircleAlien extends Alien {

    private int i = 0;

    @Override
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 3; // life
        abilities[1] = 7; // strength
        abilities[2] = 0; // defense
        abilities[3] = 0; // vision
        abilities[4] = 0; // cleverness
    }

    @Override
    public Move move(char[][] fields) {
        switch (getI()) {
        case 0:
            setI(getI() + 1);
            return Move.EAST;
        case 1:
            setI(getI() + 1);
            return Move.SOUTHEAST;
        case 2:
            setI(getI() + 1);
            return Move.SOUTH;
        case 3:
            setI(getI() + 1);
            return Move.SOUTHWEST;
        case 4:
            setI(getI() + 1);
            return Move.WEST;
        case 5:
            setI(getI() + 1);
            return Move.NORTHWEST;
        case 6:
            setI(getI() + 1);
            return Move.NORTH;
        case 7:
            setI(getI() + 1);
            return Move.NORTHEAST;
        default:
            return Move.STAY;
        }
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        return false;
    }

    public void setI(int i) {
        if (i < 8) {
            this.i = i;
        } else {
            this.i = 0;
        }
    }

    public int getI() {
        return this.i;
    }
}

2
Ini akan lebih bersih jika Anda mengulanginya melalui Move.
Bukan itu Charles

4
Mengapa tidak berubah setiap getI()untuk idan hanya menghapus getI()? Anda juga dapat mengubah setI(int i)ke this.i = i % 8;, dan karena Anda hanya menggunakannya di satu tempat itu, ubah saja setiap panggilan setI(getI() + 1)kei = (i + 1) % 8;
Justin

3

CleverAlien

Alien yang cerdik hanya mengandalkan akalnya. Dia berjalan secara acak, dan secara acak memutuskan untuk bertarung. Dia berharap dia bisa mengakali musuhnya dengan keberuntungan. (maafkan saya jika saya memiliki kesalahan sintaks, saya bukan orang java)

package alien;

import planet.Move;

public class CleverAlien extends Alien {

public void setAbilityPoints(float[] abilities) {
    abilities[0] = 1; //life
    abilities[1] = 0; //strength
    abilities[2] = 0; //defense
    abilities[3] = 0; //vision
    abilities[4] = 9; //cleverness
}

public Move move(char[][] fields) {
    //you are in the middle of the fields, say fields[getVisionFieldsCount()][getVisionFieldsCount()]
    return Move.getRandom();
}

public boolean wantToFight(int[] enemyAbilities) {
    //same order of array as in setAbilityPoints, but without cleverness
    int tmp = (int) ( Math.random() * 2 + 1);
    return tmp == 1;
    }
}

8
tmp == 1 ? true : false? Mengapa tidak (tmp == 1) == true ? true : false? ;) (Petunjuk: ini sama dengan adil tmp == 1 .)
Martin Ender

3

Penipu

Seperti yang dikatakan orang lain, saya menggunakan gerakan Elang sampai batas tertentu. Daripada mencoba membuat alien yang menang (Ide-ide terbaik saya sudah diambil D :), saya memutuskan untuk membuat alien dengan beberapa karakter! Alien saya adalah senjata sewaan yang tidak menyadari perang alien, dan hanya di planet ini untuk memburu manusia kotor yang telah melewatkan hutang tongkat kematiannya. Alien saya akan mencari manusia di planet ini, dan terus berjalan di belakang manusia tanpa membunuhnya. Setelah seorang alien terlihat di dekatnya, ia kemudian akan mencoba untuk dengan cepat membunuh manusia, dan menghadapi musuh baru ini dengan "keberuntungan di sisinya" dari tugasnya yang selesai.

package alien;

import planet.Move;

public class Rogue extends Alien {

    private int threatPresent = 0;
    private int turnNorth = 0;

    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 3;
        abilities[1] = 6;
        abilities[2] = 0;
        abilities[3] = 1;
        abilities[4] = 0;
    }

    public Move move(char[][] fields) {
        int vision = getVisionFieldsCount();
        char me = fields[vision][vision];
        int humanPresent = 0;            
        //This way, if there is no alien near, the current threat will not trigger attacking
        int isThereCurrThreat = 0;
        Move bestMove = Move.STAY;
        for (Move move : Move.values()) {
            for (int i = 1; i <= vision; i++) {
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                if (fields[fieldX][fieldY] == 'A') {
                    isThereCurrThreat = 1;
                }

                if (fields[fieldX][fieldY] == 'T') {
                    humanPresent = 1;
                    //Turtles are basically dumb humans, right?
                }

                if (fields[fieldX][fieldY] == 'H') {
                    humanPresent = 1;
                }
            }

            //Alway follow that filthy human
            if (humanPresent == 1) {
                bestMove = move;
            }

           }

         if(humanPresent == 0) {
             //Alternate moving north and east towards the human
             //If I hit the edge of world, I search for the turtle as well
             if(turnNorth == 1) {
                bestMove = Move.NORTH;
                turnNorth = 0;
             }

             else {
                bestMove = Move.EAST;
                turnNorth = 1;
             }
         }

      //If a threat was found, attack accordingly.
      threatPresent = isThereCurrThreat;
      return bestMove;

    }

  public boolean wantToFight(int[] enemyAbilities) {
      //Only fight if another enemey is near
      if (threatPresent == 1) {
        return true;
        }

      else {
        return false;
      }
   }
}

Kode ini berpusat di sekitar gagasan bahwa saya harus berlari menuju manusia. Setelah saya mengalahkannya, saya kemudian membungkus ke barat daya, di mana saya akan mencari kura-kura.

EDIT: Oh, dan tentang hal kura-kura ... alien saya tidak suka mereka, jadi itu benar-benar kanon kalian.


Baru sadar saya bisa berlari ke arah kura-kura juga. Siapa yang tidak suka bajingan penghindar tinggi?
user3334871

2
menggunakan int secara langsung sebagai boolean jika blok bagian dari Java 8? karena tidak mengkompilasi sama sekali pada mesin saya (Java 7). Petunjuk: humanPresent
Sikorski

Heck jika saya tahu, pengalaman Java saya sebagian besar terbatas pada skrip dan kelas tingkat perguruan tinggi. Saya hanya akan membuat perbandingan, supaya semuanya bagus. Terimakasih atas peringatannya!
user3334871

Juga, @Sikorski, apakah Anda membuat fungsi utama atau init Anda sendiri untuk menjalankan tes Anda? Atau dapatkah itu dilakukan hanya melalui kode yang disediakan saja? Saya bersumpah, sudah begitu lama sejak saya mengkodekan di lingkungan Java yang benar, bahwa saya lupa aturan untuk mengeksekusi kode Java :(
user3334871

tidak hanya mengunduh kode yang diberikan OP di tautan github, tambahkan kelas lain, dan mulai pengujian. Oh, Anda harus menambahkan entri untuk setiap kelas alien di kelas Planet.
Sikorski

3

Crash mendarat dan hanya berusaha bertahan hidup. Bertahan sebagian besar dengan kelincahan dan kecerdasannya dan menghitung setiap bekas luka, mempertimbangkan dengan hati-hati apakah layak untuk memulai perkelahian atau tidak. Korban mulai dari hanya berburu dan mencoba untuk menghindari semua alien lain dengan senjata besar mereka tetapi karena semakin berani mungkin mulai mengejar mereka. Ketika itu benar-benar terjadi itu tidak akan peduli siapa yang dihadapinya lagi.

package alien;

import planet.Move;

public class Survivor extends Alien {

    private int boldness = 0;
    private float life = 0;
    private float str = 1;
    private float def = 4;
    private float clever = 10 - life - str - def;

    public void setAbilityPoints(float[] abilities) {
        abilities[0] = life; //life
        abilities[1] = str; //strength
        abilities[2] = def; //defense
        abilities[3] = 0; //vision
        abilities[4] = clever; //cleverness
    }

    public Move move(char[][] fields) {
        //you are in the middle of the fields, say fields[getVisionFieldsCount()][getVisionFieldsCount()]
        int vision = getVisionFieldsCount(); //count of fields / middle
    char me = fields[vision][vision]; //middle of fields
    int leastDanger = Integer.MAX_VALUE;
    Move bestMove = Move.STAY;
    for (Move move : Move.values()) {
        int danger = 0;
        for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
            int fieldX = vision + (i * move.getXOffset());
            int fieldY = vision + (i * move.getYOffset());
            switch(fields[fieldX][fieldY]) {
                case 'A':
                    if(boldness < 10)
                        danger++;
                    else
                        danger--;
                    break;
                case ' ':
                    break;
                default:
                    danger-=2;
            }
        }
        if (danger < leastDanger) {
            bestMove = move;
            leastDanger = danger;
        }
    }
    return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities) {
        //same order of array as in setAbilityPoints, but without cleverness
        bool fight = boldness < 50;//After 50 fights, believes self unstoppable            
        int huntable = 0;
        for(int ability : enemyAbilities){
            if(ability == 1)
                huntable++;
        }
        if(huntable >= 3){
             fight = true;
        }//if at least 3 of the visible stats are 1 then consider this prey and attack
        else if((float)enemyAbilities[1] / (float)getDefenseLvl() <= (float)getStrengthLvl() + (float)(getClevernessLvl() % 10) / (float)enemyAbilities[2] && enemyAbilities[0] / 5 < getLifeLvl() / 5)
            fight = true;//If I fancy my odds of coming out on top, float division for chance
        if(fight){//Count every scar
            boldness++;//get more bold with every battle
            life += enemyAbilities[0] / 5;
            str += enemyAbilities[1] / 5;
            def += enemyAbilities[2] / 5;
            clever += (10 - (enemyAbilities[0] + enemyAbilities[1] + enemyAbilities[2] + enemyAbilities[3] - 4)) / 5;//count the human cleverness attained or the enemies who buffed clever early
        }
        return fight;
    }

}

1
Saya cukup yakin itu for(int ability in enemyAbilities){adalah kesalahan sintaks - cobafor(int ability : enemyAbilities){
Joshua

3

FunkyBob

Prioritas pertama adalah bertahan hidup, jika tidak akan mencoba mencari mangsa. Menilai area yang terlihat untuk menemukan arah umum dengan ancaman paling sedikit atau paling banyak mangsa. Tampaknya memiliki tingkat kelangsungan hidup 85-90% selama pengujian saya.

package alien;
import planet.Move;

public class FunkyBob extends Alien {
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 2.5f;
        abilities[1] = 5.5f;
        abilities[3] = 2;
    }

    private int QtyInRange(char[][] fields, int x, int y, int numStepsOut, char specie)
    {
        int count = 0;
        for(int i = numStepsOut * -1; i <= numStepsOut; i++)
            for(int j = numStepsOut * -1; j <= numStepsOut; j++)
                if(fields[x+i][y+j] == specie)
                    count++;
        return count;
    }

    private int AssessSquare(char[][] fields, int x, int y, int visibility){
        int score = 0;

        for(int i = 0; i <= visibility; i++)
        {
            score += (-1000 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'A');
            score += (100 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'T');
            score += (100 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'H');
            score += (100 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'E');
            score += (50 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'W');
            score += (50 / (i == 0 ? 0.3 : i)) * QtyInRange(fields, x, y, i, 'C');
        }

        return score;
    }

    public Move move(char[][] fields)   {
        int vision = getVisionFieldsCount();
        Move bestMove = Move.STAY;
        int bestMoveScore = AssessSquare(fields, vision, vision, vision - 1);

        for (Move move : Move.values()) {
            int squareScore = AssessSquare(fields, vision + move.getXOffset(), vision + move.getYOffset(), vision - 1);
            if(squareScore > bestMoveScore)
            {
                bestMoveScore = squareScore;
                bestMove = move;
            }

        }
        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities)    {
        return ((getCurrentHp() + this.getStrengthLvl()) / 2) >
                ((enemyAbilities[0] * 3) + enemyAbilities[1]);
    }
}

3

FunkyJack

Hanya untuk iseng, inilah entri lain dengan pendekatan yang sedikit berbeda. Yang ini hanya fokus pada menghindari pertengkaran. Ini sebenarnya bukan strategi yang layak karena dikelilingi oleh musuh di beberapa ronde pertama. 40% kotak ditempati di babak pertama sehingga rata-rata Anda akan berbatasan langsung dengan 3-4 musuh. Tetapi ketika meningkatkan kotak kosong awal menjadi 12,5 kali spesies daripada 2,5 kali spesies itu mendapatkan tingkat kelangsungan hidup rata-rata 98,5%.

package alien;
import planet.Move;

public class FunkyJack extends Alien {
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 4.5f;
        abilities[1] = 1.5f;
        abilities[3] = 4;
    }

    private int QtyInRange(char[][] fields, int x, int y, int numStepsOut, char specie)
    {
        int count = 0;
        for(int i = numStepsOut * -1; i <= numStepsOut; i++)
            for(int j = numStepsOut * -1; j <= numStepsOut; j++)
                if(fields[x+i][y+j] == specie)
                    count++;
        return count;
    }

    private int AssessSquare(char[][] fields, int x, int y, int visibility, int prevScore){
        int score = 0;
        score += -10000 * QtyInRange(fields, x, y, visibility, 'A');                
        if(visibility > 0)
            score = AssessSquare(fields, x, y, visibility - 1, ((score + prevScore) / 5));
        else
            score += prevScore;

        return score;
    }

    public Move move(char[][] fields)   {
        int vision = getVisionFieldsCount();
        Move bestMove = Move.STAY;
        int bestMoveScore = AssessSquare(fields, vision, vision, vision - 1, 0);

        for (Move move : Move.values()) {
            int squareScore = AssessSquare(fields, vision + move.getXOffset(), vision + move.getYOffset(), vision - 1, 0);
            if(squareScore > bestMoveScore)
            {
                bestMoveScore = squareScore;
                bestMove = move;
            }
        }
        return bestMove;
    }

    public boolean wantToFight(int[] enemyAbilities)    {
        return false;
    }
}

1
98,5% sangat besar. Bahkan Predicowards saya hanya mendapatkan tingkat kelangsungan hidup sekitar 65% rata-rata. Ha ha. Sunting: Predicowards saya memiliki filosofi yang sama dengan FunkyJack - menjauh saja. Saya memiliki 10 visi dan 0 statistik pertarungan.
Mark Gabriel

3

LazyBee

Saya mulai mencoba membuat kelas lebah yang pintar yang menggunakan gerakan pola dan penalaran deduktif, tapi kemudian saya mengantuk, jadi saya menamainya LazyBee dan menyebutnya malam. Dia benar-benar tampaknya melakukan cukup baik pada tes saya (rata-rata ~ 1645 dengan alien di github).

package alien;

import planet.Move;
public class LazyBee extends Alien{

    private static final int LIFE = 0;
    private static final int STRENGTH = 1;

    // Ran trials to figure out what stats were doing  best in sims
    // Lazily assumed that:
        // - Defense is negligeble compared to health
        // - Vision doesn't matter if I'm running east all the time
        // - Cleverness will be canceled out because dumb aliens (yum) won't care
            // and smart aliens probably account for it somehow
    public static float DARWINISM = 4.5f;
    public void setAbilityPoints(float[] abilities){
        abilities[LIFE] = DARWINISM;  
        abilities[STRENGTH] = 10f-DARWINISM;  
    }

    // If bananapeel is fine without trying to move cleverly, I probably am too
    public Move move(char[][] fields)
    {
        return Move.EAST; // This was giving me the best score of all arbitrary moves, for some reason
    }

    // inspired by ChooseYourBattles, tried to do some math, not sure if it worked
        // it seemed that Bee was doing better by being more selective
        // not accounting for cleverness because eh
    public boolean wantToFight(int[] enemyAbilities){
        // chance of hit (h) = (1-(1/((50/deflvl)+1)))) = 50/(deflvl+50)
        double my_h = 50.0/(this.getDefenseLvl() + 50), 
                their_h = (50.0 - enemyAbilities[STRENGTH])/50.0;
        // expected damage (d) = h * (strlvl+1)
        double my_d = /* long and thick */ my_h * (this.getStrengthLvl() + 1),
                their_d = their_h * (enemyAbilities[STRENGTH]); 
        // turns to die (t) = currhp / d
        double my_t = (this.getCurrentHp() / their_d),
                their_t = ((enemyAbilities[LIFE] * 5 + 10) / my_d); // Assume they're at full health because eh
        // worth it (w) = i outlast them by a decent number of turns
            // = my_t - their_t > threshold
            // threshold = 4.5
        boolean w = my_t - their_t > 4.5;

        return w;
    }
}

1
Kerja bagus! Saya cukup kagum dengan skor Anda sangat baik dengan arah yang dikodekan dengan keras.
Michael

@Michael Anda tidak tahu betapa terkejutnya saya ketika saya tahu! Saya telah melakukan banyak upaya dalam kode gerakan, kemudian saya menjalankannya melawan HOLD sebagai semacam kelompok kontrol. kemudian saya menyadari bahwa kelompok kontrol sedang menendang, jadi saya mulai bereksperimen dengan nuansa malas yang berbeda!
thefistopher

3

Orang baru

Berusaha untuk melibatkan target "mudah" untuk pertanian awal. Kalau tidak, gerakkan saja secara sporadis.

package alien;

import planet.Move;

public class NewGuy extends Alien {
    private final static byte LIFE=0, STR=1, DEF=2, VIS=3, CLV=4;

    public void setAbilityPoints(float[] abilities) {
        abilities[LIFE] = 5;
        abilities[STR] = 5;
    }

    public Move move(char[][] fields) {
        // Very rudimentary movement pattern. Tries to engage all "easy" peaceful aliens.
        // Programmer got lazy, so he doesn't run away from danger, decreasing his odds of survival.
        // Afterall, if his species dies, that's one fewer specie that humans have to contend with.

        int vision = getVisionFieldsCount(); //count of fields / middle
        char me = fields[vision][vision]; //middle of fields
        for (Move move : Move.values()) {
            for (int i = 1; i <= vision; i++) { //loop through fields in specific direction
                int fieldX = vision + (i * move.getXOffset());
                int fieldY = vision + (i * move.getYOffset());
                char alienType = fields[fieldX][fieldY];

                if (alienType == 'E' || alienType == 'H' || alienType == 'T' || alienType == 'W') {
                    return move;
                }
            }
        }

        return Move.getRandom();
    }

    public boolean wantToFight(int[] enemyAbilities) {
        if (isWhale(enemyAbilities)) {
            return true;
        } else if (isCow(enemyAbilities)) {
            return false; // Cows hit hard!
        } else if (isTurtle(enemyAbilities)) {
            return true;
        } else if (isEagle(enemyAbilities)) {
            return true;
        } else if (isHuman(enemyAbilities)) {
            if (enemyAbilities[STR] < 3) {
                return true;
            }
        }

        return false;
    }

    public boolean isWhale(int[] enemyAbilities) {
        return enemyAbilities[LIFE] == 10 && totalAbilityPoints(enemyAbilities) == 10;
    }

    public boolean isCow(int[] enemyAbilities) {
        return enemyAbilities[STR] == 10 && totalAbilityPoints(enemyAbilities) == 10;
    }

    public boolean isTurtle(int[] enemyAbilities) {
        return enemyAbilities[DEF] == 10 && totalAbilityPoints(enemyAbilities) == 10;
    }

    public boolean isEagle(int[] enemyAbilities) {
        return enemyAbilities[VIS] == 10 && totalAbilityPoints(enemyAbilities) == 10;
    }

    public boolean isHuman(int[] enemyAbilities) {
        return !(isWhale(enemyAbilities) || isCow(enemyAbilities) || isTurtle(enemyAbilities)) && totalAbilityPoints(enemyAbilities) >= 10;
    }

    public int totalAbilityPoints(int[] enemyAbilities) {
        return enemyAbilities[LIFE] + enemyAbilities[STR] + enemyAbilities[DEF] + enemyAbilities[VIS];
    }
}

return true;Garis apung itu tampaknya berlebihan karena elsekondisinya.
Kyle Kanos

@KyleKanos Benar. Masalah ditangani.
FreeAsInBeer

Tes isHuman () Anda tidak terlihat benar. Bukankah itu akan menemukan alien yang telah diratakan juga?
Bukan berarti Charles

@ Charles Kau benar. Sulit (mustahil?) Untuk mengetahui apakah musuh adalah Manusia, atau alien yang naik level karena cara mekanik 'kepintaran' bekerja, dan fakta bahwa kita tidak dapat menentukan kepintaran selama permintaan pertarungan. Bahkan menggunakan beberapa matematika dasar, sangat mungkin dugaan terpelajar tentang apakah itu manusia atau tidak akan tidak akurat. Saya kira saya akan mengubahnya untuk lari dari manusia.
FreeAsInBeer

Tes isSpecie Anda terlihat keren, tetapi bahkan pertarungan mangsa dan tes itu akan segera gagal ...
CommonGuy

2

Menjaga

Stack life, buff buff strength & defense, lalu tinggal diam. Hanya serang jika lawan tampak agresif (didefinisikan strengthlebih besar dari 2):

public class Guard extends Alien{
    public void setAbilityPoints(float[] abilities){
        abilities[0] = 6;  // life
        abilities[1] = 2;  // str
        abilities[2] = 2;  // def
        abilities[3] = 0;  // vis
        abilities[4] = 0;  // clv
    }

    public Move move(char[][] fields){
        return Move.STAY;
    }

    public boolean wantToFight(int[] enemyAbilities){
        return enemyAbilities[1] >= 3;
    }
}

2

Bully Alien

Bully Alien akan berkeliling mengabaikan musuh sampai dia menemukan seseorang yang lemah untuk diajak main-main.

package alien;

import planet.Move;

public class BullyAlien extends Alien {

    @Override
    public void setAbilityPoints(float[] abilities) {
        abilities[0] = 2;
        abilities[1] = 8;
        abilities[2] = 0;
        abilities[3] = 0;
        abilities[4] = 0;
    }

    @Override
    public Move move(char[][] fields) {
        return Move.getRandom();
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        return enemyAbilities[1] < 3;
    }           
}

2
Aww, si alien bully hanya ingin menjadi teman.
user3334871

3
@ user3334871 Lebih seperti: "alien bully hanya ingin memiliki kesalahan sintaks"
Justin

Tidakkah seharusnya mau Bertempur melihat kemampuan musuh?
Ingo Bürk

@ IngoBürk Itu sudah dilakukan pada saat Anda berkomentar
William Barbosa

Pasti butuh waktu terlalu lama untuk menggulir utas. :)
Ingo Bürk

2

BlindBully

Tidak peduli siapa atau apa yang ada di sekitarnya, hanya mencoba untuk memutuskan apakah alien yang dihadapinya saat ini lebih kuat atau lebih lemah dari dirinya sendiri, dan menyerang mereka yang lebih lemah.

package alien;
import planet.Move;
import java.util.Random;

public class BlindBully extends Alien {

    private final int LIFE = 0;
    private final int STRENGTH = 1;
    private final int DEFENSE = 2;
    private final int VISION = 3;
    private final int CLEVERNESS = 4;

    private Random rand = new Random();

    @Override
    public void setAbilityPoints(float[] abilities) {
        abilities[LIFE] = 6;
        abilities[STRENGTH] = 2;
        abilities[DEFENSE] = 2;
        abilities[VISION] = 0;
        abilities[CLEVERNESS] = 0;
    }

    @Override
    public Move move(char[][] fields) {
        // Go west! To meet interesting people, and kill them
        switch (rand.nextInt(3)) {
            case 0:
                return Move.NORTHWEST;
            case 1:
                return Move.SOUTHWEST;
            default:
                return Move.WEST;
        }
    }

    @Override
    public boolean wantToFight(int[] enemyAbilities) {
        int myFightRating = getLifeLvl() + getStrengthLvl() + getDefenseLvl();
        int enemyFightRating = enemyAbilities[LIFE] + enemyAbilities[STRENGTH] + enemyAbilities[DEFENSE];
        return myFightRating >= enemyFightRating;
    }

}

2

SecretWeapon2

package alien;

import planet.Move;

/**
 * Created by Vaibhav on 02/07/14.
 */
public class SecretWeapon2 extends Alien {

   private final static byte LIFE=0, STR=1, DEF=2, VIS=3, CLV=4;

public void setAbilityPoints(float[] abilities) {
    abilities[LIFE] = 3;
    abilities[STR] = 7;
    abilities[DEF] = 0;
    abilities[VIS] = 0;
    abilities[CLV] = 0;
}

public Move move(char[][] fields)   {
     return Move.getRandom();
}

public boolean wantToFight(int[] enemyAbilities)    {

    return enemyAbilities[1] < 4;
  }
}

Jadi ini yang terbaik? haha
justhalf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.