SEC 20W6 | Заloopились карасі зіграти в гру

Щоб якось краще зафіксувати нові слова та функції в циклах. Пливла труба. На ній сиділи два карасі, один брикнув, а другий перескочив на континентальний потік. А за ними послідовно волочилась якась ESC дрібнота, що має вісім основних кольорів в діапазоні 30-37, та по одному яскравішому відтінку відповідно для кожного в значеннях від 90-97. І колір кожної рибинки має таке тіло '\033[<код_кольору>m':

  • \033 (або \e чи \0x1b) - голова;
  • [ - є початком кольору, після зябровий клапан));
  • <код_кольору> (36m) - цифровий діапазон від 30-37 та яскравіші 90-97. Заповнення фону тексту кольором, а не його колір 40-47 та інші відтінки 100-107 відповідно, а 7 дає чорний текст на білому фоні. Яскравий білий 1, 9 закреслений текст, а 4 (яскравіше) та 21 підкреслений білий, інші в діапазоні 255 просто білий та, але не 0. Це як луска;
  • m - завершує код, хвостик.

Тож цілком може виглядати так: \033[33m або із іншою головою. Щоб ще змити, тобто скасувати атрибути достатньо додати 0, щоб вийшло 0m - \033[36m . Чи просто прінтувати із вставкою тексту між кодом кольору на початку та кодом скасування кольорі в кінці.

1. Експеримент із кольорами. Як перевірити їх кількість, якщо їх більше?

Та багато що можна робити із кольорами, тільки просте введення значно легше, коли завчасно прописані параметри, щоб не купу коду писати, а словом. Другу фразу із кольоровим фоном про хмарки, вже зробив ШІ на мій запит, як і розповів про mColor (помічний у таких справах).

Код:

#include <iostream>

using namespace std;
#define RESET "\e[0m" // Reset all attributes

#define GREEN "\e[32m" // Green
#define YELLOWF "\e[43m" // Yellow fon
#define BLUEF "\e[44m" // Blue
#define MAGENTAF "\e[45m" // Magenta
#define CYAN "\e[36m" // Cyan
#define WHITE "\e[37m" // White

int main()
{

    cout << endl;
    cout << BLUEF << "Слава Україні!" << RESET << "\e[33mU\e[0m" << endl;
    cout << YELLOWF << "Героям  Слава!" << RESET << "\e[34mA\e[0m" << endl;
      cout << endl;

     cout << "\e[43mБіла рибка на жовтому фоні 43 код\e[0m" << endl;
    cout << "\e[7mЧорна рибка на білому фоні 7 код\e[0m" << endl;
    printf("\033[33mПухнасті \033[0m");
    printf("\033[1mхмари \033[0m");
    printf("\033[32mсхожі \033[0m");
    printf("\033[34mна \033[0m");
    printf("\033[36mсолодку \033[0m");
    printf("\033[1mхату!\033[0m");
      cout << endl;
    printf("\033[41m\033[4mПухнасті\033[0m \033[42m\033[4mхмари\033[0m \033[43m\033[4mсхожі\033[0m \033[44m\033[4mна\033[0m \033[45m\033[4mсолодку\033[0m \033[46m\033[4mхату!\033[0m\n");



    return 0;
}


Щоб перевірити наявність кольорів, треба зробити цикл перевірки для mColor

#include <iostream>
using namespace std;

int main() {

    for (int i = 1; i <= 255; i++) {
            cout << "\033[" << i << "mColor " << i << "\033[0m" << endl;
        }


    return 0;
}

2. Мій варіант гри (тобто певні ідеї, реалізовані за допомогою новітніх технологій, бо код руками довго писати й підбирати варіанти, проте це значно легше і є деяке розуміння, завдяки попередньому ознайомленню із матеріалами курсу). Введено цикл для обмеженої кількості спроб, щоб цікавіше, але не виправлено зависання при введенні текстового значення, тоді таки доведеться перезапускати код (гру), однак такого і в завданні не було )).

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
    while (true) { // нескінченний цикл, який буде перезапускати гру
        srand(time(0)); // ініціалізація генератора випадкових чисел
        int cpu_number = rand() % 100 + 1; // комп'ютер вибирає число від 1 до 100
        int user1;

    cout << "------------------------------------" << endl;
    cout << "Залізяка загадала число від 1 до 100" << endl;
    cout << "Спробуйте вгадати його!" << endl;
    cout << "Потрібно вводити свій варіант числа," << endl;
    cout << "орієнтуючись на підказки 'Забагато' та 'Замало'" << endl;
    cout << "------------------------------------" << endl;

    for (int i = 1; i <= 10; i++) { // цикл виконується 10 разів
        cout << "Спроба [" << i << "] : ваше число > ";
        cin >> user1;

        if (user1 < cpu_number) {
            cout << "Замало!" << endl;
        } else if (user1 > cpu_number) {
            cout << "Забагато!" << endl;
        } else { // якщо число вгадано
            cout << "Вітаємо! Вам щастить! Ви вгадали число за спроб " << i << endl;
            break; // вихід з циклу for
        }

        // Якщо це була остання спроба, виводимо повідомлення
        if (i == 10) {
               cout << "------------------------------------" << endl;
            cout << "Пу пу пу, таке буває, число не відгадано." << endl;
            cout << "Пощастить наступного разу!" << endl;
        }
    }
       cout << "------------------------------------" << endl;
    cout << "Залізяка загадала число " << cpu_number << "." << endl;
       cout << "------------------------------------" << endl;
    char restart;
    cout << "Хочете зіграти ще раз? (y/n) ";
    cin >> restart;

    if (restart != 'y' && restart != 'Y') {
        break; // вихід з нескінченного циклу while
    }
}

