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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2012, 10:08   #1
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Подмигивание Игра "Камень, Ножницы, Бумага"

Выкладываю текущий вариант. Кому-то вдруг интересно будет!

Код:
#include <iostream>
#include <string>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <locale>

using namespace std;

/* Функция преобразует буквы в полное написание */
string rewrite(char c) {
if (c == 'k') return "Камень";       
if (c == 'n') return "Ножницы";       
if (c == 'b') return "Бумага";             
}

/* Здесь вычисляется, кто победил */
int result(char cuser, char ccomp) {
if ((cuser == 'k') && (ccomp == 'b') || (cuser == 'n') && (ccomp == 'k') || (cuser == 'b') && (ccomp == 'n')) return -1;
if ((cuser == 'k') && (ccomp == 'n') || (cuser == 'n') && (ccomp == 'b') || (cuser == 'b') && (ccomp == 'k')) return 1;
if (cuser == ccomp) return 0;
}

int main() {
    
setlocale(LC_ALL, "Russian");    

srand(static_cast<unsigned>(time(NULL)));

int user_wins = 0;
int comp_wins = 0;

while ((user_wins < 10) && (comp_wins < 10)) {
cout << "Камень, ножницы, или бумага?(k/n/b): ";
char cuser;
cin >> cuser;

char ccomp;

int cc = 0;

/* Здесь ход компьютера */
cc = rand() % 3;

if (cc == 0) ccomp = 'k';
if (cc == 1) ccomp = 'n'; 
if (cc == 2) ccomp = 'b';

if (result(cuser,ccomp) == -1) { comp_wins++; cout << rewrite(cuser) << " против " << rewrite(ccomp) << ", Компьютер победил! (" << user_wins << ":" << comp_wins << ")" << endl; } else
if (result(cuser,ccomp) == 0) cout << rewrite(cuser) << " против " << rewrite(ccomp) << ", Ничья! (" << user_wins << ":" << comp_wins << ")" << endl; else
if (result(cuser,ccomp) == 1) { user_wins++; cout << rewrite(cuser) << " против " << rewrite(ccomp) << ", Вы победили! (" << user_wins << ":" << comp_wins << ")" << endl; }
else cerr << "Ошибка! Неверный ввод!" << endl;
}    

if (comp_wins > user_wins) cout << endl << "Компьютер победил!"; else
if (comp_wins < user_wins) cout << endl << "Поздравляем! Вы победили"; else
if (comp_wins = user_wins) cout << endl << "Ничья!";

cout << endl << "Нажмите любую клавишу...";
_getch();
return 0;    
}

Если поменять ввод русских букв на их латинские аналоги, все прекрасно работает.
Собственно, как это исправить(чтобы компилятор полностью понимал русский, не только вывод, но и ввод)?

И еще вопрос: как переписать код, используя константные ссылки в функциях?
Никто

мой блог

Последний раз редактировалось three_cats; 23.10.2012 в 16:59.
three_cats вне форума Ответить с цитированием
Старый 23.10.2012, 10:25   #2
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Радость

Вопросы остаются открытыми.
Никто

мой блог

Последний раз редактировалось three_cats; 23.10.2012 в 17:00.
three_cats вне форума Ответить с цитированием
Старый 23.10.2012, 10:28   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Мама родная! Вы что, в Индии учились? Массивы и циклы применять Вас не учили? А группировать данные при помощи операции "||"?

