Slot Machine. Помогите найти ошибку.

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

void lotMachine()
{
    string lot[3];
    int a=0,b=0,c=0;
    string nom;
    cout << "Start game?(yes/no)" <<endl;
    cin >> nom;
    srand(time(0));
    if(nom=="yes"){
    for (int i=0;i<=3;i++)
    {
    int rNum = 1+rand()%3;
    if(rNum==1){
        a++;
        lot[i] = "Monkey";
    }else if(rNum==2){
        b++;
        lot[i] = "Gold";
    }else{
        c++;
        lot[i] = "777";
    }
    cout<<"Your slot numer "<<i+1<<": "<<lot[i]<<"| ";
    }

    if(a>b && a>c || b>a && b>c || c>a && c>b)
    {
        cout<<"JACKPOT!"<<endl;
        cout<<"You winner!"<<endl;
    }
        cout<<"restart?(yes/no)"<<endl;
        string answerYes = "yes";
        string answerNo = "no";
        string userAnswer;
        cin >> userAnswer;
        if(userAnswer==answerYes){
            lotMachine();
        }else{
            cout<<"Goodbye!"<<endl;
        }
    }else{
    cout<<"Goodbye!"<<endl;
    }
}
int main()
{    
    setlocale(0,"russian");
    lotMachine();
    return 0;
    system("pause");
}

Приветствую. Пришла мне в голову идея, написать программу — слот машина. Проще говоря игровой автомат, на 3 ячейки. Взялся, кодил, скомпилировал, исправлял ошибки(как же без них). Появилась проблема, когда уже все компилируется и открывается конечный результат, выдает окошко «Закрыть программу», я думаю программа уходит в бесконечный цикл. Люди добрые, укажите своими пальцами на мои «позорные» ошибки, что я сделал не так? Буду признателен.

(1) Программа не компилится. Не хватает #include <cstdlib>.

(2) При таком условии завершения цикл for (int i=0; i<=3; i++) выполняется 4 раза. Т.е. имеем выход за границу массива в операторе присваивания. Как следствие ты получаешь Segmentation fault. Должно быть for (int i=0; i<3; i++).

(3) За рекурсивный вызов функции (lotMachine()) вместо использования цикла надо расстреливать при большом стечении народа.

(4) Никогда не играл со слот-машиной, но у меня большое подозрение, что условие для джекпота написано неправильно:

Your slot numer 1: Monkey| Your slot numer 2: Gold| Your slot numer 3: Monkey| JACKPOT!
You winner!

(5) В ф-ции main() оператор system("pause") никогда не будет выполняться, поскольку по return 0 ф-ция завершит свою работу.

(6) С точки зрения эффективности, я бы заменил string lot[3]; на const char *lot, поскольку как массив переменная lot по сути не используется.

(7) Достаёт писать полностью yes для продолжения работы программы. Я бы посоветовал использовать функцию getch() из <conio.h> и сделать не продолжение по y, а завершение по n.

(1) Спасибо, понял.
(2) Дурная моя голова, с самого начала изначально было 4 лота, но потом я решил уменьшить их до 3. При этом не уменьшив итерации цикла на 1. Благодарю.
(3) Не понял, как понять?
(4) Возможно, перепроверю свое условие.
(5) По случайности поменял местами. Я не внимателен :)
(6) Разве? По моим расчетам, которые на листочке, алгоритм выполняется 3 раза(если 3 лота), и каждое рандомное число проверяется условием, и в массив lot[i], где i — номер лота, записывается название Мартышка, Золото или Семерка.
(7) Хм, это хорошо, перепишу на данную функцию, после ее изучения :)
Спасибо за указания моих ошибок, учту!

#include <iostream>
#include <ctime>
#include <string>
#include <conio.h>

using namespace std;

string lot[3];
int a=0,b=0,c=0;

int Mechanizm(){
    for (int i=0;i<=2;i++)
    {
    srand(time(NULL));
    int rNum = 1+(rand()%100);
    if((rNum>1)&&(rNum<43)){
        a++;
        lot[i] = "Monkey";
    }else if((rNum>43)&&(rNum<74)){
        b++;
        lot[i] = "Gold";
    }else if((rNum>74)&&(rNum<101)){
        c++;
        lot[i] = "777";
    }else{
        cout<<"Incorrect number!"<<endl;
    }
    cout<<"Your slot number "<<i+1<<": "<<lot[i]<<"| "<<endl;
    }
    return a,b,c;
}
void lotMachine()
{
    int g=0;
    while(g<1){
    Mechanizm();
    if(c==3 && b==0 && a==0)
    {
        cout<<"JACKPOT!"<<endl;
        cout<<"You winner!"<<endl;
    }if(b==3 && a==0 && c==0)
    {
        cout<<"GOLD ORE!"<<endl;
    }if(a==3 && b==0 && c==0)
    {
        cout<<"Three Mokey!"<<endl;
    }
        cout<<"restart?(y/n)"<<endl;
        int userAnswer = getch();
        if(userAnswer=='y'){
            lotMachine();
        }else{
            cout<<"Goodbye!"<<endl;
            g++;
        }
    }
}
int main()
{    
    setlocale(0,"russian");
    cout << "Start game?(y/n)" <<endl;
    int nom = getch();
    if(nom=='y'||nom=='н'){
        lotMachine();
    }else if(nom=='n'||nom=='т'){
        cout<<"Goodbye!"<<endl;
    }else{
        cout<<"Goodbye!"<<endl;
    }
    system("pause");
    return 0;
}

Вот переписал, но, опять проблема. Всегда генерирует одни и те же лоты. Проверьте, кому не лень?

Вынеси srand(time(NULL)); из цикла (лучше вообще перенеси в начало main()) — время не успевает изменяться, поэтому генератор случайных чисел трижды стартует с одинакового значения.

За использование неконтролируемой рекурсии вместо цикла тебя ещё не расстреляли?!

return a,b,c; — это бред. Функция в С/С++ может вернуть только одно значение (в данном случае будет возвращено значение c).

Джекпот (и пр. комбинации) не отлавливаются.

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

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.