Trò chơi sinh tồn - AlienWar


96

Người ngoài hành tinh

Trò chơi này diễn ra trong một hành tinh rất đông đúc, nơi người ngoài hành tinh là chủng tộc siêu hạng. Nhiệm vụ của bạn là tạo ra người ngoài hành tinh của riêng bạn và đánh bại tất cả những người khác.

Hội đồng quản trị

Nó là một bảng 2 chiều.
Độ dài của một mặt của bảng là Math.ceil(sqrt(species * 100 * 2.5))= ~ 40% bảng được sử dụng. Bảng là một hành tinh, vì vậy nếu bạn đi ra khỏi bản đồ ở phía tây, bạn sẽ quay trở lại ở phía đông. Nếu bạn đi ra phía bắc, bạn sẽ thấy mình ở phía nam.

Khả năng

Mỗi loài trên hành tinh đều có khả năng. Họ đây rồi:

Tên         Lợi ích 
cuộc sống HP = lifeLVL * 5 (giảm với mỗi lần bạn bắn, 0 = chết), HP cơ bản = 10
sức mạnh Lượt truy cập của bạn gây sát thương int ngẫu nhiên trong phạm vi [1 đến cường lựcLVL]
phòng thủ Chọn ngẫu nhiên int trong phạm vi [0 đến (50 / defenceLVL + 1)], nếu int == 0 thì né đòn tấn công tiếp theo
tầm nhìn Cung cấp cho bạn tầm nhìnLVL / 2 trường xung quanh tầm nhìn của bạn
độ thông minh Làm mờ (tăng) mọi khả năng ngẫu nhiên trong phạm vi [0 đến độ thông minhLVL / 2] khi gửi cho người ngoài hành tinh khác

Tro choi

  • Sẽ có 100 trường hợp của mỗi bài nộp.
  • Sau khi khởi động, mỗi người ngoài hành tinh có thể thiết lập tổng cộng 10 điểm khả năng. Bạn có thể đặt các điểm khác nhau cho mọi trường hợp.
  • Nếu bạn đặt nhiều hơn 10 điểm, trường hợp sẽ chết.
  • Một trò chơi bao gồm 1000 vòng. Mỗi vòng:
    • Mỗi người ngoài hành tinh phải trả lại một di chuyển qua move(char[] fields). Điều này bao gồm Move.STAY.
    • Nếu một số người ngoài hành tinh trên một lĩnh vực, 2 sẽ được chọn ngẫu nhiên:
      • Nếu cả hai đồng ý về hòa bình (trả lại sai trong wantToFight) họ sẽ ở lại nơi họ đang ở, nếu không họ sẽ chiến đấu.
      • Vòng lặp này cho đến khi chỉ có một người ngoài hành tinh ở lại trên một cánh đồng hoặc tất cả đồng ý về hòa bình.
  • Nếu một người ngoài hành tinh giết chết một thứ gì đó, anh ta sẽ có được 1/5 khả năng của kẻ thù . Người chiến thắng HP sẽ được nạp lại với 2 * địchLifeLVL .

  • Người chiến thắng là người có nhiều khả năng nhất (tổng hợp các khả năng của người ngoài hành tinh sống).

Chiến đấu

Cả hai người ngoài hành tinh sẽ đánh nhau "cùng một lúc", điều này có nghĩa là nếu bạn giết người ngoài hành tinh khác, anh ta vẫn có thể đánh bạn một lần.

Tránh né: Trước khi bạn bị tấn công, trò chơi sẽ tính toán nếu bạn có thể né đòn tấn công bằng cách sử dụng rand.nextInt(50 / defenseLvl + 1) == 0. DefenseLvl sẽ không bao giờ lớn hơn 50 khi tính toán kỹ năng né tránh của bạn (do đó cơ hội né tránh tối đa là 50%).

Đánh: Nếu bạn không né đòn, bạn sẽ bị tấn công và HP của bạn sẽ bị giảm rand.nextInt(enemy.getStrengthLvl()) + 1.

Một cuộc chiến kết thúc khi một hoặc cả hai người ngoài hành tinh liên quan đã chết. Người chiến thắng, nếu một người tồn tại, nhận được phần thưởng.

Luật chơi

  • Cấp cơ sở cho mọi khả năng (không đưa ra bất kỳ điểm khả năng nào) là 1 (HP cơ bản là 10).
  • Các giá trị được gửi khi được yêu cầu chiến đấu là sự sống (không phải HP!), Sức mạnh, phòng thủ và tầm nhìn .
  • Khéo léo KHÔNG được gửi khi được yêu cầu chiến đấu.
  • Tất cả các số nổi sẽ được ROUNDED đến số nguyên gần nhất khi sử dụng / gửi chúng, nhưng được lưu trữ và tăng lên dưới dạng float.
  • Cơ hội né tránh tối đa là 50%. Nếu không thì chiến đấu có thể không bao giờ chấm dứt.

Con mồi

Có 5 loài đã có trên cánh đồng. Vì chúng là con mồi, chúng chọn không chiến đấu khi được yêu cầu.

