Homework 2:

Somebody Set Up Us the Bomb

Overview

In this lab, you will make a simple text-based game about hitting randomly placed targets by shooting

bombs from a cannon. The player will repeatedly enter an angle to ?re the cannon at and an amount of

gunpowder to use; your game will respond with how far away from the target the player’s shot landed. You

will repeatedly ask for an angle and gunpowder amount until the player’s shot lands within 1 meter of the

target. If a shot is too long or short, the player is told how far away the shot was and tries again.

Game Rules

1. The game begins by asking the user to enter a positive integer seed value for the game’s random

number generator. Use this number when creating a default_random_engine variable instead of

random_device. The seed value must be positive before continuing. Use the mt19937 generator

instead of default_random_engin. Example:

int seed;

// input and validate seed, then:

mt19937 engine{ seed };

2. The target is placed at a random distance from 1 to 1000 meters using the random number generator;

the distance can contain decimals. We have only seen how to generate integers in C++, so you will

need to look up how to use uniform_real_distribution<double to generate a decimal number in a

certain range. Tell the user how far away the target is. Print all decimal values using 2 decimal

places.

3. If you generate the distance correctly, your output should match mine in the Sample Output below

when using the same seed value.

4. Ask the player to choose an angle between 0 and 90 degrees, which you must validate. Then

input an amount of gunpowder in kilograms, which must be positive. Both values can be decimal

numbers. Each kg of gunpowder will produce 30 m/s of velocity.

5. The shot’s total distance is calculated, and if the shot is within 1.0 m of the target, the shot is scored

a hit and the player wins. Otherwise the player is told how far short or long of the target the shot

landed, and must try again.

6. The game ends when the player gets a hit.

Physics

Given an initial velocity v and angle of elevation A, the bomb’s initial speed can be broken into vertical and

horizontal components (vy and vx respectively) by the equations vy = v · sin (A) and vx = v · cos (A). There

are two ways to ?nd the bomb’s ?nal position:

1. Using a formula for ?nding the position of a projectile given its initial velocity and angle of elevation,

determine the time it takes for the bomb to return to ground level. (Hint: consider the height or

y-coordinate of the bomb the instant it touches the ground.)

2. Using the vertical component of the initial velocity (vy), determine how long it takes for the e?ect of

gravity to reduce that velocity to zero. This is the time it takes for the bomb to reach the apex of its

arc. Double that amount for the time it takes to return to the ground.

1

Once you have the time it takes for the bomb to hit the ground, you can ?nd how far it travels in the

horizontal direction using the horizontal component of the initial velocity (vx).

Functions

I will strongly recommend but not require that you organize your solution into functions. To best practice

this week’s lessons, you should have a C++ project that

• uses a header ?le to declare functions useful in breaking down your game into smaller parts.

• uses a source ?le with the same name to de?ne/implement those functions.

• uses a ?main.cpp? ?le that #includes your header and writes the ?driver? of the application by calling

the functions you de?ned in the other source ?le.

Try breaking the problem description into discrete abstract tasks:

• maybe a function to get and validate the user’s chosen attack angle?

• maybe a function to get and validate the user’s amount of gunpowder?

• maybe a function to calculate how far a projectile would travel when ?red at a given angle and with

given velocity?

• maybe a function to determine if a particular distance is a ?hit? when compared to a given target

distance?

Notes and Hints

1. The <cmath library has methods for calculating sines and cosines, but they operate on radians and

not degrees.

2. Use g = 9.8 m/sec2

for the vertical acceleration of the bomb, and use π = 3.141592653589793238463 if

you need it.

3. Use double for any decimal numbers instead of float.

4. Having trouble deciding where to start? Try this approach.

(a) Build a program that sets the target’s distance to 500 every time. Ask the user how far the shell

should go, and tell them whether the shot was short, long, or a hit. (Goal: get the ?hit? detection

working.)

(b) Add prompts for the user to enter the angle of elevation and gunpowder amount, without any

error checking. Compute the distance from those inputs. (Goal: get your formulas correct and

applied to the game.)

(c) Repeat the game until the user gets a hit. (Goal: general game ?ow.)

(d) Add error checking for angle and gunpowder.

(e) Add a prompt at the start for the random number generator seed, including error checking. Use

this value to select a random starting distance for the target. This should complete your project.

Sample Output

User input is in italics.

Please enter a positive integer seed value:

0

Please enter a positive integer seed value:

100

2

The target is 671.48m away.

Please enter an angle between 0 and 90 degrees:

91

Please enter an angle between 0 and 90 degrees:

45

Please enter an amount of gunpowder in kilograms:

2

You were 304.51m short.

Please enter an angle between 0 and 90 degrees:

45

Please enter an amount of gunpowder in kilograms:

3

You were 154.20m long.

Please enter an angle between 0 and 90 degrees:

34

Please enter an amount of gunpowder in kilograms:

2.81

It’s a hit!

Deliverables

Turn in the following when the assignment is due:

1. A printed copy of your code, printed from Visual Studio or your IDE when possible. If you

cannot print from your editor, copy your code into Notepad or another program with a ?xed-width

(monospace) font and print from there.

2. A printout of your program’s output using the example input shown above.

3