Skip to content
Snippets Groups Projects
SimpleBattle.java 3.96 KiB
Newer Older
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
package battle;

import asteroids.Action;
import asteroids.GameObject;
import asteroids.Missile;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
import math.Vector2d;
import utilities.JEasyFrame;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed

import java.util.ArrayList;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
import java.awt.*;

import static asteroids.Constants.*;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed

/**
 * Created by simon lucas on 10/06/15.
 * <p>
 * Aim here is to have a simple battle class
 * that enables ships to fish with each other
 * <p>
 * Might start off with just two ships, each with their own types of missile.
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
 */

public class SimpleBattle {

    // play a time limited game with a strict missile budget for
    // each player
    static int nMissiles = 100;
    static int nTicks = 1000;
    static int pointsPerKill = 10;
    static int releaseVelocity = 5;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    static boolean visible = true;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed

    ArrayList<BattleController> controllers;

    ArrayList<GameObject> objects;
    ArrayList<PlayerStats> stats;

    BattleController b1, b2;
    NeuroShip s1, s2;
    BattleController p1, p2;
    BattleView view;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed

    public SimpleBattle(NeuroShip s1, NeuroShip s2) {
        this.objects = new ArrayList<>();
        this.stats = new ArrayList<>();
        this.s1 = s1;
        this.s2 = s2;

        if (visible) {
            view = new BattleView(this);
            new JEasyFrame(view, "battle");
        }
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    }

    public int playGame(BattleController p1, BattleController p2) {
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
        this.p1 = p1;
        this.p2 = p2;

        stats.add(new PlayerStats(0, 0));
        stats.add(new PlayerStats(0, 0));

        int currentTicks = 0;

        while (currentTicks++ < nTicks) {
            update();
        }

        return 0;
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    }

    public void update() {
        // get the actions from each player

        // apply them to each player's ship, taking actions as necessary


        Action a1 = p1.getAction(this, 0);
        Action a2 = p2.getAction(this, 1);

        // now apply them to the ships

        s1.update(a1);
        s2.update(a2);

        // and fire any missiles as necessary
        if (a1.shoot) fireMissile(s1.s, s1.d, 0);
        if (a2.shoot) fireMissile(s2.s, s2.d, 1);

        // here need to add the game objects ...
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
        java.util.List<GameObject> killList = new ArrayList<GameObject>();
        for (GameObject object : objects) {
            object.update();
            if (object.dead()) {
                killList.add(object);
            }
        }

        objects.removeAll(killList);
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
        if (visible) {
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
            sleep();
        }
    }

    public void sleep() {
        try {
            Thread.sleep(delay);
        } catch (Exception e) {
            e.printStackTrace();
        }
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    }

    public void fireMissile(Vector2d s, Vector2d d, int playerId) {
        // need all the usual missile firing code here
        NeuroShip currentShip = playerId == 0 ? s1 : s2;
        PlayerStats stats = this.stats.get(playerId);
        if (stats.nMissiles < nMissiles) {
            Missile m = new Missile(s, new Vector2d(0, 0));
            m.v.add(d, releaseVelocity);
            // make it clear the ship
            m.s.add(m.v, (currentShip.r() + missileRadius) * 1.5 / m.v.mag());
            objects.add(m);
            // System.out.println("Fired: " + m);
            // sounds.fire();
            stats.nMissiles++;
        }
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    }

    public void draw(Graphics2D g) {
        // for (Object ob : objects)

        // System.out.println("In draw(): " + n);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(bg);
        g.fillRect(0, 0, size.width, size.height);
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
        for (GameObject go : objects) {
            go.draw(g);
        }

        s1.draw(g);
        s2.draw(g);
Joseph Walton-Rivers's avatar
Joseph Walton-Rivers committed
    }

    static class PlayerStats {
        int nMissiles;
        int nPoints;

        public PlayerStats(int nMissiles, int nPoints) {
            this.nMissiles = nMissiles;
            this.nPoints = nPoints;
        }

        public String toString() {
            return nMissiles + " : " + nPoints;
        }
    }

}