Cá voi: lv 10 đời   
Bò: lv 10 sức mạnh Di chuyển ngẫu nhiên
Rùa: lv 10 phòng thủ tây nam
Eagle: lv 10 Vision Kiểm tra các lĩnh vực, cố gắng tránh nguy hiểm      
Nhân: lv 10 thông minh đông bắc

Chúng sẽ được thể hiện bằng chữ cái đầu tiên (tức là Wcho cá voi) trên bản đồ (Người ngoài hành tinh với A, các trường trống có khoảng trắng ' ').

Quy tắc bổ sung

  • Phản xạ là không được phép.
  • Tương tác (kích hoạt, vv) với người ngoài hành tinh khác là không được phép.
  • Viết / đọc các tài nguyên bên ngoài như tệp hoặc cơ sở dữ liệu cũng không được phép.
  • Chỉ cho phép gửi Java (phiên bản 1.8) (Java khá dễ và bạn không phải là chuyên gia cho trò chơi này).
  • Tất cả các đệ trình phải mở rộng lớp người ngoài hành tinh và sẽ được đặt trong gói người ngoài hành tinh.
  • Tôi sẽ chấp nhận người ngoài hành tinh tốt nhất vào ngày 19 tháng 7. Tất cả người ngoài hành tinh được gửi trước 12:00 UTC ngày hôm đó sẽ được kiểm tra.
  • Tối đa 3 lần gửi cho mỗi người dùng vì đã có rất nhiều người ngoài hành tinh.

Ví dụ về người ngoài hành tinh

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

}

Chương trình điều khiển

Mã nguồn cho chương trình điều khiển có thể được tìm thấy ở đây . Bây giờ được cập nhật với tất cả người ngoài hành tinh bao gồm trong lần chạy mới nhất.

Điểm cuối cùng (20/07/2012, trung bình 10 trận)

người ngoài hành tinh.PredicatClaw 1635.4
người ngoài hành tinh.LazyBee 1618.8
người nước ngoài.CartogologistsLongVisionAlien 1584.6
người ngoài hành tinh.ChooseYourBattles 1571.2
người nước ngoài.Bender 1524.5
người ngoài hành tinh.HerjanAlien 1507.5
người ngoài hành tinh.FunkyBob 1473.1
người ngoài hành tinh.SecretWeapon2 1467.9
người ngoài hành tinh.PredicatEyes 1457.1
người ngoài hành tinh. Hợp nhất Alien 1435.9
người ngoài hành tinh.GentleGiant 1422.4
người ngoài hành tinh.CropCircleAlien 1321.2
người ngoài hành tinh.VanPelt 1312.7
người ngoài hành tinh.NewGuy 1270.4
người ngoài hành tinh.BananaPeel 1162.6
người ngoài hành tinh.Rock 1159.2
người ngoài hành tinh.BullyAlien 1106.3
người ngoài hành tinh.Geoffrey 778.3
người ngoài hành tinh.SecretWeapon 754.9
người ngoài hành tinh.SecretWeapon3 752.9
người ngoài hành tinh.FunkyJack 550.3
người ngoài hành tinh.Stone 369.4
người ngoài hành tinh.Assassin 277.8
người ngoài hành tinh.Predicoward 170.1
con mồi.Cow 155.2
người ngoài hành tinh. Định dạng 105.3
người ngoài hành tinh.Eli 99.6
người ngoài hành tinh.War Warrior 69.7
người ngoài hành tinh.Hunter 56.3
người ngoài hành tinh.Manager 37.6
người ngoài hành tinh.OkinawaLife 14.2
con mồi.Whale 10.5
người ngoài hành tinh.Gamer 4.5
người ngoài hành tinh.Randomite 0
người ngoài hành tinh.Guard 0
con mồi.Eagle 0
người ngoài hành tinh
người ngoài hành tinh.WeakestLink 0
người nước ngoài.Fleer 0   
người nước ngoài.Survivor 0
người nước ngoài.Sped 0
người ngoài hành tinh.Junkie 0
người ngoài hành tinh
người ngoài hành tinh.CleverAlien 0
con mồi.Human 0
người ngoài hành tinh.BlindBully 0
con mồi.Turtle 0
người ngoài hành tinh.AimlessWanderer 0

14
Ba downvote, những gì trên trái đất? Và tôi không thấy một bình luận tiêu cực nào. Có phải những người thụ động tích cực khó chịu rằng điều này bị giới hạn trong Java?
Martin Ender

6
@ m.buettner Downvote của tôi là để giới hạn tính hợp pháp của Java (mặc dù nếu nó bị giới hạn ở ngôn ngữ đẹp nhất từng được tạo ra thì tôi vẫn hạ thấp nó xuống chỉ còn 1 ngôn ngữ). Tôi đã không nhìn thấy điểm khi thêm một bình luận vì rõ ràng những gì các downvote sẽ làm.
Gareth

6
Hmmm, đang có những cảm xúc lẫn lộn ở đây
Ông Alien

