i would have posted this in tutorials but it's off topic so

In this tutorial we will make a game in the output using C++.

Requirements

  1. Basic understanding of C++ so you actually know what you are doing
  2. Repeat first step

How it will work

It is important that you have everything planned out.

Here is how one might plan this game:

  • The user will be prompted to input a number which will be how many tries they can get to guess the number. Number is between 3-10.

  • The minimum tries will be 3 and the maximum is 10. If it goes too low, or too high, it will be constrained in between 3 and 10.

  • The random number will be between 1-10. The user will get points for guessing correctly. They will lose points if they guess wrong.

Declaring some variables

Let's start with some variables, them being tries, points, randNum, guessedCorrectly, guessedTooLow, and guessedTooHigh.

The first three will be of type int. The first will be how many tries they get. The second is how many points they have. The third will be the number to guess. The last three will be of type bool and determine if they guessed correctly, too low, or too high respectively.

#include <iostream> // so we can use std namespace
using namespace std; // so we don't type std:: every time

int tries; // predeclare
int points = 0; // starting with 0 points
bool guessedCorrectly, guessedTooLow, guessedTooHigh; // predeclaring

int main() {
    return 0;
}

Getting input

We will use cin to get input. Here is a quick example on how to use it.

int num;
cout << "Input a number\n";
cin >> num;
cout << "Did you input " << num << "?\nI know you did!\n"

num is predeclared and whatever is inputted, num will contain the number.

>> is the extraction operator. The num variable follows where the extracted data is. There is a better explanation here on both cout and cin, and more.

Getting random numbers

There is a rand function which you can use if you #include <cstdlib>.

It generates an integer between 0 and "RAND_MAX"

A way to get a number in a specific range is modulating (or whatever the verb of modulus is) what is returned by rand.

Here is an example:

int num = rand()%100;
cout << num;

The number is in the range 0-99. So you add +1 so it is in the range 1-100.

int num = rand()%100 + 1;
cout << num;

Much better!

The fun stuff

Prompting user to pick a number between 3-10

With our knowledge of cin we can prompt the user to choose number. I like having it tidy, so it will be in a function that can be called as much as we need to:

int prompt() {
    int timesToPlay;
    cout << "How many times do you want to try? (Number should be between 3 and 10)\n";
    cin >> timesToPlay;
    tries = clamp(timesToPlay, 3, 10);

    for (int i = 1; i <= timesToPlay + 1; i++) {
        play(randNum); // we'll get here don't worry
    }
    return timesToPlay;
}

timesToPlay contains the number which is how many times to play the game. You will notice a clamp function. It is there to constrain the number in between 3-10.

float clamp(float num, float min, float max) {
    if (min > max) {
        throw runtime_error("min must be smaller than max\n");
	return 0;
    }

    if (num < min) {
        return min;
    }
	
    if (num > max) {
        return max;
    }
    return num;
}

Game logic

You may have noticed a play function. This is where the game logic is handled.

void play(int num) {

}

num is the random number they will have to guess.

Next, we will just get their input and check that input. But before we do that you want to make sure they have enough tries in the first place. If they do not, return out of the function. This is known as a guard.

void play(int num) {
    if (tries < 1) {
        cout << "Out of tries.\n";
        return;
    }
    int guess;
    cout << "Guess the number!\n";
    cin >> guess;
}

After that, just check if the guess was too low, or too high, and set guessedTooLow and guessedTooHigh to true for the respective conditions.

void play(int num) {
   if (tries < 1) {
       cout << "Out of tries.\n";
       return;
   }
   int guess;
   cout << "Guess the number!\n";
   cin >> guess;

   if (guess < num) {
       // guessed too low
       guessedCorrectly = false;
       guessedTooLow = true;
       guessedTooHigh = false;
   }
   else if (guess > num) {
       // guessed too high
       guessedCorrectly = false;
       guessedTooHigh = true;
       guessedTooLow = false;
   }
}

If it's not too low or too high, it's a correct guess!

