Java 为坦克游戏实现简单AI(敌人炮塔旋转,射击)
因为我希望我的游戏是单人游戏(玩家对COM),我需要一种方法来告诉敌人(COM)该怎么做。现在,我实施了一种方法,使他转向球员和射击时,炮塔我对齐。但这似乎不现实,老实说有点无聊 所以我有了一个想法:为什么不使用人工智能呢? 我想用一些图书馆,因为考虑到我的技术,我认为我自己无法制作一个。我想通过战斗COM1和COM2来训练坦克,并获得生存时间/杀戮的适应点(我不知道选择什么??)。虽然神经网络实际上是数学的,但我知道它们是如何工作的。我希望我的敌人能够左右转动他的炮塔,或者发射(3次输出)。这应该通过输入带有玩家坦克的地图(以及上面的障碍物)来完成。 对于人工智能来说,这听起来是一个不太难的开始。我试着遵循AI教程,但我不知道如何在我的游戏中实现它。另外,这张类似于小地图的敌方坦克概览如何作为输入?对于隐藏层,我应该有多少个神经元 总之: 我需要一个库/简单的可调整代码供初学者使用(可能只有几个或只有一个java类,没有外部资源),两个控制敌人炮塔向左或向右,甚至不转动炮塔和射击/不射击(不一定是学习速度最快的一个)。如何选择输入类型?最简单的人工智能在IntelliJ中工作得非常完美,但它们只是用数字进行计算,而且仍然非常复杂/无法实现任何目的。建议隐藏层中有多少个神经元?建议使用多少隐藏层?我如何让坦克训练,我如何才能保存一些最好的作为演员在每个游戏中创建的新坦克?拯救x一代的某个AITank并为每一个游戏对他进行变异是可能的吗 谢谢你的回答 目前敌人坦克的绿脚代码:Java 为坦克游戏实现简单AI(敌人炮塔旋转,射击),java,artificial-intelligence,greenfoot,Java,Artificial Intelligence,Greenfoot,因为我希望我的游戏是单人游戏(玩家对COM),我需要一种方法来告诉敌人(COM)该怎么做。现在,我实施了一种方法,使他转向球员和射击时,炮塔我对齐。但这似乎不现实,老实说有点无聊 所以我有了一个想法:为什么不使用人工智能呢? 我想用一些图书馆,因为考虑到我的技术,我认为我自己无法制作一个。我想通过战斗COM1和COM2来训练坦克,并获得生存时间/杀戮的适应点(我不知道选择什么??)。虽然神经网络实际上是数学的,但我知道它们是如何工作的。我希望我的敌人能够左右转动他的炮塔,或者发射(3次输出)。这
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();
设置旋转(旋转);
移动(步);
轮换(奥尔德洛特);
}
}