Hayatta Kalma Oyunu - AlienWar


96

AlienWar

Bu oyun uzaylıların üstün ırk olduğu çok kalabalık bir gezegende gerçekleşiyor. Senin görevin kendi uzaylı oluşturmak ve diğerlerini yenmektir.

Pano

2 boyutlu bir tahtadır.
Kartın bir tarafının uzunluğu Math.ceil(sqrt(species * 100 * 2.5))kullanılan kartın = ~% 40'ıdır. Tahta bir gezegen, yani batıdaki haritadan çıkarsanız doğuya geri dönersiniz. Kuzeyde yürürseniz, kendinizi güneyde bulacaksınız.

Yetenekleri

Gezegendeki her türün yetenekleri vardır. İşte buradalar:

Ürün Adı         Fayda 
ömrü HP = lifeLVL * 5 (aldığınız her vuruşta, 0 = ölüde azalır), temel HP = 10
gücü Vuruşlarınız [1 - strengthLVL] hasar aralığında rastgele bir int yapar
savunma Rastgele [0 - (50 / defenseLVL + 1)] aralığında bir int seçin , eğer int == 0 ise bir sonraki saldırıdan sıyrılır
vizyon size verir visionLVL size vizyon etrafında / 2 alanlarını
akıllılık Diğer uzaylılara gönderirken [0 ila akıllılıkLVL / 2]
 aralığında rastgele her yeteneği bulanıklaştırır (arttırır)

Oyun

  • Her gönderimin 100 örneği olacak.
  • Dikkate alındıktan sonra her yabancı toplam 10 yetenek puanı belirleyebilir. Her örnek için farklı noktalar belirleyebilirsiniz.
  • 10 noktadan fazla ayarlarsanız, örnek ölür.
  • Bir oyun 1000 turdan oluşmaktadır. Her turda:
    • Her uzaylı bir hamle yapmak zorunda move(char[] fields). Buna Move.STAY de dahildir.
    • Birkaç uzaylı bir alanda ise, 2 rasgele seçilir:
      • Her ikisi de barış konusunda hemfikirdirlerse (yanlış dönerlerse wantToFight) oldukları yerde kalırlar, yoksa savaşırlar.
      • Bu, sadece bir uzaylı bir alanda kalana ya da hepsi barışa katılıncaya kadar döngüler.
  • Bir uzaylı bir şeyi öldürürse , düşman yeteneklerinin 1 / 5'ini alır . Kazananlar HP, 2 * enemyLifeLVL ile doldurulacak .

  • Kazanan en yetenekli olanıdır (yaşayan uzaylıların yeteneklerinin toplamı).

kavgalar

Her iki uzaylı da "aynı anda" birbirlerine vuracak, bu da diğer uzaylıyı öldürürseniz, bir kez size vurabileceği anlamına gelir.

Atlama: Vurulmadan önce, oyunu kullanarak atağı atlatabilirseniz hesaplar rand.nextInt(50 / defenseLvl + 1) == 0. defenseLvl kaçma becerilerinizi hesaplarken asla 50'den büyük olmayacak (bu nedenle en fazla kaçma şansı% 50'dir).

Vurmak: Eğer saldırıdan kaçmazsanız, vuracaksınız ve HP'niz düşecek rand.nextInt(enemy.getStrengthLvl()) + 1.

Bir yabancı ya da her iki yabancı da öldüğünde, kavga sona erer. Kazanan varsa biri ödülü alır.

Oyun kuralları

  • Her yetenek (temel puan vermeden) için temel seviye 1'dir (temel HP 10'dur).
  • Savaşmak istendiğinde gönderilen değerler yaşam (HP değil!), Güç, savunma ve vizyon düzeyleridir.
  • Savaşmak istendiğinde akıllılık gönderilmez.
  • Tüm kayan sayılar, kullanıldığında / gönderilirken en yakın tam sayıya YUVARLAK, ancak kayan nokta olarak saklanıp artırılacak
  • Maksimum kaçma şansı% 50'dir. Aksi takdirde kavgalar asla sona ermeyebilir.

Av

Sahada zaten 5 tür var. Av olduklarından, istendiğinde savaşmamayı seçtiler.

