Help with Spacewar Assignment

My main, immediate concern is that you have a Ship class, and then a Ship2 class, which are basically the same. The point of using a class is that very similar objects can share the same class. Essentially, the class is the blueprint for making one of those objects. If you want to build two identical houses (that differ only in which color the front door is), you don’t need a different set of blueprints for each house.

I ran your code through the cleaner and the Ship2 class vanished.

Ship myShip;
Ship myShip2;
ArrayList<Missile> missiles = new ArrayList();

void setup() {
  size(500, 500);
  myShip = new Ship(width/2, height/2, 0, 0);
  myShip2 = new Ship(width/2, height/2, 0, 1);
}

void draw() {
  background(128);
  // Starfield here.
  // TODO.
  // Move and show missiles.
  updateMissile();
  // Move and show first ship.
  myShip.move();
  myShip.show();
  // move and show second ship.
  myShip2.move();
  myShip2.show();
}

void updateMissile() {
  for (int i = missiles.size()-1; i>= 0; i--) {
    Missile missile = (Missile)missiles.get(i);
    if (missile.offscreen()) {
      missiles.remove(missile);
    } else {
      missile.move();
      missile.show();
    }
  }
}

void keyPressed() {
  // First ship controls.
  if (keyCode == LEFT)  myShip.changeDirX(-1);
  if (keyCode == RIGHT) myShip.changeDirX(1);
  if (keyCode == UP)    myShip.changeDirY(-1);
  if (keyCode == DOWN)  myShip.changeDirY(1);
  if (keyCode == 'L')   myShip.turnAngle(-5);
  if (keyCode == 'R')   myShip.turnAngle(5);
  if (keyCode == ' ')   myShip.shoot();
  // Second ship controls.  
  if (keyCode == 'A')   myShip2.changeDirX(-1);
  if (keyCode == 'D')   myShip2.changeDirX(1);
  if (keyCode == 'W')   myShip2.changeDirY(-1);
  if (keyCode == 'S')   myShip2.changeDirY(1);
  if (keyCode == 'Q')   myShip2.turnAngle(-5);
  if (keyCode == 'E')   myShip2.turnAngle(5);
  if (keyCode == TAB)   myShip2.shoot();
}

// --- MISSILE CLASS

class Missile {
  
  PVector pos = new PVector(0, 0);
  PVector speed = new PVector(0, 0);
  PVector accel = new PVector(0, 0);
  int prop;
  int radio;

  Missile (PVector p, PVector v, PVector a, int r) {
    pos = p;
    speed = v;
    // speed.mult(5);
    accel = a;
    radio = r;
  }

  void move() {
    speed.add(accel);
    pos.add(speed);
  }

  void show() {
    noStroke();
    fill(106, 67, 15);
    ellipse(pos.x, pos.y, radio, radio);
  }

  boolean offscreen() {
    return (pos.x >= width || pos.y >= height || pos.x <= 0 || pos.y <= 0);
  }
  
} // End of Missile class.

// --- SHIP CLASS

class Ship {
  
  PVector pos = new PVector(0, 0);
  PVector speed = new PVector(1, 0);
  int angle = 0;
  int accel;
  int prop = (1);
  int score = 20;
  int relocate;
  int missile;
  int id;

  Ship(int x, int y, int a, int iid) {
    pos.x = x;
    pos.y = y;
    angle = a % 180;
    pos.setMag(width/2);
    id = iid;
  }

  void relocate() {
    pos = PVector.random2D();
    pos.setMag(width/2);
  }

  void show() {
    stroke(0);
    pushMatrix();
    translate(pos.x, pos.y);
    rotate(radians(angle));
    if ( id == 0 ) {
      fill(237, 255, 0);
    } else {
      fill(137, 255, 0);
    }
    rectMode(CENTER);
    triangle(-10, 15, 10, 15, 0, -15);
    rect(0, 0, 35, 10);
    rect(20, 10, 10, 10);
    rect(-20, 10, 10, 10);
    popMatrix();
  }

  void move() {
    speed.limit(4);
    pos.add(speed);
    pos.x = pos.x % width;
    pos.y = pos.y % height;
  }

  void changeDirX(int v) {
    speed.x = speed.x + v;
  }

  void changeDirY(int v) {
    speed.y = speed.y + v;
  }

  void turnAngle(int a) {
    angle = angle + (a % 180) ;
  }

  void shoot() {
    missiles.add(new Missile(pos, speed, speed.div(2), 8));
  }
  
} // End of Ship class.

Also notice that I moved the logic to add a new Missile into the Ship class. Now a Ship can just shoot()! Since the Ship is tracking its position and speed, it can pass that information on to the new Missile without needing GetPosition() and GetSpeed() functions.