Member 13109743 Ответов: 1

Использование цикла for для отслеживания сыгранных раундов и сравнения выбора пользователя с компьютером


Предыстория: роль компьютеров определена в классе. Весь ввод/вывод должен происходить внутри основной функции. Кроме того, я прошу прощения за то, что пометил c++98 и 14. Я не знаю, что это за версия.

<pre lang="c++">#include <string>
#include <iostream>
using namespace std;

int ROUNDS;
int USER_CHOICE;
int SCORE;

class ComputersChoice { //Class that contains the random number function for the AI player
    private:
        int randNum = rand() % 5 + 1;
        
    public:
        
        void SetNum(int value) { //Program runs slow for some reason without this parameter and setting it equal to randNum
            randNum = value;
        }
        
        int GetNum() {
            return randNum;
        }  
        
        void printResult() {
        if (randNum == 1) {
            cout <<"The computer chose rock.";
        }
        
        else if (randNum == 2) {
            cout<<"The computer chose paper.";
        }
        
        else if (randNum == 3) {
            cout<<"The computer chose scissors.";
        }
        
        else if (randNum == 4) {
            cout<<"The computer chose lizard.";
        }    
        
        else {
            cout<<"The computer chose spock.";
        }    
            
            
        }       
};

    
int main() {
     
   
   
    //How many rounds does the user want to play?
    cout<<"Do you want to play 3, 5 or 7 rounds?" << endl;
    cin>>ROUNDS;
    
    
    
    switch(ROUNDS) {
        case 3: 
            cout<<"You picked best of 3 rounds."<<endl;
            break;
        case 5: 
            cout<<"You picked best of 5 rounds."<<endl;
            break;
        case 7:
            cout<<"You picked best of 7 rounds."<<endl;
            break;
        default:
            cout<<"Invalid input. Enter 3, 5 or 7."<<endl;
            break;

    
        
}
    //User Input
    cout<<"Enter 1 for rock, 2 for paper, 3 for scissors, 4 for lizard or 5 for spock."<<endl;
    cin>>USER_CHOICE;
    
    switch(USER_CHOICE) {
        case 1:
            cout<<"You chose rock." << endl;;
            break;
        case 2:
            cout<<"You chose paper." << endl;
            break;
        case 3:
            cout<<"You chose scissors." << endl;
            break;
        case 4:
            cout<<"You chose lizard." << endl;
            break;
        case 5:
            cout<<"You chose spock." << endl;
            break;
        default:
            cout<<"Invalid input. Enter 1 for rock, 2 for paper, 3 for scissors, 4 for lizard or 5 for spock." << endl;
            break;
        
        
    }
    
    srand(time(NULL));
    
    //Object creation
    ComputersChoice randomNumber;
    
    //Fetches the random number and prints results accordingly
    randomNumber.GetNum();
    randomNumber.printResult();
    
    

    
    
    
    
    
}


Что я уже пробовал:

С помощью цикла я попытался обернуть весь оператор switch в цикл, поместив цикл снаружи оператора switch выше или ниже и внутри корпусов. Я совершенно теряюсь в том, как сравнить случайное число компьютера с выбором пользователя. Тот факт, что случайное число генерируется в классе, я не знаю, как получить доступ к этому случайному числу.

1 Ответов

Рейтинг:
5

OriginalGriff

Во - первых, вам нужно начать с зацикливания на первом выборе пользователя: если они вводят "недопустимый ввод", то он жалуется, но все равно позволяет им играть-это плохо. Добавьте переменную "допустимая запись" и повторяйте цикл до тех пор, пока не получите ее.

Во-вторых, вам нужен второй цикл для ввода пользователем самой игры. На этот раз вы зацикливаетесь на количестве раундов, выбранных пользователем: 3, 5 или 7.

Я бы сделал это так: абстрагировал код в функции: начните с функции GetRounds:

int GetRounds()
   {
   bool isValid = false;
   int numberRounds = 0;
   while (!isValid)
      {
      cout << "Do you want to play 3, 5 or 7 rounds?" << endl;
      cin >> numberRounds;
      switch(numberRounds) 
         {
         case 3: 
         case 5: 
         case 7:
            isValid = true;
            break;
         default:
            cout << "Invalid input. Enter 3, 5 or 7." << endl;
            break;
         }
      }
   cout<<"You picked best of " << numberRounds << " rounds."<<endl;
   return numberRounds;
   }

