Rock, Paper, Scissors. C++
This is a good exercise in doing things in a more data-driven way. This will result in clearer separation of concepts (i.e., game logic) and allow for more customization easily.

So consider (skipping updating the main program):

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
#include &lt;cctype&gt;
#include &lt;set&gt;
#include &lt;map&gt;

enum Choice
{
    Rock = 1,
    Paper = 2,
    Scissors = 3
};

enum class Result
{
    Win,
    Loss,
    Tie
};

const std::set&lt;std::pair&lt;Choice, Choice&gt; &gt; wins =
{
    { Rock, Scissors },
    { Scissors, Paper},
    { Paper, Rock }
};

const std::map&lt;Result, std::string&gt; result_strings = 
{
    { Result::Win, "WIN!" },
    { Result::Loss, "LOSS!" },
    { Result::Tie, "TIE!" }
};

const std::map&lt;char, std::string&gt; play_abbreviations =
{
    { 'r', "Rock" },
    { 'p', "Paper" },
    { 's', "Scissors" }
};

std::string ResultToString(Result result)
{
    // TODO: Decide how to handle the case of input being unrecognized.
    return result_strings[result];
}

std::string DeterminePlay(char playAbbreviation)
{
    // TODO: Decide how to handle the case of input being unrecognized.
    return play_abbreviations[playAbbreviation];
}

Result DetermineResult(Choice playerPlay, Choice computerPlay)
{
    if (playerPlay == computerPlay)
    {
        return Result::Tie;
    }
    else
    {
        return wins.find(std::make_pair(playerPlay, computerPlay)) != wins.cend() ? Result::Win : Result::Loss;
    }
}

int GenerateRandomNumber(int min, int max)
{
    // TODO: Look at &lt;random&gt; to see how this is done better.
    srand(std::time(0));
    return (rand() % max) + min;
}

Choice GenerateComputerPlay()
{
    const int number = GenerateRandomNumber(1, 3);
    return static_cast&lt;Choice&gt;(number);
}


What we did here was that built the logic of who wins into a data structure, which is essentially a directed graph (more precisely, it's a directed 3-cycle). The winner determination now consist of checking whether the input is an arc in our graph; otherwise it's a loss if no such arc exists and a draw if the arc is a self-loop.

Notice also the possibilities you obtain by a having a result_strings: you could put in more "output texts" for a win for instance, so maybe sometimes you'd like to tell the user "WIN!", but other times you could print "GREAT JOB!" or "NICE!"; that'll end up a nightmare from a maintenance and logic point of view if the number of possible strings grows large.