Код:
int result(char cuser, char ccomp) {
if (((cuser == 'к') && (ccomp == 'б')) || ((cuser == 'н') && (ccomp == 'к')) || ((cuser == 'б') && (ccomp == 'н'))) return -1;
// С остальными так-е
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.10.2012, 10:31   #4
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Радость

Smitt&Wesson, так не очень наглядно.

Цитата:
Вы что, в Индии учились?
А что, в Индии плохо учат?

И где нужно применить массивы/циклы?

Smitt&Wesson,
Цитата:
Краткость - сестра таланта.
Но теща гонорара.

Все-таки, прошу ответить на вопросы, если можно, я же не просто так их задал.
Никто

мой блог

Последний раз редактировалось three_cats; 23.10.2012 в 10:50.
three_cats вне форума Ответить с цитированием
Старый 23.10.2012, 10:48   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от three_cats Посмотреть сообщение
Smitt&Wesson, так не очень наглядно.

А что, в Индии плохо учат?
Учат, может и хорошо, но платят программистам за количество написанных строк, а не за эффективность кода.
Цитата:
И где нужно применить массивы/циклы?
Да везде, во всех функциях. Могу показать пример.
Цитата:
Smitt&Wesson,

Но теща гонорара.
Эт уж точно .
Да и вот ещё, на счёт структурированности. Сразу бросается в глаза, что если cuser = ccomp, то результат 0.
Его вообще можно оформить как
Код:
if(cuser == ccomp) renern 0;
Если ещё поразмышлять, можно и остальные операторы упростить.
Например

Код:
string rewrite(char c) {
Switch(c)
{
  case 'к' : return "Камень";
  case 'н' : return "Ножницы";       
  case 'б' : return "Бумага";              
}
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 23.10.2012 в 11:04.
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.10.2012, 10:56   #6
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
По умолчанию

Код:
платят программистам за количество написанныхстрок, а не за эффективность кода.
Очень познавательно, спасибо. Я об этом всегда только догадывался!

Код:
Да везде, во всех функциях. Могу показать пример.
Покажите, если не сложно.

И как сделать, чтобы понимал русский ввод?

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

Спасибо за замечания, учел:
Код:
/* Здесь вычисляется, кто победил */
int result(char cuser, char ccomp) {
if ((cuser == 'k') && (ccomp == 'b') || (cuser == 'n') && (ccomp == 'k') || (cuser == 'b') && (ccomp == 'n')) return -1;
if ((cuser == 'k') && (ccomp == 'n') || (cuser == 'n') && (ccomp == 'b') || (cuser == 'b') && (ccomp == 'k')) return 1;
if (cuser == ccomp) return 0;
}
Никто

мой блог

Последний раз редактировалось three_cats; 23.10.2012 в 11:02.
three_cats вне форума Ответить с цитированием
Старый 23.10.2012, 11:13   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
И как сделать, чтобы понимал русский ввод?
Ну, например можно использовать не символ, а код клавиши. Как это зделать, сейчас нет времени думать. Но можно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.10.2012, 16:39   #8
three_cats
Форумчанин
 
Аватар для three_cats
 
Регистрация: 27.09.2012
Сообщений: 175
Подмигивание

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Ну, например можно использовать не символ, а код клавиши. Как это зделать, сейчас нет времени думать. Но можно.
Вы меня немножко не поняли. Перейдите в эту тему, если есть время...
Никто

мой блог
three_cats вне форума Ответить с цитированием
Старый 23.10.2012, 21:22   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Но теща гонорара.
Судя по тому, какой софт внедряется у меня на работе, у большинства его создателей общая жена
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 23.10.2012, 23:50   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Чуть упростил:
Код:
#include <iostream>
#include <string>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <locale>
#include <stdlib.h>

using namespace std;

/* Функция преобразует буквы в полное написание */
string rewrite(int c)
{
    if (c == 0) return "Камень";
    else if (c == 1) return "Ножницы";
    else return "Бумага";
}

int main()
{
    setlocale(LC_ALL, "Russian");

    srand(static_cast<unsigned>(time(NULL)));

    int user_wins = 0;
    int comp_wins = 0;

    while ((user_wins < 10) && (comp_wins < 10))
    {
        cout << "Камень, ножницы, или бумага?(К/Н/Б): ";
        unsigned char cuser;
        cin >> cuser;
        int cu;
        switch (cuser)
        {
        case 138:
            cu = 0;break;
        case 141:
            cu = 1;break;
        case 129:
            cu = 2;break;
        default:
            cout << "Ошибка" << endl;
            continue;
        }

        int cc = rand() % 3;

        int answer = (cu - cc + 3) % 3;

        if (answer == 1) {
            comp_wins++;
            cout << rewrite(cu) << " против " << rewrite(cc) << ", Компьютер победил! (" << user_wins << ":" << comp_wins << ")" << endl;
        }
        else if (answer == 0) {
            cout << rewrite(cu) << " против " << rewrite(cc) << ", Ничья! (" << user_wins << ":" << comp_wins << ")" << endl;
        }
        else if (answer == 2) {
            user_wins++;
            cout << rewrite(cu) << " против " << rewrite(cc) << ", Вы победили! (" << user_wins << ":" << comp_wins << ")" << endl;
        }
    }

    if (comp_wins > user_wins) cout << endl << "Компьютер победил!";
    else if (comp_wins < user_wins) cout << endl << "Поздравляем! Вы победили";
    else cout << endl << "Ничья!";

    cout << endl << "Нажмите любую клавишу...";
    _getch();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 23.10.2012 в 23:55.
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра "worms", доработка игры "косынка". C# den790 Фриланс 11 09.12.2011 10:53
Камень ножницы бумага Шайен Помощь студентам 3 22.05.2011 17:56
Камень, ножницы, бумага онлайн Bion Работа с сетью в Delphi 8 09.01.2011 19:24
Камень ножницы бумага grom333 Помощь студентам 0 14.01.2010 22:31
"камень, ножницы, бумага" [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 31.03.2008 18:18