Игра - 15 палок. Не могу определить проблему

133
23 ноября 2020, 06:40

Не знаю как это игра называется на самом деле, но нужно было реализовать это: Реализовать игру 15 палок. Вы играете с компьютером. Ваша задача: по очереди забирать предметы (от 1 до 3 за один ход). Проигрывает тот, кто последний забирает предмет. Реализовать алгоритм максимально умного бота.

Сам код:

#include <iostream>
#include <time.h>
#include <Windows.h>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
void userStep(int& amount, int& randm, int& counter, int& allcount)
{
    if (randm < 5)
    {
        cout << "Введите количество палок, которых хотите вычеркнуть (От 1 до 3 включительно): ";
        do
        {
            cin >> amount;
            allcount += amount;
            if (amount > 3 || amount < 1)
            {
                cout << "От 1 до 3 включительно: ";
            }
        } while (amount > 3 || amount < 1);
        {
            cout << "\nВы выбрали " << amount << " элементов, итог: ";
        }
        char* sticks = new char[15 - amount];
        for (int x = 0; x <= 14 - amount; x++)
        {
            sticks[x] = '|';
            cout << sticks[x] << "  ";
        }
        delete[] sticks;
        counter = 1;
        amount = 0;
        cout << "\n\n";
    }
}
void botStep(int& amount, int& randm, int& counter, int& allcount)
{
    if (randm > 5)
    {
        cout << "Бот вводит количество палок. ";
        if (amount == 0)
        {
            amount = rand() % 3 + 1;
        }
        else
        {
            amount = 4 - amount;
        }
        allcount += amount;
        cout << "Бот выбрал " << amount << " элементов, итог: ";
        char* sticks = new char[15 - amount];
        for (int x = 0; x <= 14 - amount; x++)
        {
            sticks[x] = '|';
            cout << sticks[x] << "  ";
        }
        delete[] sticks;
        counter = 2;
        amount = 0;
        cout << "\n\n";
    }
}
int main()
{
    setlocale(LC_ALL, "Rus");
    srand(unsigned(time(0)));
    system("Color 75");
    cout << "\n\n\n\tДобро пожаловать в мою игру. Вы готовы проиграть? Если да - введите Y или любой другой знак, чтобы ответить нет и признать победу бота и воистину могущественность и разум исскуственного интеллекта над человеческим существом\n\n";
    char startChange;
    cout << "Y(Да) или любое другое значение(Нет): ";
    cin >> startChange;
    cout << endl;
    if (startChange == 'Y' || startChange == 'y')
    {
        cout << "Итак, раз уж вы готовы то объясню, что вам надо сделать. У вас 15 палок, забираете по очереди по несколько. У кого последняя остается - проигрывает. Количество максимально выбранных элементов за один раз - 3\n\n";
        cout << "Это элементы игры которыми вы и бот будете манипулировать: ";
        char* sticks = new char[15];
        for (int x = 0; x <= 14; x++)
        {
            sticks[x] = '|';
            cout << sticks[x] << "  ";
        }
        delete[] sticks;
        cout << "\n\n";
        int amount = 0;
        int counter;
        int allcount = 0;
        int randm = rand() % 11 + 0;
        userStep(amount, randm, counter, allcount);
        botStep(amount, randm, counter, allcount);
        while (allcount <= 12)
        {
            if (counter == 1)
            {
                botStep(amount, randm, counter, allcount);
            }
            else if (counter == 2)
            {
                userStep(amount, randm, counter, allcount);
            }
        }
    }
    system("pause");
    return 0;
}

сам код не закончен.

