In a switch case statement, it says "duplicate case value" comes up as an error. Anyone know why?

You can't use || in case branches. Sorry :(
When you use || it does a logical or on them, that says "is rock1 or rock2 or rock3 not a zero?". And the answer is yes, at least one of those is not zero. So rock1 || rock2 || rock3 is true, which is 1. And scissors1 || scissors is also true, which is 1. So you have two case branches for the 1 case.

You should simply use case fallthrough to select multiple conditions:

switch(computer) {
    case rock1: case rock2: case rock3:
        c = 1;
        break;
    case scissors1: case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
    default:
        std::cerr << "INVALID COMPUTER MOVE";
}

Also, I always have a default in my case switches. Sometimes mistakes happen, and we definitely want to know if it doesn't hit any of the case branches. I'm also pretty paranoid about missing else statements, but about half the time it's ok if there's no else.


I am not sure what you doing, but switch statement should look like this

switch(computer) 
{
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}

That switch statement does not do what you think.

Each case defines one value that the value of computer is matched against. Combining several values with logical disjunction to give the value associated with a single case label does not make the corresponding block be entered when the value of computer is equal to any of those values, but rather when it is equal to the result of their logical OR combination. Not very meaningful, indeed.

This is how you could rewrite your switch statement in order to make more sense:

switch(computer) {
    case rock1: // Is it rock1?
    case rock2: // Or perhaps rock2?
    case rock3: // Or maybe rock3?
        c = 1;  // Well, if it's one of the above, do this...
        break;
    case scissors1: // OK, it wasn't. So is it scissors1?
    case scissors2: // Or scissors2?
        c = 3;      // If it's one of the above, do this...
        break;
    case paper: // So is it paper?
        c = 2;
        break;
    default: // Always better to be explicit about this
        break;
}