Balina: lvl 10 hayat kalır   
İnek: lvl 10 gücü Rastgele hareket
Kaplumbağa: lvl 10 defans Güney batı
Eagle: lvl 10 vision Alanları inceliyor, tehlikeyi önlemeye çalışıyor      
İnsan: lvl 10 akıllılık Kuzey doğu

WHaritadaki ilk harfleriyle (yani balina için) temsil edilecekler (Yabancılar A, boşluklu boş alanlar ' ').

Ek Kurallar

  • Yansıma izin verilmez.
  • Diğer yabancılar ile etkileşime girme (instancing vb.) Yasaktır.
  • Dosya veya veri tabanı gibi harici kaynakları yazmak / okumak da yasaktır.
  • Yalnızca Java (sürüm 1.8) gönderimlerine izin verilir (Java oldukça kolaydır ve bu oyun için uzman olmanız gerekmez).
  • Tüm başvurular yabancı sınıfı genişletmeli ve yabancı pakete yerleştirilecektir.
  • 19 Temmuz'da en iyi uzaylıyı kabul edeceğim. O gün saat 12: 00'de bildirilen tüm yabancılar test edilecektir.
  • Zaten çok fazla uzaylı bulunduğundan, kullanıcı başına maksimum 3 başvuru.

Bir uzaylı örneği

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

}

Kontrol programı

Kontrol programının kaynak kodu burada bulunabilir . Şimdi son çalıştırılan tüm yabancılar ile güncellendi.

Final puanları (20.07.2014, 10 oyun ortalaması)

alien.PredicatClaw 1635.4
alien.LazyBee 1618.8
alien.CartographerLongVision Alien 1584.6
alien.ChooseYourBattles 1571.2
alien.Bender 1524.5
alien.HerjanAlien 1507.5
alien.FunkyBob 1473.1
alien.SecretWeapon2 1467.9
alien.PredicatEyes 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.Stone 369.4
alien.Assassin 277.8
yabancı. Predicoward 170.1
av.
alien.Morphling 105.3
alien.Eli 99.6
alien. Savaşçı 69.7
alien.Hunter 56.3
alien.Manager 37.6
alien.OkinawaLife 14.2
av. Balina 10,5
alien.Gamer 4.5
alien.Randomite 0
alien.Guard 0
avcı.Eagle 0
alien.Rogue 0
alien.WeakestLink 0
alien.Fleer 0   
alien.Survivor 0
alien.Sped 0
alien.Junkie 0
alien.Coward 0
alien.CleverAlien 0
avcı.İnsan 0
alien.BlindBully 0
avcı.Turtle 0
alien.AimlessWanderer 0

14
Üç oy, dünyadakiler ne? Ve tek bir olumsuz yorum görmüyorum. Pasif bir şekilde pasif olan insanlar bunun Java ile sınırlı olduğu konusunda sinirlenir mi?
Martin Ender

6
@ m.buettner Olumsuz oyum, Java olan godawfulness sınırlaması (eğer şimdiye kadar yaratılmış en güzel dille sınırlı olsaydı, yine de 1 diliyle sınırlandırmak için yine de düşürürdüm). Düşüşlerin ne için olacağı belli olduğu için yorum eklemeye gerek duymadım.
Gareth

6
Hmmm, burada karışık duygular yaşıyorum
Bay Alien,

5
@ user3334871 17 cevap verildikten sonra kuralların hiçbirini değiştirmeyi düşünmüyorum (ve potansiyel olarak bir düzine insan daha fazla başvuru yapıyor) iyi bir fikir. Burada sadece en az birimiz (varsa) profesyonel oyun tasarımcıları olduğu için, kendi kendine yapılan herhangi bir KotH'nin bazı dengeleyici sorunları olabilir - ancak olası stratejilerin alanını araştırmak hala eğlenceli olsa da (görünüşe göre, cevapları değerlendirerek, (oylar ve yıldızlar), bence pek sorun değil.
Martin Ender