5
@ user3334871 Tôi không nghĩ việc thay đổi bất kỳ quy tắc nào sau khi có 17 câu trả lời (và có khả năng hàng tá người khác đang làm bài nộp) là một ý kiến ​​hay. Vì chỉ có ít người trong chúng ta ở đây (nếu có) là nhà thiết kế trò chơi chuyên nghiệp, nên hầu như bất kỳ KotH tự tạo nào cũng có thể có một số vấn đề cân bằng - nhưng nếu khám phá không gian của các chiến lược có thể vẫn còn vui (mà rõ ràng là, đánh giá bằng câu trả lời, upvote và sao), tôi không nghĩ đó là một vấn đề.
Martin Ender

5
@Manu Đối với các toán học nghiêng về mô tả làm thế nào bảng kết thúc là hơi sai lệch. Bạn đang nói đó là một hành tinh và nó bao bọc hướng đông / tây. Không có gì thực sự chỉ ra rằng nó cũng bao bọc phía bắc / nam. Trên thực tế, nếu có, về mặt kỹ thuật, nó không còn là một hình cầu nữa, mà là một hình xuyến: kotaku.com/ classic-jrpg-worlds-are-factual-donut-1239882216 . Bạn cũng có thể thấy rằng bằng cách nhận thấy rằng khi bạn "tắt" đỉnh bản đồ thế giới (cực bắc), bạn sẽ không xuất hiện ở phía dưới (cực nam). Do đó, đề nghị của Michael chắc chắn là hợp lệ, tôi nghĩ vậy.
Martin Ender

Câu trả lời:


11

PreesatClaw (rawr)

Người ngoài hành tinh mèo này sẽ nuốt chửng bạn (không sao, có lẽ cô ấy sẽ nhai bạn trước một chút) ... nếu bạn có vẻ yếu dựa trên thuật toán dự đoán của cô ấy.

Một giống chó săn mồi có móng vuốt và nanh hung dữ hơn so với các đối tác của nó.

EDIT: Ưu tiên mục tiêu mới

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
Chỉ trích! Những dự đoán đó là dữ dội! Tôi lưu ý rằng cả hai chúng tôi đã giải quyết ít nhiều cùng một wantToFightthuật toán.
James_pic

@James_pic, tôi thấy những bộ óc vĩ đại nghĩ giống nhau. : D
Mark Gabriel

27

Giám đốc

Đây là một người quản lý. Đương nhiên, sự thông minh là 0 và anh ta luôn cố gắng đi đến nơi mặt trời không chiếu sáng. Và, tất nhiên, anh ta sẽ chỉ chiến đấu với kẻ yếu và rất giỏi trong việc tránh rắc rối:

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, nếu chỉ cho phần giới thiệu. : P
apnorton

6
Mỗi lần tôi đọc bình luận đó ("chỉ để đảm bảo") tôi phải cười :-D
Matthias

Thật buồn cười, tôi vừa đọc bài này: blog.codinghorror.com/i-shall-call-it-s Somethingmanager
11684

@ 11684 bất kỳ nhà phát triển tử tế nào cũng biết điều đó, tất nhiên, nhưng trong trường hợp của tôi, tôi thực sự có nghĩa là một người quản lý;)
Ingo Bürk

18

Bản đồ họcLongVisionAlien

Người ngoài hành tinh này là một biến thể thực hiện nhất quán của một trong những nỗ lực của tôi để tạo ra một người ngoài hành tinh có tiềm năng chiến thắng.

Nó có tầm nhìn 5x5 ban đầu mà nó sử dụng để xây dựng bản đồ bên trong của khu vực xung quanh mang lại cho nó khả năng tránh kẻ thù vượt trội.

Trong thử nghiệm của tôi về 100 vòng, trung bình, Nó lẻn trước tất cả những người ngoài hành tinh khác. (09/07/2014)

GIF CẬP NHẬT hiển thị hiệu ứng trường repell / thu hút

Tôi đã sửa đổi mã Game để tạo GIF động của mô phỏng. Bạn có thể xem một mô phỏng như vậy ở đây

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

 }

Cập nhật để thêm dự đoán con mồi trong tương lai và đảm bảo rằng cá voi có khả năng bị tấn công
Moogie

4
Yay! Cuối cùng, một người ngoài hành tinh đang chiến thắng, người không chỉ dựa vào sức mạnh và sự sống, mà còn cả tầm nhìn :)
CommonGuy

3
Rất khó để có được một người ngoài hành tinh là một người biểu diễn nhất quán! Những người tham gia hàng đầu khác hầu hết đều theo cùng một ý tưởng: tránh người ngoài hành tinh, tấn công con mồi và chỉ bắt đầu những trận đánh mà bạn gần như được đảm bảo để giành chiến thắng. Người ngoài hành tinh này theo cùng một ý tưởng, nhưng với sự tránh né người ngoài hành tinh tốt hơn. Điều này mang lại cho nó lợi thế nhỏ nhất bởi vì nó "tốn kém" hơn để có được nhiều khả năng hơn nếu bạn thua một trận chiến.
Moogie

Tôi đã cố gắng những ý tưởng kỳ lạ khác nhưng không có đủ thông tin tiếp xúc. tức là kích thước bản đồ, số lượng người ngoài hành tinh, v.v.
Moogie

Bạn đã làm rất tốt! Tôi cũng có một chút thất vọng với việc thiếu thông tin - trích xuất thông tin bổ sung từ quá khứ là sáng tạo.
Benny