return 0;
}

У терміналі грає, де є змога вводити результат, тож ок - працює, але не всі онлайнові компілятори дають вводити дані.

3. Що довше вгадувати від 0 до 1000 чи від 0 до 10000?

Якщо просто вгадувати, без використання якогось скрипта чи коду, щоб звужував діапазон, то чим більше число, тим більше треба спроб, бо варіантів більше. Хоча може бути якийсь базовий принцип, що зводить вгадування до тих же дво-трьоцифрових чисел.

4. Гра для двох гравців, які беруть від 1 до 5 кульок із 30 наявних, але не знають скільки залишається (щоб знали там теж є, треба розкоментувати) і виводиться повідомлення про перемогу одного із них. Також додано перезапуск.

#include <iostream>

using namespace std;

int main() {
    bool play_again = true;
    while (play_again) {
        int total_balls = 30; // загальна кількість кульок
        int player1, player2; // змінні для ходів гравців
        int current_player = 1; // поточний гравець (1 або 2)

        while (total_balls > 0) {
            if (current_player == 1) {
                cout << "Хід гравця 1. Введіть кількість кульок (від 1 до 5): ";
                cin >> player1;
                while (player1 < 1 || player1 > 5) {
                    cout << "Введіть, будь ласка, число від 1 до 5: ";
                    cin >> player1;
                }
                total_balls -= player1;
              //  cout << "Гравець 1 взяв " << player1 << " кульок. Залишилось " << total_balls << " кульок." << endl;
                current_player = 2;
            } else {
                cout << "Хід гравця 2. Введіть кількість кульок (від 1 до 5): ";
                cin >> player2;
                while (player2 < 1 || player2 > 5) {
                    cout << "Введіть, будь ласка, число від 1 до 5: ";
                    cin >> player2;
                }
                total_balls -= player2;
              //  cout << "Гравець 2 взяв " << player2 << " кульок. Залишилось " << total_balls << " кульок." << endl;
                current_player = 1;
            }
        }

        if (current_player == 2) {
            cout << "Вітаємо! Гравець 1 виграв!" << endl;
        } else {
            cout << "Вітаємо! Гравець 2 виграв!" << endl;
        }

        cout << "Бажаєте зіграти ще раз? (1 - так, 0 - ні): ";
        int choice;
        cin >> choice;
        play_again = (choice == 1);
    }

    return 0;
}

5. Шлях від зірочок до квадрата, а потім перетворення квадрата в трикутник

5.1 Зірочки

Потрібно додати до звичайного циклу for додаткову змінну та функцю для переходу кожного разу на новий рядок.

#include <iostream>

using namespace std;

int main()
{
    int rows = 33;{
        for (int r = 1; r <= rows; r++){

            cout << "*";
        }
        cout << "\n"; // Перехід на новий рядок після кожного рядка
    }
    cout << "\n"; // Додатковий перехід на новий рядок після малювання фігури


    return 0;
}

5.2 Квадрат

Додається ще одна змінна та вкладений цикл for у for, то маєм квадрат, тільки вигляд квадрата ще й залежить від консолі виводу, тобто візуальний вид відображення символів і пробілів між ними.

#include <iostream>

using namespace std;

int main()
{
    int k = 16, rows = 7;
    for (int r = 1; r <= rows; r++)
    {
        for (int c = 1; c <= k; c++)
        {
            cout << "*";
        }
        cout << "\n"; // Перехід на новий рядок після кожного рядка
    }
    cout << "\n"; // Додатковий перехід на новий рядок після малювання фігури


    return 0;
}

5.3 Трикутник

Для трикутника достатньо замінити у вкладеному циклі for k, на r із основного, ну і rows змінити на 5. Тоді буде виконання завдання якраз для мене. Тобто перший трикутник, з іншими треба покрутити щось.

#include <iostream>

using namespace std;

int main()
{
    int k = 12, rows = 5;
    for (int r = 1; r <= rows; r++)
    {
        for (int c = 1; c <= r; c++)
        {
            cout << "*";
        }
        cout << "\n"; // Перехід на новий рядок після кожного рядка
    }
    cout << "\n"; // Додатковий перехід на новий рядок після малювання фігури


    return 0;
}

І догори дригом. У основному for (int r = rows; r >=1; r--) повністю змінюється. Ініціалізація r на rows, умова r більше 1 і віднімання. Інші дещо складніші.

#include <iostream>

using namespace std;

int main()
{
    int k = 12, rows = 5;
    for (int r = rows; r >=1; r--)
    {
        for (int c = 1; c <= r; c++)
        {
            cout << "*";
        }
        cout << "\n"; // Перехід на новий рядок після кожного рядка
    }
    cout << "\n"; // Додатковий перехід на новий рядок після малювання фігури


    return 0;
}

Запрошую прийняти участь @АрхангелМихаїл @АрхангелГавриїл @АрхангелЄлагія формально для виконання умом та загального покращення.))


Головне зображення зроблено SDXL 1.0 та відредаговано.
Знімки екрану із кодом, текстом та результатом компіляції з https://www.mycompiler.io/new/cpp


#ukraine #sec20w6 #club5050 #game #sec20w6sergeyk

H2
H3
H4
3 columns
2 columns
1 column
2 Comments