#include <iostream>
#include <time.h>
#include <Windows.h>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
void userStep(int& amount, int& randm, int& allcount, int& reg)
{
    cout << "Введите количество палок, которых хотите вычеркнуть (От 1 до 3 включительно): ";
    do
    {
        cin >> amount;
        allcount += amount;
        if (amount > 3 || amount < 1)
        {
            cout << "От 1 до 3 включительно: ";
        }
    } while (amount > 3 || amount < 1);
    {
        cout << "\nВы выбрали " << amount << " элементов, итог: ";
    }
    char* sticks = new char[reg - amount];
    for (int x = 0; x <= reg - amount - 1; x++)
    {
        sticks[x] = '|';
        cout << sticks[x] << "  ";
    }
    delete[] sticks;
    reg = reg - amount;
    cout << "\n\n";
}
void botStep(int& amount, int& randm, int& allcount, int& reg)
{
    cout << "Бот вводит количество палок. ";
    if (amount != 0)
    {
        amount = 4 - amount;
    }
    else
    {
        amount = rand() % 3 + 1;
    }
    allcount += amount;
    cout << "Бот выбрал " << amount << " элементов, итог: ";
    char* sticks = new char[reg - amount];
    for (int x = 0; x <= reg - amount - 1; x++)
    {
        sticks[x] = '|';
        cout << sticks[x] << "  ";
    }
    delete[] sticks;
    reg = reg - amount;
    cout << "\n\n";
}
int main()
{
    setlocale(LC_ALL, "Rus");
    srand(unsigned(time(0)));
    system("Color 75");
    cout << "\n\n\n\tДобро пожаловать в мою игру. Вы готовы проиграть? Если да - введите Y или любой другой знак, чтобы ответить нет и признать победу бота и воистину могущественность и разум исскуственного интеллекта над человеческим существом\n\n";
    char startChange;
    cout << "Y(Да) или любое другое значение(Нет): ";
    cin >> startChange;
    cout << endl;
    if (startChange == 'Y' || startChange == 'y')
    {
        cout << "Итак, раз уж вы готовы то объясню, что вам надо сделать. У вас 15 палок, забираете по очереди по несколько. У кого последняя остается - проигрывает. Количество максимально выбранных элементов за один раз - 3\n\n";
        cout << "Это элементы игры которыми вы и бот будете манипулировать: ";
        char* sticks = new char[15];
        for (int x = 0; x <= 14; x++)
        {
            sticks[x] = '|';
            cout << sticks[x] << "  ";
        }
        delete[] sticks;
        cout << "\n\n----------------------------------------------------------------------------------------------------------------\n\n";
        int amount = 0;
        int allcount = 0;
        int reg = 15;
        int randm = rand() % 1 + 1;
        while (allcount <= 12)
        {
            if (randm == 1)
            {
                botStep(amount, randm, allcount, reg);
                randm = 2;
            }
            else if (randm == 2)
            {
                userStep(amount, randm, allcount, reg);
                randm = 1;
            }
        }
    }
    system("pause");
    return 0;
}

Доработал свой код и вроде бы рабочий. Требуется проверка опытных пользователей.

Answer 1

Мой абсолютно готовый код (как я считаю):