15

Chọn trận đấu của bạn

Người ngoài hành tinh này chạy trốn khỏi những người ngoài hành tinh khác, nhưng chạy về phía con mồi (miễn là điều đó sẽ không đưa nó về phía người ngoài hành tinh).

Tôi đã sử dụng một thuật toán di truyền để giúp tôi chọn các giá trị bắt đầu. Kết quả cho thấy chúng ta nên dựa vào sức mạnh và cuộc sống để vượt qua những trận chiến sớm. Tầm nhìn là hữu ích sau này, nhưng chúng ta có thể nhận được điều đó từ những kẻ thù bị diệt.

Chúng tôi chỉ chiến đấu với những trận chiến mà chúng tôi nghĩ rằng chúng tôi có thể chiến thắng một cách thoải mái - chúng tôi ước tính cần bao nhiêu động tác để giết người ngoài hành tinh của chúng tôi, cần bao nhiêu để giết kẻ thù của chúng tôi và chỉ tham gia trận chiến nếu chúng tôi "khó gấp đôi" đối thủ của chúng ta

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

Nếu bạn muốn chạy chương trình nhân giống / thuật toán di truyền của riêng mình, tôi đã có một bản sao của chương trình điều khiển cho mục đích này .


Làm thế nào để bỏ qua việc kiểm tra checkAbilitesOkphương pháp này?
FreeAsInBeer

checkAbilitiesOkkiểm tra xem các float trong mảng thêm tới 10.0. Tuy nhiên, các giá trị float được làm tròn thành ints trong logic trò chơi và Java làm tròn 0,5 lên.
James_pic

@justhalf nó vẫn đặt 10 điểm, chúng chỉ được phân phối thông minh.
CommonGuy

1
Tôi nên nói rằng đó không phải là ý tưởng ban đầu của tôi - tôi đã mượn nó từ PredicatClaw
James_pic

1
Rất đẹp. Các hằng số thống kê của bạn có lẽ tốt hơn của tôi và WantToFight của bạn chắc chắn thông minh hơn, tôi chỉ lười biếng. :)
Benny

12

Junkie

Người ngoài hành tinh này nghiện một cái gì đó . Anh ta bắt đầu cuộc chiến với một bản sửa lỗi khá khó chịu.

Trong khi sửa chữa của anh ấy đang trở nên mạnh mẽ ( fix > 3) anh ấy hài lòng để ngồi trong sự sững sờ của mình và sẵn sàng cho bất cứ điều gì.

Tuy nhiên, một khi bản sửa lỗi của anh ta bắt đầu mòn ( fix <= 3) anh ta bắt đầu loạng choạng đi theo hướng không rõ ràng đang cố gắng tìm hiểu chuyện gì đã xảy ra. Nếu được yêu cầu chiến đấu, anh ta trở nên thận trọng và chỉ chiến đấu nếu anh ta nghĩ mình có thể thắng.

Một khi sửa lỗi của anh ta hết, anh ta là người nghiện, anh ta phải bắt đầu lại vòng luẩn quẩn.

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

Tôi khá chắc chắn rằng nó an toàn để loại bỏ && fix > 0vì dư thừa.
Timtech

10

Vỏ quả chuối

Chỉ cố gắng vấp ngã những người cần một chút đánh đòn. Đánh bại nó sẽ không làm cho bạn khỏe mạnh hơn.

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

Cũng cần lưu ý rằng [0] là sự sống chứ không phải sức khỏe nên 100 sẽ là 510 HP (hoặc ít hơn, tùy thuộc vào thiệt hại đã gây ra) nhưng tôi không biết liệu người ngoài hành tinh có thể tăng cao như vậy không ..
Gigala

@Gigala Suy nghĩ tốt, tôi đã thay đổi nó một chút.
Timtech

9

Van Pelt

Người thợ săn đến từ Jumanji. Anh ta săn bắn khi anh ta không bị thương, tránh khi anh ta và là một thẩm phán đàng hoàng về những gì anh ta có thể giết. Vỏ chuối cứ vấp anh ta, nhưng dạy anh ta một số mánh mới.

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

}

Học cách tránh vỏ chuối, hả? : P
Timtech

8

Cuộc sống Okinawa

Không có gì ngạc nhiên khi tôi là người cuối cùng đứng.

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

thợ săn

Tôi cũng vừa mới đánh cắp chuyển động của đại bàng, ngoại trừ bây giờ anh ta muốn tiến tới mọi thứ bên cạnh những người ngoài hành tinh khác. Cố gắng săn lùng và nuôi càng nhiều con mồi càng tốt, và chỉ chiến đấu khi có vẻ như nó có cơ hội tốt để chiến thắng.

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

Hơn 9000!

package alien;

import planet.Move;

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

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

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

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

Vâng, đó là một nỗ lực trắng trợn để gian lận, nhưng nó ré lên thông qua các quy tắc. Nếu các getters trong planet.Specieđược thực hiện cuối cùng, kẽ hở này sẽ đóng lại.


4
Ôi không! Tôi biết tôi đã quên điều gì đó ... Tôi sẽ đóng kẽ hở và +1;)
CommonGuy