Затем вызовите это из вашей основной функции.
Добавьте вторую функцию "PlayRound" - вы можете написать ее сами - и используйте for цикл, чтобы вызвать его количество раз, что пользователь выбрал.
Пусть функция PlayRounds возвращает 1 для выигрыша игрока, -1 для выигрыша компьютера и 0 для ничьей, а затем суммирует каждый результат. В конце концов, положительный итог-это выигрыш игрока за сеанс, отрицательный-победа компьютера.

Начните с этого и посмотрите, как далеко вы продвинетесь.


Member 13109743

Что касается функции PlayRound, то как можно использовать информацию, собранную из GetRounds, поскольку они являются локальными областями? То же самое можно сказать и о сравнении выбора пользователей с выбором компьютеров, поскольку выбор компьютеров находится в классе - как бы я получил к нему доступ?

OriginalGriff

PlayRound не нуждается в доступе к информации из GetRounds: он играет один раунд и возвращает результат.
Внешний мир - в данном случае основная функция-вызывает его столько раз, сколько ему нужно.

Что касается компьютерного класса - создайте экземпляр в Main и передайте его функции PlayRound.

Есть смысл?

Member 13109743

Да, я думаю, что это имеет смысл. Я буду возиться с ним еще больше, я дам тебе знать.

Member 13109743

Я теряюсь, пытаясь понять, как спроектировать петлю.

OriginalGriff

Насколько сложно "спроектировать" цикл for? :смеяться:
Все, что ему нужно, - это число, которое начинается с 1 (или нуля) и позволяет ему циклически повторять количество введенных ими значений...
Подумай об этом!

Member 13109743

Ха. Я знаю, «как» создать цикл for. Я имею в виду, что, будучи абсолютным любителем кодирования, я борюсь с тем, «какие переменные» следует поместить внутрь цикла и в тело цикла for? Я потратил последние 6 с половиной часов на то, чтобы возиться с этим и работать вместе с моими одноклассниками, которые так же плохо умеют кодировать, как и я, и никто не придумал решения, лол. В функции PlayRound я пытаюсь настроить цикл, который отслеживает 3, 5 или 7 раундов (можно ли это сделать с помощью одного цикла for?), А также отслеживает счет (потребуется ли для этого вложенный цикл for? ). Также в PlayRound вы упомянули, что я должен создать экземпляр класса, чтобы сравнивать вводимые пользователями данные на компьютеры.

OriginalGriff

Как я уже сказал, Не делайте этого в функции PlayRound. У него есть одна задача: сыграть один раунд; компьютер против игрока и вернуть результат этого раунда. Точно так же, как у вас есть "умственная функция", которая позволяет вам купить банку напитка в торговом автомате, вы используете эту функцию неоднократно, чтобы купить банку для себя и 4 друзей. "Умственная функция" не знает (или не заботится) о том, сколько банок вы хотите, она просто знает, как купить банку. Вы передаете ему деньги, а он возвращает банку с выпивкой.

Игровой раунд-это то же самое: вы передаете его противнику, он играет раунд, он возвращает результат. Он не знает и не заботится о том, сколько раз вы его вызываете, он каждый раз делает одно и то же.

Попробуйте это сделать: установите цикл в main и вызовите метод внутри него.

Member 13109743

Ах, я все еще не понимаю этого. Я сдал задание как есть, но меня беспокоит, что оно не завершено.

Это самое дальнее, что я получаю в своей петле, прежде чем начать гадать, что делать:
инт PlayRound() {
for (int i = 0; i & lt; ROUNDS; i++) {


}
}

OriginalGriff

Пожалуйста, начните обращать внимание на то, что Вы читаете:
"Как я уже сказал, Не делайте этого в функции PlayRound."
А ты что делаешь? Пытаюсь сделать это в функции PlayRound!
Вернитесь назад, прочтите все это снова и подумайте об этом, вместо того чтобы делать предположения и игнорировать то, что вам говорят! :смеяться:

Member 13109743

Что касается моей частной переменной класса randNum, мой инструктор сказал: "int randNum = rand () % 5 + 1; вот для чего нужен конструктор. Ты не посеял его. Это не работает." Я не понимаю, потому что рэнднум выполняет именно то, что должен.

OriginalGriff

Rand - это "генератор случайных чисел", что означает, что он использует сложный алгоритм для генерации псевдослучайной последовательности чисел. Если вы не" сеете " его, то он всегда генерирует одну и ту же последовательность чисел каждый раз, когда вы используете его - что не очень случайно! Если вы "посеяли" его, то он каждый раз начинается в другой точке последовательности, так что вы получаете более "реалистичную" игру.
Взгляните на документацию для rand:
http://www.cplusplus.com/reference/cstdlib/rand/
Он объясняет и демонстрирует, что нужно сделать, чтобы посеять последовательность.