5
@Manu Matematiksel olarak eğimli, tahtanın nasıl sarıldığının tanımı biraz yanıltıcıdır. Onun bir gezegen olduğunu söylüyorsun ve doğuya / batıya sarılmış. Gerçekten de kuzey / güneye sarıldığını gösteren hiçbir şey yok. Aslında, eğer öyleyse, teknik olarak artık bir küre değil, bir torus: kotaku.com/classic-jrpg-worlds-are-actually-donuts-1239882216 . Ayrıca, bir dünya haritasının (kuzey kutbu) üstünden "aşağı" doğru yürürken, altta (güney kutbu) görünmediğini fark ederek de görebilirsiniz. Bu nedenle, Michael'ın önerisi kesinlikle geçerlidir, bence.
Martin Ender

Yanıtlar:


11

PredicatClaw (rawr)

Bu yabancı yabancı seni bütün olarak yutacak (tamam belki seni önce biraz çiğneyebilir) ... tahmin algoritmalarına dayanarak zayıf görünüyorsan.

Kıçlarından daha şiddetli pençelere ve dişlere sahip olan Predicats cinsi.

EDIT: Yeni hedef öncelikleri

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
Lanet olsun! Bu tahminler şiddetli! İkimizin de aynı wantToFightalgoritmaya az çok karar verdik .
James_pic

@James_pic, harika beyinlerin aynı şekilde düşündüğünü görüyorum. : D
Mark Gabriel

27

Yönetici

İşte bir yönetici. Doğal olarak zekâsı 0'dır ve daima güneşin parlamadığı bir yere gitmeye çalışır. Ve tabii ki, sadece zayıflarla savaşacak ve sorunlardan kaçmak için çok iyi:

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, yalnızca intro için. : P
apnorton

6
Bu yorumu her okuduğumda ("emin olmak için") gülmek zorundayım :-D
Matthias


@ 11684 herhangi bir iyi geliştirici, tabii ki biliyor, ama benim durumumda aslında bir yönetici demek istiyorum;)
Ingo Bürk

18

CartographyLongVisionAlien

Bu Alien, kazanma potansiyeli olan bir uzaylı üretme girişimlerimden birinin kalıcı bir performans gösteren bir çeşididir.

Çevresinde dahili bir harita oluşturmak için kullandığı ilk 5x5 vizyona sahiptir ve bu düşmana kaçınma yeteneği kazandırır.

100 turda yaptığım testte, ortalama olarak, diğer tüm uzaylıların önüne gizlice giriyor. (2014/09/07)

GÜNCELLEME GIF itici / çekici alan etkisini gösteren

Oyun kodunu, simülasyonun animasyonlu GIF'lerini oluşturmak için değiştirdim. Burada böyle bir halsizlik görebilirsiniz

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

 }

Av gelecekteki tahminlerini eklemek ve balinaların saldırıya uğramasının muhtemel olmasını sağlamak için güncellendi
Moogie

4
Yuppi! Sonunda, sadece güç ve hayata
güvenmeyen

3
Tutarlı bir performans sergileyen bir uzaylıyı bulmak çok zordu! Diğer en iyi girenlerin çoğu aynı fikirleri takip ediyor: uzaylılardan kaçın, avlarına saldır ve sadece kazanmayı neredeyse garanti ettiğin dövüşleri başlat. Bu yabancı aynı fikirleri izler, ancak daha iyi yabancı kaçınma ile. Bu, en ufak bir avantaj sağlar çünkü kavgayı kaybederseniz daha fazla yetenek kazanmak daha "pahalıdır".
Moogie

Diğer daha egzotik fikirler denedim ama yeterince açık bilgi yok. yani harita boyutu, uzaylı sayısı vb.
Moogie

İyi iş! Ben de bilgi eksikliğinden biraz sıkıldım - geçmişten ek bilgi çıkarmak yaratıcı.
Benny

15

Savaşlarını seç

Bu uzaylı diğer uzaylılardan kaçar, fakat avına doğru koşar (bu uzaylılara doğru gelmeyeceği sürece).

Başlangıç ​​değerlerini seçmeme yardımcı olmak için genetik bir algoritma kullandım. Sonuçlar, erken tabakalardan geçmek için güç ve hayata güvenmemiz gerektiğini gösteriyor. Vizyon daha sonra faydalıdır, ancak bunu kaybolan düşmanlardan alabiliriz.