Tôi hơi thất vọng vì câu trả lời này đã có nhiều sự ủng hộ hơn so với mục khác, cũ hơn, hiện đang chiến thắng.
James_pic

7

Đá, hon đa, phiên đa

Tôi nghĩ rằng nó chỉ tấn công những người yếu đuối và "thông minh".

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
Tôi không chắc Rock sẽ tồn tại tốt như thế nào khi kẻ thù của anh ta bắt đầu nhận được một số buff do chiến thắng trong các trận chiến. Có vẻ tốt mặc dù.
Kyle Kanos

@KyleKanos Tôi hiểu; tuy nhiên, tôi cho rằng tôi sẽ chiến đấu với hầu hết con mồi / người ngoài hành tinh, miễn là chúng không thông minh. Điều này sẽ không cho anh ta một số buff quá?
Timtech

Bây giờ nhìn lại nhận xét của tôi, tôi nghĩ rằng nó thực sự không phải là tất cả những gì tôi muốn nói. Tôi muốn nói rằng wantToFightđiều kiện sẽ không được đưa ra truekhi kẻ thù bắt đầu buff theo cấp độ; bạn sẽ nhanh chóng chuyển sang một người theo chủ nghĩa hòa bình mạnh mẽ.
Kyle Kanos

@KyleKanos ơi, tôi hiểu rồi. Tôi đã thay đổi nó một chút.
TimTech

6

Hình thái

Không thể nghĩ ra tên nào khác, anh chàng này phân phối ngẫu nhiên 10 điểm cho khả năng của mình. Hầu như di chuyển như Okinawa Life (thx cho nỗ lực của bạn) và chỉ muốn chiến đấu nếu sức mạnh của anh ta lớn hơn sức mạnh của kẻ thù.

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, bạn biết đấy, bạn nói đúng. Các dấu ngoặc đóng đã giết tôi thử thách này (phải chỉnh sửa tôi một vài lần vì điều đó). Tôi thấy nó bây giờ, và nó là chính xác. Cảm ơn đã chỉ ra rằng!
dùng3334871

@ user3334871 mặc dù tôi đã thử nghiệm với đề xuất của bạn và hình thái của tôi vẫn sống sót tốt hơn: D
Sikorski

@Sikorski Vâng, rất vui vì tôi có thể giúp đỡ, không biết tại sao nó sẽ có giá tốt hơn, haha.
dùng3334871

@Sikorski Tôi đoán rằng điều đó chỉ có nghĩa là ở lại thường an toàn hơn là di chuyển ít nguy hiểm nhất nếu tất cả các động tác đều nguy hiểm.
Martin Ender

Ahh, chiến lược "Hươu trong đèn pha", tôi thích nó.
dùng3334871

6

Bender "uốn" Rodriguez

Tôi đã khá tự do với các bình luận mã. Bạn có thể đọc chúng trong ngữ cảnh để xem những gì đang diễn ra, nhưng tôi cũng sẽ thêm một số đoạn dưới đây.

Tóm lược

Người ngoài hành tinh này hoạt động theo nguyên tắc giết chết con người dễ dàng và thổi phồng sức mạnh nhận thức của bạn, điều này sẽ khiến những người ngoài hành tinh khác sợ hãi.

Cá voi và đại bàng cũng có thể uốn cong. =)

Phong trào

Di chuyển về phía tây hoặc nam trừ khi bạn tìm thấy thứ gì đó thú vị để tấn công:

  • Đối với con mồi có chuyển động được biết đến, chúng tôi thêm tính mong muốn của chúng vào hình vuông mà tại đó chúng sẽ đến lượt tiếp theo.
  • Đối với những người chúng tôi không, chúng tôi chia đều mong muốn của họ cho các ô vuông mà họ có thể chuyển sang lượt tiếp theo.
    • Người ngoài hành tinh nhận được một phần thưởng tiêu cực cho hình vuông hiện tại của họ vì vỏ chuối.

Nếu bạn không tìm thấy bất cứ điều gì thú vị gần đó, hãy hiểu xem phía nam, phía tây hay phía tây nam là một lựa chọn hứa hẹn hơn.

Chọn một hoặc hai hướng phổ biến sẽ làm giảm cơ hội rằng bất kỳ Bender nào được đưa ra sẽ gặp bất kỳ đồng bào nào của anh ta và chọn một hướng truy cập vào con mồi chính của anh ta sẽ giúp anh ta giết chết tất cả con người nhanh hơn.

Tôi có thể có thể điều chỉnh các con số trong ma trận mong muốn bằng thuật toán di truyền của James_pic để có kết quả tốt hơn, nhưng tôi không biết làm thế nào để làm điều đó.

Nhanh nhẹn

Bender chủ yếu nhắm vào con mồi, và khá bảo thủ với nó wantToFight. Bất cứ ai trên Sức mạnh 4 đều xa lánh trừ khi bạn nghĩ rằng bạn đang đối phó với một con người thông minh. Nhân loại thông minh được thể hiện bằng cách có nhiều Phòng thủ và Tầm nhìn hơn người ngoài hành tinh có khả năng có. Nó được điều chỉnh theo một ví dụ theo chỉ số khả năng của chính Bender, để giải thích cho người ngoài hành tinh giết rùa và đại bàng.

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

