Внедрите простой ИИ для игры в танки (вращение вражеской башни, стрельба) - PullRequest
1 голос
/ 20 октября 2019

Поскольку я хочу, чтобы моя игра была однопользовательской (игрок против COM), мне нужен способ сказать врагу (COM), что делать. Сейчас я реализовал метод, чтобы он поворачивался к игроку и стрелял, когда турель выровнялась. Но это кажется нереальным и скучно, если честно.

Итак, я пришел к мысли: почему бы не использовать ИИ для этого? Я хочу использовать какую-то библиотеку, так как не думаю, что смогу создать ее самостоятельно, учитывая мои навыки. Я хочу тренировать танки, возможно, борясь с COM1 против COM2 с очками пригодности для выживания времени / убийства (я не знаю, что выбрать ???). Хотя нейронные сети действительно математичны, я понимаю, как они работают. Я хочу, чтобы мой враг мог поворачивать свою башню влево или вправо и / или стрелять (3 выхода). Это должно быть сделано путем ввода карты с танком игрока (и препятствиями на нем). Это звучит как не слишком сложное начало для игры с ИИ. Я пытался следовать учебному пособию по искусственному интеллекту, но я не мог понять, как реализовать это для моей игры. Кроме того, как эта миникарта, как обзор Вражеского танка, будет выглядеть как вход? И сколько нейронов нужно иметь для скрытого слоя?

В заключение: мне нужна библиотека / легко настраиваемый код для начинающих (может быть, даже несколько или только один единственный класс Java без внешних ресурсов) два управляютвражеская турель влево или вправо или даже не поворачивает ее и стреляет / не стреляет (должен быть самым быстрым в обучении)Как бы я выбрал свой тип ввода? Самые простые ИИ работали безупречно в IntelliJ, но они просто вычисляли с помощью чисел и были очень сложными / не применимыми для каких-либо целей. Сколько нейронов в скрытом слое рекомендуется? Сколько скрытых слоев рекомендуется? Как я могу позволить танкам тренироваться и как сохранить некоторые из лучших в качестве приведения новых танков, созданных в каждой игре? Возможно ли сохранить некоторый AITank of Generation x и мутировать его для каждой игры?

Спасибо за любой ответ!

Код в Greenfoot для вражеского танка на данный момент:

import greenfoot.*;
import java.util.List;  
public class GoldTank extends EnemyTank
{
    private int shootCoolDown = 200;
    public GoldTank() {
        this.tankImage = new GreenfootImage("Tank_Gold_Base_Idle.png");
        setImage(tankImage);
        getImage().scale(35,20);
        this.speed = 0;
        this.coolDownTime = 100;
    }
    public void act() {
        if(shootCoolDown > 0) {
            shootCoolDown--;
        }
        int rotOffset = (int)calculateTurretRotation() - turret.getRotation(); 
        if(Math.abs(rotOffset) <= 90 || Math.abs(rotOffset) >= 270) {
            if(rotOffset == 0) {
                if(shootCoolDown == 0) {
                    shoot();
                    shootCoolDown = 200;
                }
            } else if(rotOffset < 180 && rotOffset > 0 || rotOffset < -180) {
                getTurret().turn(50);
            } else if(rotOffset > 180 || rotOffset > -180 && rotOffset < 0) {
                getTurret().turn(-50);
            }
        } 
        else {
            /** 
             * Too smart.. turns in right direction for scanning: JUST WAIT OR SO?
             */            
            if(rotOffset < 180 && rotOffset > 0 || rotOffset < -180) {
                getTurret().turn(15);
            } else if(rotOffset > 180 || rotOffset > -180 && rotOffset < 0) {
                getTurret().turn(-15);
            }
        }
    } 
    public double calculateTurretRotation() {
        List<PlayerTank> playerTanks = getWorld().getObjects(PlayerTank.class);
        PlayerTank playerTank = playerTanks.get(0);
        int px = playerTank.getX();
        int py = playerTank.getY();
        int tx = getX();
        int ty = getY();
        double xres = px-tx;
        double yres = py-ty;
        double m = (yres/xres);
        double result = (Math.atan(m)*360)/(2*Math.PI);
        double magicNumber;
        double xresabs = Math.abs(xres);
        double yresabs = Math.abs(yres);
        if(yres > 0) {
            if(xres < 0){
                magicNumber = 180;
                result += magicNumber;
            }
        } else if(yres < 0){
            if(xres < 0){
                magicNumber = 180;
                result += magicNumber;
            } else {
                magicNumber = 360;
                result += magicNumber; 
            }
        }
        return result;
    }
    public void directionMove(int steps, int rotation) {
        int oldRot = getRotation();
        setRotation(rotation);
        move(steps);
        setRotation(oldRot);
    }
}




...