Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 11
1

Игра 21 очко: Доработать проверку вводимых символов

01.04.2016, 01:09. Показов 2011. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Вот есть игрушка в 21 очко. Всё хорошо работает, но стоит задача немного это доработать:
1) Нужно доработать проверку вводимых символов (ans != 'n'), чтобы
программа адекватно отрабатывала, если вводимый символ ни n и ни y.
2) В этой программе компьютер останавливает набор карт по условию while
(komp<17). Изменить условие так, чтобы останов набора карт происходил с
различными (случайными) уставками из разумно применимых пределов:
komp<(уставка)

Помогите пожалуйста!

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
 
int koloda[13] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 11 };
 
int karta() { return  rand() % 13; }
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int igrok, komp, kart;
    char  ans, buf;
 
    time_t t;
    srand((unsigned)time(&t));
 
    do
    {
        printf("\n****************** Игра начинается... ***************\n\n");
        komp = 0; igrok = 0;
        do
        {
            kart = karta();
            printf("Ваша карта: %d ", koloda[kart]);
            igrok += koloda[kart];
            printf("\tСумма = %d\n", igrok);
            if (igrok>21)
            {
                printf("У Вас перебор, Вы проиграли!\n ");
                break;
            }
 
            printf("взять еще? ('y' - да, 'n' - нет) : ");
            ans = getchar();
            buf = getchar();
        } while (ans != 'n');
 
        if (igrok <= 21)
        {
            printf("\nКарты компьютера:");
            do
            {
                kart = karta();
                printf(" %d", koloda[kart]);
                komp += koloda[kart];
            } while (komp<17);
            printf("\t Сумма = %d", komp);
            if (igrok>komp) printf(" \n\nПоздравляем, Вы выиграли! \n");
            if (igrok == komp) printf(" \n\nНичья! \n");
            if (igrok<komp && komp <= 21)  printf(" \n\nВы проиграли! \n");
            if (igrok<komp && komp>21) printf("\n\nУ компьютера перебор, Вы выиграли! \n");
        }
        printf(" \nиграть еще? ('y' - да, 'n' - нет) : ");
        ans = getchar();
        buf = getchar();
    } while (ans != 'n');
 
    printf(" \n Спасибо за игру!!! Для выхода нажмите Enter! \n ");
    _getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2016, 01:09
Ответы с готовыми решениями:

Реализовать проверку на количество вводимых символов
Допустим, объявлен массив чаров из 16 элементов, пользователь же ввел строку из 17 или более...

Как сделать проверку вводимых символов в TextBox
Как сделать проверку вводимых символов в TextBox ? Чтоб можно было вводить только числа, в том...

Игра очко
Хочу написать игрушку &quot;очко&quot;, можно как то изображения карт сохранить в dll

Игра 21 очко
Народ, помогите задать условие для противника в игре 21 очко.

7
44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
01.04.2016, 02:18 2
С первым моментом было несложно. Вам просто надо было добавить цикл while после первичного ввода "y,n" пока значение переменной ans не будет совпадать с одной из этих двух символов

добавьте после 38 строки вот это:
C++
1
2
3
4
5
6
while (ans != 'y' || ans != 'n')
            {
                printf("взять еще? ('y' - да, 'n' - нет) : ");
                ans = getchar();
                buf = getchar();
            }
А вот со вторым вопросом я не совсем понял. Что означает слово "уставка". Можно по-подробнее?
1
69 / 69 / 55
Регистрация: 17.11.2015
Сообщений: 151
01.04.2016, 11:14 3
по поводу второго задания - тут проще описать вероятность того, будет ли компьютер брать еще одну карту, например, если:
komp<17 то вероятность 80%
komp=17 то вероятность 50%
komp=18 то вероятность 20%
komp=19 то вероятность 10%

код примерно такой:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int chance(int komp)
{
    if (komp < 17)
        if (rand() % 5 + 1 < 5) return 1; //80% 
 
    if (komp == 17)
        if (rand() % 2 + 1 < 2) return 1; //50%
 
    if (komp == 18)
        if (rand() % 5 + 1 < 2) return 1; //20%
 
    if (komp == 19)
        if (rand() % 10 + 1 < 2) return 1; //10%
 
    return 0;
}
и условие в цикле:
C
1
while (chance(komp))
конечно погрешность все равно будет около 3-5%, точно 80%,50%,20%,10% не будет
2
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 11
05.04.2016, 19:29  [ТС] 4
Цитата Сообщение от Sigma214 Посмотреть сообщение
С первым моментом было несложно. Вам просто надо было добавить цикл while после первичного ввода "y,n" пока значение переменной ans не будет совпадать с одной из этих двух символов

добавьте после 38 строки вот это:
C++
1
2
3
4
5
6
while (ans != 'y' || ans != 'n')
            {
                printf("взять еще? ('y' - да, 'n' - нет) : ");
                ans = getchar();
                buf = getchar();
            }
А вот со вторым вопросом я не совсем понял. Что означает слово "уставка". Можно по-подробнее?
Либо я не туда код вставляю, либо нифига не работает( При вводе любого символа пишет постоянно "взять еще?"

Добавлено через 3 минуты
Цитата Сообщение от VasiliyRM Посмотреть сообщение
по поводу второго задания - тут проще описать вероятность того, будет ли компьютер брать еще одну карту, например, если:
komp<17 то вероятность 80%
komp=17 то вероятность 50%
komp=18 то вероятность 20%
komp=19 то вероятность 10%

код примерно такой:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int chance(int komp)
{
    if (komp < 17)
        if (rand() % 5 + 1 < 5) return 1; //80% 
 
    if (komp == 17)
        if (rand() % 2 + 1 < 2) return 1; //50%
 
    if (komp == 18)
        if (rand() % 5 + 1 < 2) return 1; //20%
 
    if (komp == 19)
        if (rand() % 10 + 1 < 2) return 1; //10%
 
    return 0;
}
и условие в цикле:
C
1
while (chance(komp))
конечно погрешность все равно будет около 3-5%, точно 80%,50%,20%,10% не будет
Можешь, пожалуйста, своё добро вставить в весь код, показать где оно должно быть, чтобы все работало?
К сожалению, плохо очень учат Си, а требуют слишком многого, пытаюсь сам разбираться, но пока плохо получается.
0
69 / 69 / 55
Регистрация: 17.11.2015
Сообщений: 151
06.04.2016, 08:42 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
 
int koloda[13] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 11 };
 