Tôi nhận thấy rằng có một lỗi logic vòng lặp trong đó biến được tăng không phải là thứ được so sánh trực tiếp và chỉ tránh đệ quy vô hạn bằng phương pháp gói số nguyên. Hy vọng bạn ổn với tôi cập nhật câu trả lời của bạn. (điều này khiến cho việc mô phỏng tạm dừng theo thời gian)
Moogie

@Moogie Heh. Vì vậy, tôi chỉ làm tốt một cách tình cờ? Cảm ơn đã nắm bắt điều đó.
Michael

Tôi đã đi qua tất cả mọi thứ và sửa chữa một vài vấn đề.
Michael

5

Chiến binh

Đây là một người ngoài hành tinh có đầu óc rất đơn giản, chỉ muốn chiến đấu. Anh ta không quan tâm đến kẻ thù cũng như về môi trường xung quanh.

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

Bây giờ bạn có một người để kiểm tra người ngoài hành tinh của bạn chống lại.


4

nhát gan

Về cơ bản, tôi đã đánh cắp mô hình di chuyển của Đại bàng để tránh nguy hiểm và phòng thủ chồng chất trong trường hợp tôi bị tấn công.

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

Chỉnh sửa cho tôi nếu tôi sai, nhưng vì mọi khả năng đều có điểm cơ bản là 1, vision=1nên đặt có đủ không?
justhalf

@justhalf: Việc đọc mã ngắn gọn của tôi dường như cho thấy rằng setAbilityPointsđã viết quá nhiều giá trị của 1, nhưng nhìn sâu hơn tôi nghĩ bạn đã đúng. Tôi sẽ rời bỏ nó vì tầm nhìn lớn hơn cho phép tôi nhìn xa hơn và tránh nguy hiểm, nhưng cảm ơn vì đã nắm bắt được.
Kyle Kanos

Ngoài ra, math.round luôn làm tròn ở mức 0,5, vì vậy bạn sẽ có thêm một tầm nhìn nếu bạn có một số lẻ
Andreas

@Manu: Tôi đã trao đổi các giá trị về tầm nhìn và phòng thủ của mình để cải thiện khả năng chạy trốn.
Kyle Kanos

4

Phi công

HOẢNG LOẠN

TẬN THẾ

RUUUUUUUUUUN

AAAAAAAAAAAAAAAAAAAAAAAAA


Tránh các trận chiến bất cứ khi nào có thể.

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

Bạn nên đặt tên này khác ... và cung cấp một số tín dụng cho câu trả lời bạn đã sao chép từ: codegolf.stackexchange.com/a/32787/9498
Justin

2
@Quincunx Đó là một sự trùng hợp ngẫu nhiên, không thấy điều đó ...
stommestack

Xin lỗi, tôi chỉ nhận ra rằng cả hai câu trả lời sao chép từ Eagle. Bạn đã không sao chép câu trả lời khác, tôi chỉ không đọc đủ cẩn thận. Tuy nhiên, một cái tên khác sẽ phù hợp.
Justin

1
Thay đổi tên!
stommestack

2
Nên được đặt tên là Rincewind.
Magus

4

Dự báo (purr)

Một giống chó tiên đã sống (cho đến nay) vì sợ hãi và tránh xa rắc rối. Do lối sống của họ, họ đã không phát triển bản năng chiến đấu, nhưng nhận thức của họ là đặc biệt.

Loại của họ bị ghê tởm bởi những người dự đoán đồng bào của họ.

EDIT: Thay đổi khoảng cách Manhattan thành khoảng cách thay thế

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
Có vẻ tốt! Nhưng làm ơn lấy ra bản in của bạn, chúng sẽ làm tôi bối rối khi tôi chạy cuộc thi.
CommonGuy

Oh, tôi để lại các báo cáo in? Tôi sẽ thay đổi chúng sau. Haha. Thêm vào đó, đây chưa phải là cuối cùng. Ngay bây giờ, Dự đoán hút. Thuật toán trốn tránh người ngoài hành tinh của anh ta sẽ sớm được cải thiện. :) EDIT: Cảm ơn người đã xóa báo cáo in. : D (Jop?)
Mark Gabriel

EDIT: Dự đoán bây giờ tốt hơn nhiều trong việc chạy trốn hơn là những dự đoán không cạnh tranh nhỏ bé mà họ đã có ngày hôm qua. > :)
Đánh dấu Gabriel

Thông tin bên lề: Đây là Dự đoán yêu thích của tôi <3
Mark Gabriel

4

Dự đoán (meo)

Một giống chó săn mồi có tầm nhìn sắc nét hơn so với các đối tác của nó, cho phép nó cạy lên kẻ thù tốt.

EDIT: Ưu tiên mục tiêu mới

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

Cắt vòng tròn Alien

Vòng tròn theo chiều kim đồng hồ vô tận, và không bao giờ muốn chiến đấu, anh ấy hạnh phúc khi tạo ra những chiếc cirles. Tuy nhiên, nếu bạn thực sự muốn chiến đấu, anh ta sẽ đánh bại bạn.

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
Điều này sẽ sạch hơn nếu bạn lặp qua Move.
Không phải là Charles