Sadece rahatça kazanabileceğimizi düşündüğümüz savaşlarla savaşıyoruz - uzaylımızı öldürmek için ne kadar hamle yapacağımızı, düşmanımızı öldürmek için ne kadar harcayacağımızı tahmin ediyoruz ve yalnızca "iki katı" olsak savaşa katılacağız Rakibimiz.

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

Kendi genetik algoritma / üreme programınızı çalıştırmak istiyorsanız, bu amaç için kontrol programının çatallı bir kopyasını aldım .


Bu checkAbilitesOkyöntem üzerindeki kontrolü nasıl atlar ?
FreeAsInBeer

checkAbilitiesOkDizideki yüzerlerin 10.0'a kadar eklendiğini kontrol eder. Bununla birlikte, float değerleri oyun mantığında ints'e yuvarlanır ve Java 0.5 yukarı yuvarlar.
James_pic

Sadece hala 10 puan koyarsa, akıllıca dağıtılırlar.
CommonGuy

1
Aslen benim fikrim olmadığını söylemeliyim - PredicatClaw'dan ödünç aldım
James_pic

1
Çok hoş. Stat sabitlerin benimkinden daha iyidir ve WantToFight'ınız kesinlikle daha akıllıdır, sadece tembeldim. :)
Benny

12

esrarkeş

Bu uzaylı bir şeye bağımlı . Savaşı oldukça iğrenç bir çözümle başlattı.

Düzeltmesi güçlenirken ( fix > 3) kuvvetlice oturmaktan memnundur ve her şeye hazırdır.

Ancak, düzeltmesi yıpranmaya başladığında ( fix <= 3), ne olduğunu anlamaya çalışırken farkedilmeyen bir yönde tökezlemeye başlar. Savaşması istenirse temkinli olur ve sadece kazanabileceğini düşünüyorsa savaşır.

Düzeltmesi bittiğinde, bağımlı olduğu için, kısır döngüyü yeniden başlatması gerekiyor.

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

&& fix > 0Fazlalık nedeniyle kaldırmanın güvenli olduğundan eminim .
Timtech

10

Muz kabuğu

Sadece biraz balinaya ihtiyacı olan insanları gezmeye çalışır. Yenilmek seni daha sağlıklı yapmaz.

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

[0] 'ın sağlıktan ziyade yaşam olduğunu unutmamak da önemlidir, bu yüzden 100 510 HP olacaktır (ya da daha önce alınmış olan zarara bağlı olarak daha az) ama bir uzaylı bu kadar yüksek olur mu bilmiyorum ..
Gigala

@Gigala İyi düşünce, biraz değiştirdim.
Timtech

9

Van Pelt

Jumanji'den avcı. Yaralanmadığı zamanlarda avlanır, ne zaman kaçınır ve ne öldürebileceğinin iyi bir yargıcıdır. Muz kabukları onu susturmaya devam etti, ancak ona yeni numaralar öğretti.

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

}

Muz Kabuğundan uzak durmayı öğrendin, ha? : P
Timtech

8

Okinawa Hayat

Merak etme, ayakta kalan son kişi olacağım.

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

avcı

Ben de kartalın hareketini çaldım, çünkü şimdi diğer uzaylılar dışındaki her şeye gitmek istiyor. Mümkün olduğunca avlanmaya ve çiftleşmeye çalışır ve kazanma şansı iyi olduğu zaman savaşır.

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

9000'in üzerinde!

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

Evet, hile yapmak için açık bir girişimdir, ancak kurallara uymuyor. Eğer alıcılar planet.Specieson yapılırsa, bu boşluk kapanacaktı.


4
Oh hayır! Bir şey unuttuğumu biliyordum ... boşluğu ve + 1'i
kapatacağım

Bu cevabın diğer, eski, şu anda kazanmış olan girişimden daha fazla olumlu oyuna sahip olduğunu biraz hayal kırıklığına uğrattım.
James_pic

7

Kaya

Bence sadece zayıf ve "zeki" insanlara saldırır.

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
Düşmanları kazanma savaşları nedeniyle biraz meraklı almaya başladığında Rock'ın ne kadar iyi kalacağından emin değilim. Yine de iyi görünüyor.
Kyle Kanos