int karta() { return  rand() % 13; }
 
 
int chance(int komp)
{
    if (komp < 17)
        if (rand() % 5 + 1 < 5) return 1; //80% 
 
    if (komp == 17)
        if (rand() % 2 + 1 < 2) return 1; //50%
 
    if (komp == 18)
        if (rand() % 5 + 1 < 2) return 1; //20%
 
    if (komp == 19)
        if (rand() % 10 + 1 < 2) return 1; //10%
 
    return 0;
}
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int igrok, komp, kart;
    char  ans, buf;
 
    time_t t;
    srand((unsigned)time(&t));
 
    do
    {
        printf("\n****************** Игра начинается... ***************\n\n");
        komp = 0; igrok = 0;
        do
        {
            kart = karta();
            printf("Ваша карта: %d ", koloda[kart]);
            igrok += koloda[kart];
            printf("\tСумма = %d\n", igrok);
            if (igrok>21)
            {
                printf("У Вас перебор, Вы проиграли!\n ");
                break;
            }
 
            printf("взять еще? ('y' - да, 'n' - нет) : ");
            ans = getchar();
            buf = getchar();
        } while (ans != 'n');
 
        if (igrok <= 21)
        {
            printf("\nКарты компьютера:");
            do
            {
                kart = karta();
                printf(" %d", koloda[kart]);
                komp += koloda[kart];
            } while (chance(komp));
            printf("\t Сумма = %d", komp);
            if (igrok>komp) printf(" \n\nПоздравляем, Вы выиграли! \n");
            if (igrok == komp) printf(" \n\nНичья! \n");
            if (igrok<komp && komp <= 21)  printf(" \n\nВы проиграли! \n");
            if (igrok<komp && komp>21) printf("\n\nУ компьютера перебор, Вы выиграли! \n");
        }
        printf(" \nиграть еще? ('y' - да, 'n' - нет) : ");
        ans = getchar();
        buf = getchar();
    } while (ans != 'n');
 
    printf(" \n Спасибо за игру!!! Для выхода нажмите Enter! \n ");
    _getch();
}
1
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 11
06.04.2016, 11:40  [ТС] 6
Спасибо большое!!! Теперь осталось разобраться почему не работает проверка вводимых символов
0
0 / 0 / 0
Регистрация: 29.03.2016
Сообщений: 11
08.04.2016, 10:45  [ТС] 7
Ребятааа, помогите пожалуйста!)
0
69 / 69 / 55
Регистрация: 17.11.2015
Сообщений: 151
09.04.2016, 21:21 8
вместо
C
1
while (ans != 'n');
Добавлено через 22 минуты
замени весь цикл на это
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
       do
        {
            kart = karta();
            printf("Ваша карта: %d ", koloda[kart]);
            igrok += koloda[kart];
            printf("\tСумма = %d\n", igrok);
            if (igrok>21)
            {
                printf("У Вас перебор, Вы проиграли!\n ");
                break;
            }
 
            printf("взять еще? ('y' - да, 'n' - нет) : ");
 
        while ((ans = _getch())!='y' && ans!='n')
        printf("Only \'y\' or \'n\'\n");
 
            printf("%c\n",ans);
 
        } while (ans != 'n');
и добавь хедрфайл
C
1
#include<conio.h>
Добавлено через 3 минуты
тут тоже самое
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        if (igrok <= 21)
        {
            printf("\nКарты компьютера:");
            do
            {
                kart = karta();
                printf(" %d", koloda[kart]);
                komp += koloda[kart];
            } while (komp<17);
            printf("\t Сумма = %d", komp);
            if (igrok>komp) printf(" \n\nПоздравляем, Вы выиграли! \n");
            if (igrok == komp) printf(" \n\nНичья! \n");
            if (igrok<komp && komp <= 21)  printf(" \n\nВы проиграли! \n");
            if (igrok<komp && komp>21) printf("\n\nУ компьютера перебор, Вы выиграли! \n");
        }
        printf(" \nиграть еще? ('y' - да, 'n' - нет) : ");
 
        while ((ans = _getch())!='y' && ans!='n')
        printf("Only \'y\' or \'n\'\n");
 
            printf("%c\n",ans);
 
        } while (ans != 'n');
1
09.04.2016, 21:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2016, 21:21
Помогаю со студенческими работами здесь

Игра «Очко с ящиками»
Игра «Очко с ящиками». При запуске игры на экране появляются 15 ящиков, под которыми спрятаны...

Игра 21 очко в консоле
Было ночью скучно Может кто скажет,чем дополнить можно? #include&lt;stdio.h&gt; #include &lt;conio.h&gt;...

Куда копать, игра 21 очко
Подскажите как лучше реализовать. Нужно написать игру- 21 очко на с++ в консоли. Для игры между...

Игра 21 очко - исправить ошибки
Пишу программу игру 21 очко. Без этого case все работает, подскажите где ошибка. плз... уже целый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru