diff --git a/src/battle/DaniBattleTest.java b/src/battle/DaniBattleTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f43880ae8c01dc218cee2adc8cfaea78e943da13 --- /dev/null +++ b/src/battle/DaniBattleTest.java @@ -0,0 +1,29 @@ +package battle; + +import javax.swing.*; + +import asteroids.Action; +import battle.controllers.EmptyController; +import battle.controllers.FireController; +import battle.controllers.RotateAndShoot; +import battle.controllers.DaniController; +import math.Vector2d; +import utilities.JEasyFrame; + +/** + * Created by simon lucas on 10/06/15. + */ +public class DaniBattleTest { + BattleView view; + + public static void main(String[] args) { + + SimpleBattle battle = new SimpleBattle(); + + BattleController fire1 = new DaniController(); + BattleController fire2 = new DaniController(); + + battle.playGame(fire1, fire2); + } + +} diff --git a/src/battle/controllers/DaniController.java b/src/battle/controllers/DaniController.java new file mode 100644 index 0000000000000000000000000000000000000000..5488ba99c35294d4c04cbe9f33e2edce5dabc8b7 --- /dev/null +++ b/src/battle/controllers/DaniController.java @@ -0,0 +1,200 @@ +package battle.controllers; + +import asteroids.Action; +import asteroids.Controller; +import asteroids.GameState; +import asteroids.GameObject; +import asteroids.Ship; +import battle.BattleController; +import battle.BattleMissile; +import battle.NeuroShip; +import battle.SimpleBattle; +import asteroids.Missile; + +import java.awt.*; +import java.util.ArrayList; +import math.Vector2d; +import java.awt.geom.AffineTransform; + +/** + * Created by simonlucas on 30/05/15. + */ +public class DaniController implements BattleController +{ + + Action action; + Vector2d targetPos; + double viewRadius = 20.0; + double thrustAmt = 1.5; + double rotAmt = 1.5; + int shotWait = 0; + Vector2d posSum; + Vector2d dirSum; + boolean anyMissiles = false; + + public DaniController() + + { + action = new Action(); + targetPos = new Vector2d(0,0); + thrustAmt = 0.5 + Math.random(); + } + + public Action action(GameState game) { + // action.thrust = 2.0; + action.shoot = true; + action.turn = 1; + + return action; + } + + public double angleBetween( Vector2d a, Vector2d b ) + { + return Math.atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y); + } + + public boolean inView( NeuroShip ship, NeuroShip enemy ) + { + Vector2d enemyPos = new Vector2d(enemy.s); + Vector2d thisPos = new Vector2d(ship.s); + double l = enemyPos.dist(thisPos); + Vector2d tp = new Vector2d(); + // Now tell me how to write this in one line in Java with vectors xcxicwerwx + // Porco dio porca madonna tutti gli angeli in colonna + Vector2d d = new Vector2d(ship.d); + d.normalise();; + tp.x = thisPos.x + d.x * l; + tp.y = thisPos.y + d.y * l; + targetPos = tp; + + if( tp.dist(enemyPos) <= viewRadius) + return true; + return false; + } + + ArrayList<Missile> getMissiles(SimpleBattle gstate) + { + ArrayList<GameObject> O = gstate.getObjects(); + ArrayList<Missile> M = new ArrayList<Missile>(); + + for( GameObject go : O ) + { + if( go instanceof Missile ) + { + M.add((Missile)go); + } + } + + return M; + } + + double dot( Vector2d a, Vector2d b ) + { + return a.x*b.x + a.y*b.y; + } + + Vector2d subtract( Vector2d a, Vector2d b ) + { + return new Vector2d(a.x-b.x, a.y-b.y); + } + + Vector2d closestPointOnSegment( Vector2d p, Vector2d a, Vector2d b ) + { + Vector2d v = subtract(b,a); + Vector2d w = subtract(p,a); + + + double d1 = dot(w,v); + if( d1 <= 0.0 ) + return a; + double d2 = dot(v,v); + if( d2 <= d1 ) + return b; + + double t = d1/d2; + return a + v.mul(t); + } + + double distanceToSegment( Vector2d p, Vector2d a, Vector2d b ) + { + return p.dist( closestPointOnSegment(p,a,b) ); + } + + + Vector2d getPerp( Vector2d v ) + { + return new Vector2d(-v.y, v.x); + } + + @Override + public Action getAction(SimpleBattle gstate, int playerId) + { + Action res = new Action(0,0,false); + NeuroShip ship = gstate.getShip(playerId); + NeuroShip enemy = gstate.getShip((playerId == 1)?0:1); + + Vector2d enemyPos = enemy.s; + Vector2d thisPos = ship.s; + Vector2d d = new Vector2d( enemyPos.x - thisPos.x, enemyPos.y - thisPos.y ); + double rot = angleBetween(ship.d, d)*rotAmt; + + ArrayList<Missile> M = getMissiles(gstate); + posSum = new Vector2d(0,0); + dirSum = new Vector2d(0,0); + int c = 0; + for(Missile m : M) + { + posSum.add(m.s); + dirSum.add(m.v); + c++; + } + dirSum.normalise(); + if(c!=0) + { + //System.out.println("Missiles: " + c); + posSum.mul(1.0 / c); + anyMissiles = true; + } + else + { + anyMissiles = false; + } + + if(inView(ship, enemy) && shotWait <= 0) + { + res.shoot = true; + shotWait = 10; + } + else { + res.shoot = false; + } + + res.thrust = thrustAmt; + res.turn = rot; + + shotWait--; + return res; + } + + public void drawCircle( Graphics2D g, Vector2d center, double r ) + { + g.drawOval((int)(center.x - r), (int)(center.y - r), (int)(r*2), (int)(r*2)); + } + + @Override + public void draw( Graphics2D g ) + { + AffineTransform at = g.getTransform(); + + drawCircle(g, this.targetPos, this.viewRadius); + g.setTransform(at); + + if(anyMissiles) + { + drawCircle(g, posSum, 4.0); + int dx = (int)(dirSum.x * 100); + int dy = (int)(dirSum.y * 100); + g.drawLine((int)posSum.x - dx, (int)posSum.y - dy, (int)posSum.x + dx, (int)posSum.y + dy); + } + } +}