@KyleKanos anlıyorum; Ancak, zeki olmadıkça, çoğu av / uzaylı ile savaşacağımı farz ediyorum. Bu ona da biraz meraklı vermeyecek mi?
Timtech

Şimdi yorumuma bakarken, gerçekten söylemek istediğim şey değildi. Düşmanlar seviyelerle canlanmaya başladığında wantToFightdurumun vermeyeceğini söylemek istedim true; hızlı bir şekilde güçlü bir pasifist olacaksınız.
Kyle Kanos

@KyleKanos Oh, anladım. Onu biraz değiştirdim.
Timtech

6

Morphling

Başka bir isim düşünemedi, bu adam rastgele yeteneklerine 10 puan dağıtıyor. Neredeyse Okinawa Life (çaban için teşekkürler) gibi hareket eder ve onun gücü düşmanın gücünden büyükse savaşmak ister.

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, biliyorsun, haklısın. Kapama parantezleri beni bu zorluğu öldürüyordu (bundan dolayı benimkileri birkaç kez düzenlemek zorunda kaldı). Şimdi anlıyorum ve doğru. Bunu işaret ettiğin için teşekkürler!
user3334871

@ user3334871 senin önerinle test etmeme rağmen, benim geçişim daha iyi kaldı: D
Sikorski

@Sikorski Peki, yardım edebildiğime sevindim, neden daha iyi sonuç alacağından emin değilim, haha.
user3334871

@Sikorski Bence, sadece tüm hareketler tehlikeliyse, en az tehlikeli hareketi yapmaktan ziyade, koymaktan kaçınmanın güvenli olduğu anlamına gelir.
Martin Ender

Ahh, "Farlardaki Geyik" stratejisi, hoşuma gitti.
user3334871

6

Bender "Bükme" Rodriguez

Kod yorumları konusunda oldukça liberaldim. Neler olup bittiğini görmek için onları bağlamda okuyabilirsiniz, ancak aşağıya bazı snippet'ler de ekleyeceğim.

özet

Bu yabancı, cılız İnsanları öldürmenin kolay olduğu ve algılanan gücünüzü şişireceği prensibiyle hareket eder;

Balinalar ve Kartallar da bükülebilir. =)

hareket

Saldırı için ilginç bir şey bulamadıkça batı ya da güneye hareket edin:

  • Hareketi bilinen bir av için, arzu ettiklerini bir sonraki dönüşte oldukları kareye ekliyoruz.
  • Yapmadıklarımız için, arzu ettiklerini bir sonraki dönüşe geçebilecekleri kareler arasında eşit olarak bölüyoruz.
    • Yabancılar, muz kabukları nedeniyle mevcut meydanlarına negatif bir bonus kazandırır.

Yakınlarda ilginç bir şey bulamazsanız, güney, batı veya güneybatının daha umut verici bir seçenek olup olmadığına bakın.

Bir veya iki geçerli yön seçmek, herhangi bir Bender'ın herhangi bir vatandaşıyla karşılaşması olasılığını azaltır ve ana avına bir yön sayacı seçmek, tüm insanları daha hızlı öldürmesine yardım etmelidir.

Muhtemelen daha iyi sonuçlar elde etmek için James_pic'in genetik algoritmasıyla arzu edilen matristeki sayıları değiştirebilirdim , ama nasıl yapılacağını bilmiyorum.

saldırganlık

Bender çoğunlukla avları hedef alır ve onunla oldukça muhafazakardır wantToFight. Gücü 4 yaşını dolduran herkes diğerlerinden ayrı tutulur sürece sen akıllı bir insan uğraşıyoruz düşünüyorum. Akıllı insanlık, bir uzaylıdan sahip olabileceğinden daha fazla Savunma ve Vizyona sahip olarak gösterilir. Bir örnek boyunca Bender'in kendi yetenek istatistiklerine göre ayarlandı, kaplumbağaları ve kartalları öldüren yabancılar için.

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

Arttırılan değişkenin doğrudan karşılaştırılanın olmadığı ve sadece tamsayı taşması sargısı yoluyla sonsuz yinelemeden kaçındığı bir döngü mantık hatası olduğunu fark ettim. Umarım cevabınızı güncellememe yardımcı olabilirsiniz. (simülasyonun zaman zaman duraklatılmasına neden oluyordu)
Moogie