4
Tại sao không thay đổi mỗi getI()đến ivà chỉ cần loại bỏ getI()? Bạn cũng có thể thay đổi setI(int i)thành this.i = i % 8;và vì bạn chỉ sử dụng nó ở một nơi đó, chỉ cần thay đổi mỗi cuộc gọi setI(getI() + 1)thànhi = (i + 1) % 8;
Justin

3

Thông minh

Người ngoài hành tinh thông minh chỉ dựa vào trí thông minh của mình. Anh ta ngẫu nhiên đi bộ xung quanh, và ngẫu nhiên quyết định chiến đấu. Anh hy vọng mình có thể vượt qua kẻ thù của mình một cách may mắn. (tha thứ cho tôi nếu tôi có bất kỳ lỗi cú pháp nào, tôi không phải là người java)

package alien;

import planet.Move;

public class CleverAlien extends Alien {

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

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

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

8
tmp == 1 ? true : false? Tại sao không (tmp == 1) == true ? true : false? ;) (Gợi ý: nó giống như chỉ tmp == 1 .)
Martin Ender

3

Giả mạo

Giống như những người khác đã nói, tôi đang sử dụng chuyển động của Đại bàng ở một mức độ nào đó. Thay vì cố gắng tạo ra một người ngoài hành tinh chiến thắng (Ý tưởng tốt nhất của tôi đã được thực hiện D :), tôi quyết định làm người ngoài hành tinh với một số nhân vật! Người ngoài hành tinh của tôi là một khẩu súng được thuê không biết gì về cuộc chiến của người ngoài hành tinh, và chỉ có trên hành tinh này để săn lùng con người bẩn thỉu đã bỏ qua món nợ chết chóc của mình. Người ngoài hành tinh của tôi sẽ tìm kiếm hành tinh cho con người, và tiếp tục lần theo dấu vết của con người mà không giết chết anh ta. Khi một người ngoài hành tinh được nhìn thấy gần anh ta, anh ta sẽ cố gắng nhanh chóng giết chết con người và đối mặt với kẻ thù mới này với "may mắn về phía anh ta" từ nhiệm vụ đã hoàn thành.

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

Mã được tập trung xung quanh ý tưởng rằng tôi nên chạy nước rút về phía con người. Khi tôi đánh bại anh ta, sau đó tôi đi vòng về phía tây nam, nơi tôi sẽ tìm con rùa.

EDIT: Ồ, và về điều rùa ... người ngoài hành tinh của tôi không thích chúng, vì vậy nó hoàn toàn là các bạn.


Chỉ cần nhận ra tôi cũng có thể chạy nước rút về phía con rùa. Ai không thích những trò lừa đảo cao?
dùng3334871

2
đang sử dụng int trực tiếp như boolean trong phần khối của Java 8? bởi vì nó hoàn toàn không biên dịch trên máy của tôi (Java 7). Gợi ý: humanPftime
Sikorski

Heck nếu tôi biết, kinh nghiệm Java của tôi chủ yếu được giới hạn ở các tập lệnh và các lớp cấp đại học. Tôi sẽ chỉ đưa ra những so sánh, chỉ để mọi thứ đều đào hoa. Cảm ơn cho những người đứng đầu lên!
dùng3334871

