// artillery.cpp, Maggie Johnson
// Description: A simple game with a little physics
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;

const int kNumShells = 10;  // allowed 10 shells per target
const int kMinDist = 200;  // min distance for a target
const int kMaxDist = 900;  // max distance for a target
const double kVelocity = 200.0;  // initial velocity of 200 ft/sec
const double kGravity = 32.2;  // gravity for distance calculation
const double kPi = 3.1415;

// Returns the distance a shot travels given its angle.
int DistanceCalc (double in_angle) {

  double time_in_air;
  // The following calculates how far the shot goes given
  // its angle of projection, velocity, and how long it stays
  // in the air.
  time_in_air = (2.0 * kVelocity * sin(in_angle)) / kGravity;
  return (int) round((kVelocity * cos(in_angle)) * time_in_air);
}

// Get user's angle input and calculates distance where shot lands.
// Returns the distance the shot lands.
int CheckShot() {

  int distance;
  double angle;
  cout << "What angle? " << endl;
  if (!(cin >> angle))
    return -1;

  // Convert to radians.
  angle = (angle * kPi) / 180.0;
  distance =  DistanceCalc(angle);
  return distance;
}

// Generate a random number for the enemy position.
int Initialize() {
  int enemy_position;

  // Initialize random seed.
  srand (time(NULL));

  // Generate random number between kMinDist and kMaxDist
  enemy_position = rand() % kMaxDist + kMinDist;
  cout << "The enemy is " << enemy_position << " feet away!!!" << endl;
  return enemy_position;
}

// This function plays the game
int Fire(int number_killed) {

  int enemy, shots, hit;
  int distance;

  // Initialize variables.
  shots = kNumShells;
  enemy = Initialize();
  distance = 0;
  hit = 0;

  do {
    // Get the distance where shot lands & compare it to enemy position.
    distance = CheckShot();
    // Some error checking on the input.
    if (distance == -1) {
      cout << "Enter numbers only..." << endl;
      cin.clear();
      cin.ignore(10000,'\n');
      continue;
    }
    // Compare the enemy position with the computed distance.
    if (abs(enemy - distance) <= 1) {
      hit = 1;
      number_killed++;
      cout << "You hit him!!!" << endl;
      cout << "It took you " << kNumShells - shots + 1 <<  " shots." << endl;
      cout << "You have killed " <<  number_killed << " enemies." << endl;
    } else {
      shots--;
      if (distance > enemy) {
        cout << "You over shot by " << abs(enemy - distance) << endl;
      } else {
        cout << "You under shot by " << abs(enemy - distance) << endl;
      }
    }
  } while ((shots > 0) && (!(hit)));
  if (shots == 0)
    cout << "You have run out of ammo..." << endl;
  return number_killed;
}

// This shows the introductory screen.
void StartUp() {
  cout <<  "Welcome to Artillery." << endl;
  cout << "You are in the middle of a war and being charged by thousands of enemies." << endl;
  cout << "You have one cannon, which you can shoot at any angle." << endl;
  cout << "You only have " << kNumShells << " cannonballs per target." << endl;
  cout << "Let's begin..." << endl;
}

int main() {
  StartUp();
  int killed = 0;
  char done;

  // The main program loop for playing the game.
  do {
    killed = Fire(killed);
    cout << "I see another one, are you ready? (y/n)  " << endl;
    cin >> done;
  } while (done != 'n');
  cout << "You killed " << killed << " of the enemy." << endl;
}