@ Moogie Heh. Yani sadece kazayla iyi mi yapıyordum? Onu yakaladığın için teşekkürler.
Michael

Her şeyi gözden geçirdim ve birkaç sorun daha çözdüm.
Michael

5

Savaşçı

Bu sadece savaşmak isteyen çok basit fikirli bir uzaylı. Düşmanlarını ve çevresini umursamıyor.

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

Artık kendi uzaylıya karşı sınamak için birileri var.


4

Ödlek

Tehlikeden kaçınmak ve saldırıya uğramak durumunda istiflenmiş savunma yapmak için kartalın hareket şeklini temelde çaldım.

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

Eğer hatalıysam düzelt beni, ama her yeteneğin 1 temel noktası olduğu için, koymak vision=1yeterli mi?
justhalf

@justhalf: Kodu kısa okudum, setAbilityPoints1 değerinin üzerine yazıldığını gösteriyor gibi görünüyordu; Olduğu gibi bırakacağım çünkü daha geniş bir vizyon daha fazla görmeme ve tehlikeden kaçınmama izin veriyor, ama yakalama için teşekkürler.
Kyle Kanos,

Ayrıca, math.round her zaman 0.5 değerinde bir araya gelir, böylece tek bir numaranız varsa ekstra bir görüş elde edersiniz
Andreas

@Manu: Kaçaklığı artırmak için vizyon ve savunma değerlerimi değiştirdim.
Kyle Kanos

4

Fleer

PANİK

APOCALYPSE

RUUUUUUUUUUN

AAAAAAAAAAAAAAAAAAAAAAA


Mümkün olduğunda savaşları önler.

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

Buna farklı bir ad vermelisin ... ve kopyaladığın cevaba biraz kredi vermelisin: codegolf.stackexchange.com/a/32787/9498
Justin

2
@ Quincunx Bu bir tesadüf, bunu görmedim ...
stommestack

Üzgünüm, farkettim ki her iki cevap da Eagle’tan. Diğer cevabı sen kopyalamadın, ben yeterince dikkatlice okumadım. Ancak, farklı bir ad uygun olacaktır.
Justin,

1
Adı değiştirildi!
stommestack

2
Rincewind olarak adlandırılmalıdır.
Magus,

4

Predicoward (mırlamak)

(Şimdiye kadar) korku ve baş belasından uzak yaşayan yaşamış bir Predicats cinsi. Yaşam tarzları nedeniyle dövüş içgüdüleri geliştirmediler, ancak algıları olağanüstü.

Onların türü, arkadaşları olan Predicats tarafından yağmalandı.

EDIT: Manhattan Mesafesini Ağırlıklı Mesafeye Değiştirdi

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
İyi görünüyor! Ancak lütfen baskı ifadelerinizi çıkarın, yarışmayı başlattığımda kafam karıştı.
CommonGuy

Oh, baskı bildirimlerini bıraktım mı? Onları daha sonra değiştireceğim. Haha. Ayrıca bu henüz kesin değil. Şu anda, Predicoward berbat. Yabancı kaçırma algoritmaları yakında geliştirilecek. :) EDIT: Basılı ifadeleri sildiğiniz için teşekkürler. : D (Jop?)
Mark Gabriel

EDIT: Predicowards dünkü sinir bozucu, rekabetçi olmayan küçük predikotlar yerine kaçmaktan çok daha iyi. > :)
Mark Gabriel

Diğer bilgiler: Bu benim en sevdiğim Predicat <3
Mark Gabriel

4

Tahminler (miyav)

Düşmanları üzerinde iyi düşünmesini sağlayan benzerlerinden daha keskin bir vizyona sahip olan bir Predicats cinsi.

EDIT: Yeni hedef öncelikleri

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

Kırpma Çember Alien

Süresiz olarak saat yönünde çevreler ve asla savaşmak istemiyor, ekin çemberleri yapmaktan mutlu. Bununla birlikte, gerçekten savaşmak istiyorsan, senden gelen saçmalığı yenecek.

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
Move ile yinelenirseniz bu daha temiz olur.
Charles,