#include <iostream>
#include <time.h>
#include <Windows.h>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
void userStep(int& amount, int& randm, int& allcount, int& reg)
{
    cout << "\n\nВведите количество палок, которых хотите вычеркнуть (От 1 до 3 включительно): ";
    do
    {
        cin >> amount;
        allcount += amount;
        if (amount > 3 || amount < 1)
        {
            cout << "\nОт 1 до 3 включительно: ";
        }
    } while (amount > 3 || amount < 1);
    {
        cout << "\nВы выбрали " << amount << " элементов, итог: ";
    }
    char* sticks = new char[reg - amount];
    for (int x = 0; x <= reg - amount - 1; x++)
    {
        sticks[x] = '|';
        cout << sticks[x] << "  ";
    }
    delete[] sticks;
    reg = reg - amount;
    cout << "\n\n";
}
void botStep(int& amount, int& randm, int& allcount, int& reg)
{
    cout << "\n\nБот вводит количество палок. ";
    if (amount != 0)
    {
        amount = 4 - amount;
    }
    else
    {
        amount = rand() % 3 + 1;
    }
    allcount += amount;
    cout << "Бот выбрал " << amount << " элементов, итог: ";
    char* sticks = new char[reg - amount];
    for (int x = 0; x <= reg - amount - 1; x++)
    {
        sticks[x] = '|';
        cout << sticks[x] << "  ";
    }
    delete[] sticks;
    reg = reg - amount;
    cout << "\n\n";
}
int main()
{
    setlocale(LC_ALL, "Rus");
    srand(unsigned(time(0)));
    system("Color 75");
    cout << "\n\n\n\tДобро пожаловать в мою игру. Вы готовы проиграть? Если да - введите Y или любой другой знак, чтобы ответить нет и признать победу бота и воистину могущественность и разум исскуственного интеллекта над человеческим существом\n\n";
    char startChange;
    cout << "Y(Да) или любое другое значение(Нет): ";
    cin >> startChange;
    cout << endl;
    if (startChange == 'Y' || startChange == 'y')
    {
        cout << "Итак, раз уж вы готовы то объясню, что вам надо сделать. У вас 15 палок, забираете по очереди по несколько. У кого последняя остается - проигрывает. Количество максимально выбранных элементов за один раз - 3\n\n";
        cout << "Это элементы игры которыми вы и бот будете манипулировать: ";
        char* sticks = new char[15];
        for (int x = 0; x <= 14; x++)
        {
            sticks[x] = '|';
            cout << sticks[x] << "  ";
        }
        delete[] sticks;
        cout << "\n\n--------------------------------------------------------------------------------------------------------";
        int amount = 0;
        int allcount = 0;
        int reg = 15;
        int randm = rand() % 2 + 1;
        while (allcount <= 13)
        {
            if (randm == 1)
            {
                if (reg == 2 || reg == 3 || reg == 4)
                {
                    cout << "\n\nБот вводит количество палок. ";
                    if (reg == 2)
                        amount = 1;
                    else if (reg == 3)
                        amount = 2;
                    else if (reg == 4)
                        amount = 3;
                    allcount += amount;
                    cout << "Бот выбрал " << amount << " элементов, итог: ";
                    char* sticks = new char[reg - amount];
                    for (int x = 0; x <= reg - amount - 1; x++)
                    {
                        sticks[x] = '|';
                        cout << sticks[x] << "  ";
                    }
                    delete[] sticks;
                    reg = reg - amount;
                    cout << endl << endl;
                }
                else
                {
                    botStep(amount, randm, allcount, reg);
                }
                randm = 2;
                cout << "--------------------------------------------------------------------------------------------------------";
            }
            else if (randm == 2)
            {
                if (reg == 3 || reg == 2)
                {
                    cout << "\n\nВведите количество палок, которых хотите вычеркнуть: ";
                    do
                    {
                        if (reg == 2)
                        {
                                amount = 0;
                            do
                            {
                                if (amount > 1)
                                    cout << "\nНе больше чем 1: ";
                                cin >> amount;
                            } while (amount > 1);
                        }
                        else if (reg == 3)
                        {
                            amount = 0;
                            do
                            {
                                if (amount > 2)
                                    cout << "\nНе больше чем 2: ";
                                cin >> amount;
                            } while (amount > 2);
                        }
                        allcount += amount;
                        if (amount > 3 || amount < 1)
                        {
                            cout << "\nОт 1 до 3 включительно: ";
                        }
                    } while (amount > 3 || amount < 1);
                    {
                        cout << "\nВы выбрали " << amount << " элементов, итог: ";
                    }
                    char* sticks = new char[reg - amount];
                    for (int x = 0; x <= reg - amount - 1; x++)
                    {
                        sticks[x] = '|';
                        cout << sticks[x] << "  ";
                    }
                    delete[] sticks;
                    reg = reg - amount;
                    cout << "\n\n";
                }
                else
                {
                    userStep(amount, randm, allcount, reg);
                }
                randm = 1;
                cout << "--------------------------------------------------------------------------------------------------------";
            }
        }
        if (randm == 2 && reg == 1)
        {
            cout << "\n\nНа этот раз выиграл бот, но не стоит огорчаться. Человечество не стоит на месте!";
        }
        else if (randm == 1 && reg == 1)
        {
            cout << "\n\nПоздравляем вас с победой над ботом! Это прямое доказательство, что человек лучше ИИ!";
        }
    }
    cout << endl << endl;
    system("pause");
    return 0;
}
READ ALSO
Удаление созданных с помощью new объектов

Удаление созданных с помощью new объектов

Народ, прошу помощиВроде простой вопрос, но ничего полезного при поиске решения не нашел

118
Вызов функции с помощью времени

Вызов функции с помощью времени

Как сделать вызов функции foo с помощью времени?

124
ошибки линковщика

ошибки линковщика

Пишу простое консольное приложение При попытке скомпилировать проект линковщик выдает следующее:

80