Ngoài ra, @Sikorski, bạn đã tạo chức năng chính hoặc init của riêng mình để chạy thử nghiệm chưa? Hoặc nó có thể được thực hiện chỉ thông qua mã được cung cấp? Tôi thề, đã quá lâu kể từ khi tôi được mã hóa trong một môi trường Java thực sự, đến nỗi tôi đã quên các quy tắc để thực thi mã Java :(
user3334871

không chỉ tải xuống mã mà OP đã đưa ra trong liên kết github, thêm các lớp khác và bắt đầu thử nghiệm. Ồ, bạn sẽ phải thêm mục nhập cho mỗi lớp người ngoài hành tinh trong lớp Planet.
Sikorski

3

Tai nạn hạ cánh và chỉ cố gắng để sống sót. Sống sót chủ yếu bởi sự nhanh nhẹn và thông minh của nó và đếm từng vết sẹo, xem xét cẩn thận liệu nó có đáng để bắt đầu một cuộc chiến hay không. Người sống sót bắt đầu chỉ săn bắn và cố gắng tránh tất cả những người ngoài hành tinh khác bằng vũ khí lớn của họ nhưng khi nó trở nên táo bạo hơn có thể bắt đầu đuổi theo họ. Khi nó thực sự bắt đầu, nó sẽ không quan tâm ai sẽ đối mặt nữa.

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
Tôi khá chắc chắn đó for(int ability in enemyAbilities){là lỗi cú pháp - hãy thửfor(int ability : enemyAbilities){
Joshua

3

FunkyBob

Ưu tiên hàng đầu là sự sống còn, nếu không sẽ cố gắng tìm một số con mồi. Đánh giá khu vực có thể nhìn thấy để tìm hướng chung với ít mối đe dọa nhất hoặc con mồi nhất. Có vẻ như có tỷ lệ sống sót khoảng 85-90% trong quá trình thử nghiệm của tôi.

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

Chỉ để đá, đây là một mục khác với một cách tiếp cận hơi khác. Điều này chỉ tập trung vào việc tránh đánh nhau. Đây thực sự không phải là một chiến lược khả thi do bị bao vây bởi kẻ thù trong vài vòng đầu tiên. 40% hình vuông được chiếm trong vòng đầu tiên, vì vậy trung bình bạn sẽ ngay lập tức tiếp giáp với 3-4 kẻ thù. Nhưng khi tăng các ô vuông trống ban đầu lên 12,5 lần so với 2,5 lần của loài, nó có tỷ lệ sống trung bình là 98,5%.

package alien;
import planet.Move;

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

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

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

        return score;
    }

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

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

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

1
98,5% là bao la. Ngay cả những người dự đoán của tôi chỉ nhận được tỷ lệ sống trung bình khoảng 65%. Haha. Chỉnh sửa: Dự đoán của tôi có triết lý tương tự như FunkyJack - chỉ cần tránh xa. Tôi có 10 tầm nhìn mặc dù và 0 chỉ số chiến đấu.
Đánh dấu Gabriel

3

LazyBee

Tôi bắt đầu cố gắng tạo ra một lớp Bee thông minh sử dụng các chuyển động theo mô hình và suy luận, nhưng sau đó tôi thấy buồn ngủ, vì vậy tôi đổi tên thành LazyBee và gọi nó là một đêm. Anh ta thực sự có vẻ thực hiện khá tốt trong các bài kiểm tra của tôi (trung bình ~ 1645 với người ngoài hành tinh trên github).

package alien;

import planet.Move;
public class LazyBee extends Alien{

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

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

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

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

        return w;
    }
}

1
Làm tốt lắm Tôi khá ngạc nhiên khi bạn ghi điểm rất tốt với hướng đi được mã hóa cứng.
Michael

@Michael bạn không biết tôi đã ngạc nhiên như thế nào khi tôi phát hiện ra! Tôi đã nỗ lực rất nhiều vào mã chuyển động, sau đó tôi đã chạy nó với GIỮ như một nhóm kiểm soát. sau đó tôi nhận ra nhóm kiểm soát đang đá đít, vì vậy tôi bắt đầu thử nghiệm các sắc thái lười biếng khác nhau!
thefistopher 23/07 '

3

Người mới

Cố gắng tham gia các mục tiêu "dễ dàng" để canh tác sớm. Nếu không, chỉ cần di chuyển lẻ tẻ.

package alien;

import planet.Move;

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

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

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

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

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

        return Move.getRandom();
    }

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

        return false;
    }

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

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

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

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

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

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

return true;Dòng nổi đó dường như thừa thãi do elseđiều kiện.
Kyle Kanos

@KyleKanos Đúng. Vấn đề được giải quyết.
FreeAsInBeer

bài kiểm tra isHuman () của bạn không hoàn toàn đúng. Nó sẽ không tìm thấy người ngoài hành tinh cũng đã san bằng?
Không phải là Charles

@ Charles Bạn nói đúng. Thật khó (không thể?) Để tìm ra kẻ thù là Người hay người ngoài hành tinh được tăng cấp do cách thức hoạt động của cơ chế 'thông minh' và thực tế là chúng ta không thể xác định được sự thông minh trong truy vấn chiến đấu. Ngay cả khi sử dụng một số phép toán cơ bản, rất có thể đó là một phỏng đoán có giáo dục về việc nó có phải là con người hay không sẽ không chính xác. Tôi đoán tôi sẽ thay đổi anh ta để chạy trốn khỏi con người.
FreeAsInBeer

Các bài kiểm tra isSpecie của bạn trông rất tuyệt, nhưng ngay cả con mồi cũng chiến đấu và những bài kiểm tra đó sẽ sớm thất bại ...
CommonGuy

2

Bảo vệ

Chồng cuộc sống, sức mạnh buff và phòng thủ, sau đó ở lại đặt. Chỉ tấn công nếu đối thủ có vẻ hung hăng (được xác định là strengthlớn hơn 2):

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

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

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

2

Người ngoài hành tinh bắt nạt

Bully Alien sẽ đi bộ xung quanh phớt lờ kẻ thù cho đến khi anh ta thấy ai đó yếu đuối để gây rối.

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
À, người ngoài hành tinh bắt nạt chỉ muốn làm bạn.
dùng3334871

3
@ user3334871 Giống như: "người ngoài hành tinh bắt nạt chỉ muốn có lỗi cú pháp"
Justin

Không nên để ToFight nhìn vào khả năng của kẻ thù?
Ingo Bürk

@ IngoBürk Nó đã được thực hiện vào thời điểm bạn nhận xét
William Barbosa

Phải mất quá lâu để cuộn qua các chủ đề. :)
Ingo Bürk

2

BlindBully

Không quan tâm ai hay cái gì xung quanh nó, chỉ cố gắng quyết định xem người ngoài hành tinh mà nó đang đối mặt lúc này mạnh hơn hay yếu hơn chính nó, và tấn công những kẻ yếu hơn.

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

Bí mậtWeapon2

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

Vậy đây là tốt nhất? haha
cần
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.