4
Neden her getI()birini değiştirip ibasitçe kaldırmıyorsunuz getI()? Ayrıca değişebilir setI(int i)için this.i = i % 8;, ve sadece bu tek bir yerde kullandığımızdan, sadece her çağrıyı değiştirmek setI(getI() + 1)içini = (i + 1) % 8;
Justin

3

CleverAlien

Zeki uzaylı sadece fikirlerine güveniyor. Rastgele dolaşıyor ve rastgele savaşmaya karar veriyor. Düşmanlarını şanssızlıkla zedeleyebileceğini umuyor. (sözdizimi hatalarım varsa beni affet, ben java adamı değilim)

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? Neden olmasın (tmp == 1) == true ? true : false? ;) (İpucu: Bu aynı şey sadece tmp == 1 ).
Martin Ender

3

düzenbaz

Diğerlerinin dediği gibi, Kartal hareketini bir dereceye kadar kullanıyorum. Kazanan bir yabancı yapmaya çalışmak yerine (En iyi fikirlerim zaten D :) aldı, bazı karaktere sahip bir uzaylı yapmaya karar verdim! Benim uzaylım, yabancı savaşa habersiz olan işe alınmış bir silahtır ve yalnızca bu gezegende, ölüm çubuğu borcunu atlayan pis insanı avlamak içindir. Uzaylım gezegeni insanı arayacak ve insanı öldürmeden izini sürecek. Yanında bir uzaylı göründüğünde, insanı hızlı bir şekilde öldürmeye çalışacak ve bu yeni düşmana karşı "görevinde şansı" ile karşı karşıya gelecek.

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

Kod, insana sıçramam gerektiği fikrine odaklandı. Onu bir kez dövdüğümde, güneye doğru sarılıyorum, kaplumbağayı arayacağım.

EDIT: Oh, ve kaplumbağa olayı hakkında ... uzaylım onlardan hoşlanmıyor, bu yüzden siz tamamen kanlısınız.


Sadece kaplumbağanın üzerine de sıçrayabileceğimi fark ettim. Kim yüksek dodge haydutları sevmiyor?
user3334871

2
Java 8 blok parçası eğer int doğrudan boolean kullanıyor? çünkü makinemde hiç derleme yapmıyor (Java 7). İpucu: humanPresent
Sikorski

Heck biliyorsam, Java deneyimim çoğunlukla senaryolar ve kolej düzeyinde dersler ile sınırlıydı. Sadece karşılaştırmaları yapacağım, yani her şey şeftali gibi. Söylediğin için teşekkürler!
user3334871

