Ваши первые три if
утверждения неверны. Если оба игрока не вводят R
, вы выдаете ошибку. Утверждения должны быть переписаны к этому вместо:
if (Player1 != 'R' && Player1 != 'P' && Player1 != 'S')
throw 0;
if (Player2 != 'R' && Player2 != 'P' && Player2 != 'S')
throw 0;
Я бы предложил обернуть входную логику в некоторые вспомогательные функции. А также вы можете очистить и остальные операторы if
.
Попробуйте это:
#include <iostream>
#include <cctype>
using namespace std;
char getInput(const char *prompt)
{
char input;
cout << prompt << ": ";
if (!(cin >> input)) throw 1;
return toupper(input);
}
char getChoice(const char *prompt)
{
cout << prompt;
char choice = getInput(" Enter R, P, or S");
if ((choice != 'R') && (choice != 'P') && (choice != 'S')) throw 2;
return choice;
}
int main(int argc, const char * argv[]) {
char Player1;
char Player2;
cout << "Welcome to Rock Paper Scissors!" << endl;
do {
try {
Player1 = getChoice("Player 1, you're up!");
Player2 = getChoice("Now Player 2, make your move!");
if (Player1 == Player2)
cout << "Tie game!" << endl;
else if (Player1 == 'R')
{
if (Player2 == 'P')
cout << "Paper covers rock, Player 2 wins!" << endl;
else
cout << "Rock breaks scissors, Player 1 wins!" << endl;
}
else if (Player1 == 'P')
{
if (Player2 == 'R')
cout << "Paper covers rock, Player 1 wins!" << endl;
else
cout << "Scissors cut paper, Player 2 wins!" << endl;
}
else {
if (Player2 == 'R')
cout << "Rock breaks scissors, Player 2 wins!" << endl;
else
cout << "Scissors cut paper, Player 1 wins!" << endl;
}
}
catch (int errID) {
cout << "Error: " << errID << endl;
}
}
while (getInput("Do you want to play again? Y/N") == 'Y');
return 0;
}
В качестве альтернативы рассмотрите возможность использования оператора switch
вместо нескольких операторов if
:
#include <iostream>
#include <cctype>
using namespace std;
#define MAKE_USHORT(ch1, ch2) ((static_cast<unsigned short>(ch1) << 8) | static_cast<unsigned short>(ch2))
const char ROCK = 'R';
const char PAPER = 'P';
const char SCISSOR = 'S';
const unsigned short ROCK_ROCK = MAKE_USHORT(ROCK, ROCK);
const unsigned short ROCK_PAPER = MAKE_USHORT(ROCK, PAPER);
const unsigned short ROCK_SCISSOR = MAKE_USHORT(ROCK, SCISSOR);
const unsigned short PAPER_ROCK = MAKE_USHORT(PAPER, ROCK);
const unsigned short PAPER_PAPER = MAKE_USHORT(PAPER, PAPER);
const unsigned short PAPER_SCISSOR = MAKE_USHORT(PAPER, SCISSOR);
const unsigned short SCISSOR_ROCK = MAKE_USHORT(SCISSOR, ROCK);
const unsigned short SCISSOR_PAPER = MAKE_USHORT(SCISSOR, PAPER);
const unsigned short SCISSOR_SCISSOR = MAKE_USHORT(SCISSOR, SCISSOR);
char getInput(const char *prompt)
{
char input;
cout << prompt << ": ";
if (!(cin >> input)) throw 1;
return toupper(input);
}
char getChoice(const char *prompt)
{
cout << prompt;
char choice = getInput(" Enter R, P, or S");
if ((choice != ROCK) && (choice != PAPER) && (choice != SCISSOR)) throw 2;
return choice;
}
unsigned short getChoices()
{
char Player1 = getChoice("Player 1, you're up!");
char Player2 = getChoice("Now Player 2, make your move!");
return MAKE_USHORT(Player1, Player2);
}
int main(int argc, const char * argv[]) {
cout << "Welcome to Rock Paper Scissors!" << endl;
do {
try {
switch (getChoices())
{
case ROCK_ROCK:
case PAPER_PAPER:
case SCISSOR_SCISSOR:
cout << "Tie game!" << endl;
break;
case ROCK_PAPER:
cout << "Paper covers rock, Player 2 wins!" << endl;
break;
case ROCK_SCISSOR:
cout << "Rock breaks scissors, Player 1 wins!" << endl;
case PAPER_ROCK:
cout << "Paper covers rock, Player 1 wins!" << endl;
break;
case PAPER_SCISSOR:
cout << "Scissors cut paper, Player 2 wins!" << endl;
break;
case SCISSOR_ROCK:
cout << "Rock breaks scissors, Player 2 wins!" << endl;
break;
case SCISSOR_PAPER:
cout << "Scissors cut paper, Player 1 wins!" << endl;
break;
}
}
catch (int errID) {
cout << "Error: " << errID << endl;
}
}
while (getInput("Do you want to play again? Y/N") == 'Y');
return 0;
}