Одиночная игра Rock Paper Scissors

Вот созданная мной игра RPS. Я просмотрел 4-часовой учебник по C ++ от freecodeacademy и сразу после него создал эту игру. Если у вас есть отзывы или предложения, дайте мне знать. Или, если есть что-то, о чем я должен знать или не должен делать, это было бы здорово.

#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

int rng() {
    srand(time(NULL));  
    return rand() % 3 + 1;
}
int main() {

    cout << "Hello, please enter a username!" << endl;
    string userName;
    cin >> userName;
    cout << userName << " how many rounds of Rock Paper Scissors would you like to play?" << endl;
    int rounds;
    cin >> rounds;
    int preRound = 0;

    int userScore = 0;
    int computerScore = 0;
    int tie = 0;

    while (preRound != rounds) {
        
        cout << "Please make a selection!" << endl;
        cout << "1.) Rock " << endl;
        cout << "2.) Paper " << endl;
        cout << "3.) Scissors " << endl;
        int userChoice;
        cin >> userChoice;
        int computerChoice = rng();
        switch (userChoice) {
        case 1:
            cout << "*You chose Rock*" << endl;
            cout << endl;
            break;
        case 2:
            cout << "*You chose Paper*" << endl;
            cout << endl;
            break;
        case 3:
            cout << "*You chose Scissors*" << endl;
            cout << endl;
            break;
        default:
            cout << "**Invalid choice, please try again!**" << endl;
            cout << endl;
            main();
            break;
        }
        switch (computerChoice) {
        case 1:
            cout << "|The computer chose Rock|" << endl;
            cout << endl;
            break;
        case 2:
            cout << "|The computer chose Paper|" << endl;
            cout << endl;
            break;
        case 3:
            cout << "|The computer chose Scissors|" << endl;
            cout << endl;
            break;
        }
        if (computerChoice == userChoice) {
            cout << "The game results in a tie!" << endl;
            tie++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
        else if (computerChoice == 1 && userChoice == 2) { // 1 = Rock, 2 = Paper, 3 = Scissors
            cout << userName << " wins the game!" << endl;
            userScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
        else if (computerChoice == 3 && userChoice == 1) {
            cout << userName << " wins the game!" << endl;
            userScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
        else if (computerChoice == 2 && userChoice == 3) {
            cout << userName << " wins the game!" << endl;
            userScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }////////////////////////////////////////////////
        else if (computerChoice == 2 && userChoice == 1) {
            cout << "The computer wins!" << endl;
            computerScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
        else if (computerChoice == 1 && userChoice == 3) {
            cout << "The computer wins!" << endl;
            computerScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
        else if (computerChoice == 3 && userChoice == 2) {
            cout << "The computer wins!" << endl;
            computerScore++;
            cout << "Your Score = " << userScore << endl;
            cout << "Computer Score = " << computerScore << endl;
            cout << "ties = " << tie << endl;
            cout << "n";
            preRound++;
        }
    }
    return 0;
}

1 ответ
1

Использовать заголовки стандартной библиотеки C ++

Не используйте заголовки C, такие как <stdlib.h>используйте эквивалентные заголовки C ++, например <cstdlib>. В любом случае вы должны использовать функции библиотеки C ++.

Не полагайтесь на транзитивные включения

Бывает что <iostream> будет включать <string> сам по себе в большинстве реализаций, поэтому вы можете использовать string не включая <string>. Однако не стоит полагаться на это, поскольку это не всегда работает. Включите все заголовки, необходимые для используемых вами компонентов.

Никогда не использовать using namespace std;

Это плохая идея по ряду причин. Видеть эта почта для подробного обсуждения того, почему это так. Вместо этого просто добавьте префикс ко всем именам, которые вы используете, из std пространство имен с std::, так что напишите std::string вместо string, так далее.

Используйте современные средства генерации случайных чисел

rand не особо случайный. Хотя этого может быть достаточно для простой игрушечной игры, вам следует отказаться от этой привычки. Вы тоже делаете это немного неправильно; видеть эта почта для того, что вам нужно знать, если вы звоните srand и rand один за другим несколько раз.

Вместо того, чтобы использовать rand, вам следует использовать инструменты в <random>заголовок. Разделение на генератор и распределение может показаться более трудоемким, но абсолютно необходимо для хорошей реализации случайности.

Не использовать cin >> userName; читать в именах

std::cin будет читать только строки до первого пробела. Это означает, что программа не будет работать, если кто-то укажет свое полное имя. Вместо этого используйте std :: getline который по умолчанию будет читать все символы, пока пользователь не нажмет клавишу ввода.

std::getline(std::cin, userName);

Реорганизуйте код в функции

Цель должна заключаться в том, чтобы каждая функция выполняла одно и то же, и это не должно длиться слишком долго. Нет точного размера функции, которую вам нужно выбрать, вы получите представление о разумном уровне сложности для функции с практикой. На данный момент кроме rng функция, все находится в main функция, что слишком сложно для одной функции.

Я бы посоветовал добавить еще как минимум 2 функции. Можно было бы назвать что-то вроде makeChoice который в основном содержит код, предлагающий пользователю сделать выбор, а также два switch заявления. Вторая функция могла бы быть decideWinner который содержит вложенные операторы if-else.

Не повторяйте код

Ваши вложенные операторы if-else повторяют много кода. Самый яркий пример — preRound++; который выполняется в каждая ветвь. Как только вы это увидите, вы должны вынуть этот оператор из блоков if-else и записать его только один раз.

Есть в основном 3 варианта того, кто выиграет конкретный раунд, а не 7, как вы написали. Это следующие варианты: 1. Ничья, 2. Победа пользователя, 3. Победа компьютера. Обратите внимание, что именно поэтому коды в ветвях 2, 3 и 4 совпадают друг с другом, а также код в ветвях 5, 6 и 7. Если вы сгруппируете эти проверки вместе, код будет выглядеть примерно так:

if (computerChoice == userChoice) {
  // ... Tie
} 
else if ((computerChoice == 1 && userChoice == 2)
      or (computerChoice == 3 && userChoice == 1)
      or (computerChoice == 2 && userChoice == 3)) {
  // ... User wins
}
else {  // nothing to check if code reaches here since computer *must* win :)
  // ... Computer wins 
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *