public void Restart()
    {
        theGameState = GameStates.GS_USER_INPUT;

        //reset the target's height
        if (theTarget != null && theHill != null)
        {
            Vector3 targetNewPosistion = new Vector3(theHill.transform.position.x, theHill.transform.position.y, theHill.transform.position.z);
            float   hillXRotRadians    = -Mathf.Deg2Rad * theHill.transform.rotation.eulerAngles.x;
            float   distUpHill         = UnityEngine.Random.Range(-1.0f, 1.0f) * HILL_UNSCALED_HALF_WIDTH * theHill.transform.localScale.z;

            //use polar coordinates & the hill's angle to randomly select a distance up the hill for the target
            targetNewPosistion.x += UnityEngine.Random.Range(-HILL_HALF_WIDTH, HILL_HALF_WIDTH) / 2.0f;
            targetNewPosistion.y += distUpHill * Mathf.Sin(hillXRotRadians);
            targetNewPosistion.z += distUpHill * Mathf.Cos(hillXRotRadians);

            /*print("targetNewPosition = " + targetNewPosistion + ", distUpHill = " + distUpHill + " hillXRotRadians = " + hillXRotRadians +
             *    "euler.x = " + theHill.transform.rotation.eulerAngles.x);*/
            theTarget.transform.Translate(targetNewPosistion - theTarget.transform.position);
        }

        //reset the ball
        if (theBall != null)
        {
            theBall.Restart();
        }

        //reset the cannon
        if (theCannon != null)
        {
            theCannon.Restart();
        }
    }
    public void Restart()
    {
        theGameState = GameStates.GS_USER_INPUT;

        //reset the target's height
        if (theTarget != null)
        {
            Vector3 targetNewPosistion = new Vector3(theTarget.transform.position.x, theBall.initPosition.y, theBall.initPosition.z);
            targetNewPosistion.y += UnityEngine.Random.Range(MIN_TARGET_HEIGHT, MAX_TARGET_HEIGHT);
            theTarget.transform.Translate(targetNewPosistion - theTarget.transform.position);
        }

        //reset the ball
        if (theBall != null)
        {
            theBall.Restart();
        }

        //reset the cannon
        if (theCannon != null)
        {
            theCannon.Restart();
        }
    }