Ayrıca, @Sikorski, testlerinizi yapmak için kendi ana veya init fonksiyonunuzu yarattınız mı? Yoksa sadece verilen kod ile yapılabilir mi? Yemin ederim, gerçek bir Java ortamında kodladığımdan bu yana çok uzun zaman geçti, Java kodunu çalıştırma kurallarını unuttum :(
user3334871

sadece OP'nin github linkinde verdiği kodu indirmeyin, başka sınıflar ekleyin ve test etmeye başlayın. Oh, Planet sınıfındaki her yabancı sınıf için giriş eklemek zorunda kalacaksınız.
Sikorski

3

Kaza indi ve hayatta kalmaya çalışıyor. Çoğunlukla çevikliği ve zekasıyla hayatta kalır ve her yarayı sayar, kavga etmeye ya da değmemeye değip değmeyeceğini dikkatlice düşünür. Hayatta kalan kişi avlanmaya başlar ve diğer tüm uzaylıları büyük silahlarıyla uzak tutmaya çalışır, ancak daha cesur hale geldikçe peşlerinden gitmeye başlayabilir. Gerçekten gittiğinde, kiminle yüzleşeceği artık umrunda değil.

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
Bunun for(int ability in enemyAbilities){bir sözdizimi hatası olduğundan eminim - deneyinfor(int ability : enemyAbilities){
Joshua,

3

FunkyBob

İlk öncelik hayatta kalmaktır, aksi halde bir av bulmaya çalışın. Genel yönü en az tehditle veya en fazla avla bulmak için görünür alanı değerlendirir. Test sırasında% 85-90 civarında bir hayatta kalma oranına sahip görünüyor.

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

Sadece tekmeler için, işte biraz farklı bir yaklaşımla başka bir giriş. Bu sadece kavgalardan kaçınmaya odaklanıyor. Bu, ilk turda düşmanlarla çevrili olması nedeniyle gerçekten uygulanabilir bir strateji değil. Karelerin% 40'ı ilk turda yer aldığından, ortalama olarak 3-4 düşmana hemen bitişik olacaksınız. Ancak ilk boş kareleri türlerin 2,5 katı yerine 12,5 katına çıkarırken, türlerin ortalama hayatta kalma oranı% 98,5 olur.

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'i çok büyük. Predicowards'um bile ortalama olarak yaklaşık% 65 oranında hayatta kalma oranına sahip. Haha. Düzenleme: Predicowards'larım FunkyJack ile aynı felsefeye sahiptir - sadece uzak durun. Yine de 10 vizyonum ve 0 dövüş istatistiklerim var.
Mark Gabriel,

3

LazyBee

Desen hareketleri ve tümdengelimsel akıl yürütmeyi kullanan akıllı bir Bee sınıfı oluşturmaya başladım, ama sonra uykum geldi, bu yüzden adını LazyBee olarak değiştirdim ve bir gece olarak adlandırdım. Aslında testlerimde oldukça iyi bir performans sergiliyor (ortalama github'taki yabancılar ile 1645).

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
Harika iş! Sabit kodlanmış bir yönden çok iyi puan almana şaşırdım.
Michael,

@Michael, öğrendiğimde ne kadar şaşırdığımı bilmiyorsun! Hareket koduna çok çaba sarf ettim, ardından HOLD'a karşı bir kontrol grubu olarak koşmaya başladım. sonra kontrol grubunun kıç tekmeleydiğini farkettim, bu yüzden farklı tembel tonları denemeye başladım!
thefistopher

3

Yeni adam

Erken tarım için "kolay" hedefleri tutmaya çalışır. Aksi takdirde, sadece düzensiz hareket edin.

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

Bu kayan return true;çizgi elsedurumdan dolayı gereksiz görünüyor .
Kyle Kanos,

@KyleKanos Doğru. Sorun giderildi.
FreeAsInBeer

isHuman () testiniz pek doğru gözükmüyor. Aynı zamanda seviye atlayan uzaylıları bulamaz mı?
Charles,

@Charles Haklısın. Düşmanın bir İnsan mı yoksa seviyeli bir uzaylı olup olmadığını 'zekâ' mekanik işleyiş biçiminden ve bir dövüş sorgusu sırasında zekâyı belirleyemediğimizden dolayı bulmak zor (imkansız?). Bazı temel matematik kullanıyorsanız bile, bir insanın yanlış olup olmadığına dair eğitimli bir tahmin olması muhtemeldir. Sanırım onu ​​insanlardan kaçması için değiştireceğim.
FreeAsInBeer

İsPecie-testleriniz harika görünüyor, ancak av savaşı ve bu testler yakında başarısız olacak ...
CommonGuy

2

bekçi

Yığın hayatı, tutuş gücü ve savunma, sonra kal. Sadece rakip saldırgan görünüyorsa saldırı ( strength2'den büyük olarak tanımlanır ):

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

Zorba yabancı

Bully Alien, karışacak zayıf birini bulana kadar düşmanları görmezden gelip dolaşacak.

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, kabadayı yabancı sadece arkadaş olmak istiyor.
user3334871

3
@ user3334871 Daha fazla gibi: "kabadayı uzaylı sadece bir sözdizimi hatası yapmak istiyor"
Justin

Dövüş için düşmanın yeteneklerine bakmak istememeli mi?
Ingo Bürk

@ IngoBürk Zaten siz yorum zaman yaptığımız
William Barbosa

O zaman iplikten geçmem uzun zaman aldı. :)
Ingo Bürk

2

BlindBully

Etrafında kimin ya da ne olduğu umrunda değil, sadece şu anda karşı karşıya olduğu uzaylının kendisinden daha güçlü ya da daha zayıf olup olmadığına karar vermeye çalışıyor ve bu zayıflara saldırıyor.

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

Demek en iyisi bu mu? haha
justhalf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.