Поскольку я хочу, чтобы моя игра была однопользовательской (игрок против 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);
}
}