void play(int num) {
   if (tries < 1) {
       cout << "Out of tries.\n";
       return;
   }
   int guess;
   cout << "Guess the number!\n";
   cin >> guess;

   if (guess < num) {
       // guessed too low
       guessedCorrectly = false;
       guessedTooLow = true;
       guessedTooHigh = false;
   }
   else if (guess > num) {
       // guessed too high
       guessedCorrectly = false;
       guessedTooHigh = true;
       guessedTooLow = false;
   }
   else {
       guessedCorrectly = true;
       guessedTooLow = false;
       guessedTooHigh = false;
   }
   tries--; // don't forget to decrement tries!!!
}

When they did not guess correctly, you surely would want to decrement the user's points and tell them they guessed wrong.

Let's add that.

Whilst we are at that, let's also check if they did guess correctly. If so, increment their points and tell them they guessed correctly.

void play(int num) {
   if (tries < 1) {
       cout << "Out of tries.\n";
       return;
   }
   int guess;
   cout << "Guess the number!\n";
   cin >> guess;

   if (guess < num) {
       // guessed too low
       guessedCorrectly = false;
       guessedTooLow = true;
       guessedTooHigh = false;
   }
   else if (guess > num) {
       // guessed too high
       guessedCorrectly = false;
       guessedTooHigh = true;
       guessedTooLow = false;
   }
   else {
       guessedCorrectly = true;
       guessedTooLow = false;
       guessedTooHigh = false;
   }
   tries--; // don't forget to decrement tries!!!

   if (!guessedCorrectly) {
       points--; // decrementing points
       
       if (guessedTooLow) {
           cout << "You guessed too low. -1 point. Points: " << points << "\n";
       }
       else if (guessedTooHigh) {
           cout << "You guessed too high. -1 point. Points: " << points << '\n';
       }
   }
   else { // guessed correctly
       points++;
       cout << "You guessed correctly! +1 point. Points: " << points << '\n';
   }
}

And that is it!

The final product looks more or less like so:

#include <iostream>
#include <cstdlib> // lets us use rand()
using namespace std;

int tries; // predeclare
int points = 0; // starting with 0 points
bool guessedCorrectly, guessedTooLow, guessedTooHigh; // predeclaring


float clamp(float num, float min, float max) {
    if (min > max) {
        throw runtime_error("min must be smaller than max\n");
	return 0;
    }

    if (num < min) {
        return min;
    }
	
    if (num > max) {
        return max;
    }
    return num;
}

void play(int num) {
    if (tries < 1) {
        cout << "Out of tries.\n";
        return;
    }
    int guess;
    cout << "Guess the number!\n";
    cin >> guess;

    if (guess < num) {
        // guessed too low
        guessedCorrectly = false;
        guessedTooLow = true;
        guessedTooHigh = false;
    }
    else if (guess > num) {
        // guessed too high
        guessedCorrectly = false;
        guessedTooHigh = true;
        guessedTooLow = false;
    }
    else {
        guessedCorrectly = true;
        guessedTooLow = false;
        guessedTooHigh = false;
    }
    tries--; // don't forget to decrement tries!!!

    if (!guessedCorrectly) {
        points--; // decrementing points
        
        if (guessedTooLow) {
            cout << "You guessed too low. -1 point. Points: " << points << "\n";
        }
        else if (guessedTooHigh) {
            cout << "You guessed too high. -1 point. Points: " << points << '\n';
        }
    }
    else { // guessed correctly
        points++;
        cout << "You guessed correctly! +1 point. Points: " << points << '\n';
    }
}

int prompt() {
    int timesToPlay;
    cout << "How many times do you want to try? (Number should be between 3 and 10)\n";
    cin >> timesToPlay;
    tries = clamp(timesToPlay, 3, 10);

    for (int i = 1; i <= timesToPlay + 1; i++) {
        play(randNum); // we'll get here don't worry
    }
    return timesToPlay;
}

int main() {
    prompt();
    return 0;
}

Credits

@TheAlphaStigma

He helped out in writing the code, he made the whole part where we use bools to check if guessed correctly, too low or too high, possible.