Java 为坦克游戏实现简单AI(敌人炮塔旋转,射击)

Java 为坦克游戏实现简单AI(敌人炮塔旋转,射击),java,artificial-intelligence,greenfoot,Java,Artificial Intelligence,Greenfoot,因为我希望我的游戏是单人游戏(玩家对COM),我需要一种方法来告诉敌人(COM)该怎么做。现在,我实施了一种方法,使他转向球员和射击时,炮塔我对齐。但这似乎不现实,老实说有点无聊 所以我有了一个想法:为什么不使用人工智能呢? 我想用一些图书馆,因为考虑到我的技术,我认为我自己无法制作一个。我想通过战斗COM1和COM2来训练坦克,并获得生存时间/杀戮的适应点(我不知道选择什么??)。虽然神经网络实际上是数学的,但我知道它们是如何工作的。我希望我的敌人能够左右转动他的炮塔,或者发射(3次输出)。这

因为我希望我的游戏是单人游戏(玩家对COM),我需要一种方法来告诉敌人(COM)该怎么做。现在,我实施了一种方法,使他转向球员和射击时,炮塔我对齐。但这似乎不现实,老实说有点无聊

所以我有了一个想法:为什么不使用人工智能呢? 我想用一些图书馆,因为考虑到我的技术,我认为我自己无法制作一个。我想通过战斗COM1和COM2来训练坦克,并获得生存时间/杀戮的适应点(我不知道选择什么??)。虽然神经网络实际上是数学的,但我知道它们是如何工作的。我希望我的敌人能够左右转动他的炮塔,或者发射(3次输出)。这应该通过输入带有玩家坦克的地图(以及上面的障碍物)来完成。 对于人工智能来说,这听起来是一个不太难的开始。我试着遵循AI教程,但我不知道如何在我的游戏中实现它。另外,这张类似于小地图的敌方坦克概览如何作为输入?对于隐藏层,我应该有多少个神经元

总之: 我需要一个库/简单的可调整代码供初学者使用(可能只有几个或只有一个java类,没有外部资源),两个控制敌人炮塔向左或向右,甚至不转动炮塔和射击/不射击(不一定是学习速度最快的一个)。如何选择输入类型?最简单的人工智能在IntelliJ中工作得非常完美,但它们只是用数字进行计算,而且仍然非常复杂/无法实现任何目的。建议隐藏层中有多少个神经元?建议使用多少隐藏层?我如何让坦克训练,我如何才能保存一些最好的作为演员在每个游戏中创建的新坦克?拯救x一代的某个AITank并为每一个游戏对他进行变异是可能的吗

谢谢你的回答

目前敌人坦克的绿脚代码:

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




导入绿足。*;
导入java.util.List;
公共级GoldTank扩展了EnemyTank
{
私人智力射击冷却时间=200;
公共金库(){
this.tankImage=new GreenfootImage(“Tank_Gold_Base_Idle.png”);
setImage(tankImage);
getImage().标度(35,20);
这个速度=0;
这个.coolDownTime=100;
}
公共无效法{
如果(射击冷却时间>0){
射击冷却--;
}
int rotooffset=(int)calculatecurretrotation()-tarta.getRotation();
if(数学绝对值(旋转偏移)=270){
如果(rotOffset==0){
如果(冷却时间==0){
射击();
射击冷却时间=200;
}
}否则如果(旋转偏移<180&&rotOffset>0 | |旋转偏移<-180){
getTurret().转动(50);
}否则,如果(旋转偏移>180 | |旋转偏移>180&&rotOffset<0){
getTurret().转动(-50);
}
} 
否则{
/** 
*太聪明了。转向正确的扫描方向:等一下?
*/            
如果(旋转偏移<180&&rotOffset>0 | |旋转偏移<-180){
getTurret().转动(15);
}否则,如果(旋转偏移>180 | |旋转偏移>180&&rotOffset<0){
getTurret().转动(-15);
}
}
} 
公共双计算汇率(){
列出playerTanks=getWorld().getObjects(PlayerTank.class);
PlayerTank PlayerTank=playerTanks.get(0);
int px=playerTank.getX();
int py=playerTank.getY();
int tx=getX();
int ty=getY();
双xres=px-tx;
双年轮=py-ty;
双m=(yres/xres);
双结果=(数学atan(m)*360)/(2*数学PI);
双magicNumber;
双xresabs=数学绝对值(xres);
双yresabs=数学型abs(yres);
如果(年>0){
if(xres<0){
magicNumber=180;
结果+=magicNumber;
}
}否则如果(yres<0){
if(xres<0){
magicNumber=180;
结果+=magicNumber;
}否则{
magicNumber=360;
结果+=magicNumber;
}
}
返回结果;
}
公共无效方向移动(整数步数、整数旋转){
int oldRot=getRotation();
设置旋转(旋转);
移动(步);
轮换(奥尔德洛特);
}
}