Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2022, 15:45   #1
AlexFirefield
Пользователь
 
Регистрация: 22.06.2022
Сообщений: 11
По умолчанию код работает, но что можно улучшить

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


Код:


#include <iostream>
#include <ctime>
using namespace std;
int* Move(int* key, int* kam, int* knife, int* paper)
{
    cout << "***********" << endl;
    switch (*key)
    {
    case 1:
    {
        cout << "\n #\n###\n #\n";
        ++(*kam);
        return kam;
    }
    break;
    case 2:
    {
        cout << "\n0 / \n @ \n0 " << '\\' << endl;
        *knife = 1;
        return knife;
    }
    break;
    case 3:
    {
        cout << "\n ___\n|...|\n|...|\n|___| \n";
        *paper = 1;
        return paper;
    }
    break;
    }
    return nullptr;
}

void Round(int* kam, int* knife, int* paper)
{
    if (*kam > 0 && *knife > 0)
    {
        ++(*kam);
    }
    else if (*kam > 0 && *paper > 0)
    {
        ++(*paper);
    }
    else if (*knife > 0 && *paper > 0)
    {
        ++(*knife);
    }
    else
    {
        cout << "Nobody is WIN!" << endl;
    }
}

int main()
{
    srand(time(NULL));
    bool final = true;
    while (final)
    {
        int kam = 0, knife = 0, paper = 0;
        cout << "#_WELCOME TO GAME!_#\n#_Rock Paper Scissors!_#\nPress\n 1.Rock\n2.Scissors\n3.Paper\n" << endl;

        int key1;
        cin >> key1;
        int key2 = (1 + rand() % 3);

        cout << "Your" << endl;
        int* move1 = Move(&key1, &kam, &knife, &paper);
        cout << "Computer" << endl;
        int* move2 = Move(&key2, &kam, &knife, &paper);

        Round(&kam, &knife, &paper);

        if (*move2 > *move1)
            cout << "Computer WIN!!!" << endl;
        else if (*move2 < *move1)
            cout << "You are WIN!!!" << endl;

        system("pause");
        cout << "Exit - press 0.\nContinue - press 1.\n";
        cin >> final;
    }
    return 0;
}
AlexFirefield вне форума Ответить с цитированием
Старый 30.06.2022, 15:57   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 483
По умолчанию

stone
Valick на форуме Ответить с цитированием
Старый 30.06.2022, 16:50   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А зачем столько переменных? Не проще проверить
Код:
key2 = (2 + rand() % 3);
// key2 == 4 - это тоже самое что и key2 == 1.
if (key2 > key1) { ComputerWin; } else if (key2 == key1) { NoWin; } else { PlayerWin; }
// В move просто добавьте case 4: перед case1: без break;
macomics вне форума Ответить с цитированием
Старый 30.06.2022, 17:14   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
#include <iostream>
#include <ctime>
void Move(int key)
{
    std::cout << "***********\n";
    switch (key)
    {
    case 4:
    case 1:
        std::cout << "\n #\n###\n #\n";
        break;
    case 2:
        std::cout << "\n0 / \n @ \n0 " << '\\' << "\n";
        break;
    case 3:
        std::cout << "\n ___\n|...|\n|...|\n|___| \n";
        break;
    }
}

int main()
{
    srand(time(NULL));
    bool final = true;
    while (final)
    {
        std::cout << "#_WELCOME TO GAME!_#\n#_Rock Paper Scissors!_#\nPress\n 1.Rock\n2.Scissors\n3.Paper\n\n";
        char key1;
        do {
            std::cin >> key1;
        } while (key1 < '1' && key1 > '3');
        int key2 = (2 + rand() % 3);
        std::cout << "Your\n";
        Move(key1 - '0');
        std::cout << "Computer\n";
        Move(key2);
        key2 -= key1 - '0';
        if (key2 == 2 || key2 == -1)
            std::cout << "Computer WIN!!!\n";
        else if (key2 == 1)
            std::cout << "You are WIN!!!\n";
        else std::cout << "No win\n";
        system("pause");
        system("cls");
        std::cout << "Exit - press 0.\nContinue - press 1.\n";
        do {
            std::cin >> key1;
        } while (key1 != '0' && key1 != '1');
        if (key1 == '0') final = 0;
    }
    return 0;
}

Последний раз редактировалось macomics; 30.06.2022 в 17:26.
macomics вне форума Ответить с цитированием
Старый 30.06.2022, 22:24   #5
AlexFirefield
Пользователь
 
Регистрация: 22.06.2022
Сообщений: 11
По умолчанию

macomics, спасибо
AlexFirefield вне форума Ответить с цитированием
Старый 01.07.2022, 11:07   #6
AlexFirefield
Пользователь
 
Регистрация: 22.06.2022
Сообщений: 11
По умолчанию

macomics

вопрос по использованию char key вместо int key, это связано с тем что из cin мы получаем поток char, и чтобы лишний раз не преобразовывать в int, юзаем в char
AlexFirefield вне форума Ответить с цитированием
Старый 01.07.2022, 15:03   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Да. Заодно предотвращаем ошибки ввода, если пользователь напечатает не число.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли улучшить качество приёма Wi-Fi с помощью зеркала? Вадим Мошев Свободное общение 16 28.05.2019 07:04
Можно ли улучшить этот код? Artsiom Общие вопросы по Java, Java SE, Kotlin 4 26.07.2017 16:09
Как можно улучшить код для синтаксической подсветки? (Delphi 7)) munthrekosh Общие вопросы Delphi 5 24.03.2012 08:29
Как можно улучшить код @ndreiKO Помощь студентам 5 23.08.2011 04:21
Как можно улучшить эффективность и качество ПП? Evgenii Помощь студентам 5 29.01.2009 16:22