Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 580
1

Эмуляция действий персонажа

05.09.2019, 22:05. Показов 857. Ответов 9
Метки нет (Все метки)

Разработайте программу для эмуляции действий персонажа, имеющего два параметра:
1. Здоровье, ограничено пределом здоровья.
2. Мана, не имеет границ.
Персонаж может:
1. Получите Урон. Это уменьшает текущее здоровье.
2. Исцели себя. Это увеличивает текущее здоровье. Используется мана, количество маны, необходимое для исцеления, указывается во входных данных.
Примечания: Исцеление не работает, если недостаточно маны. Текущее здоровье не может превышать Предел здоровья.
3. Восстановление маны. Это увеличивает текущий параметр маны.
Игра должна выводить здоровье персонажа после всех действий. Если Здоровье становится меньше или равно нулю, персонаж умирает, и программа должна вывести ноль.
Входные данные:
1. Предел здоровья.
2. Текущее здоровье.
Примечание. Если Текущее состояние здоровья превышает Предел работоспособности, тогда устанавливается Предел работоспособности.
3. Мощность.
4. Количество маны, необходимое для заклинания Исцеление.
5. Массив целых чисел, где последовательные группы из двух чисел описывают действия:
5.1 Действие: получить урон (1), исцелить (2) или восстановить ману (3).
5.2 Количество.
6. Окончание номер -1.
Выход: Целое число, Здоровье персонажа после всех действий.

Примеры:

Входные данные: 100 150 50 20 1 50 2 20 1 30 2 30 2 10 3 60 2 20 -1
Выход:90

Входные данные: 50 40 50 10 1 20 2 10 1 40 2 20 -1
Выход:0
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2019, 22:05
Ответы с готовыми решениями:

Экипировка персонажа
Доброго времени суток у меня есть скрипт в котором при нажатии на кнопку игрок может экипировать...

Прыжок персонажа
Есть два спрайта персонаж и платформа и есть код прыжка на кнопке пробел: if...

Движение персонажа
Пишу на андроид. Есть 3 кнопки, лево право, прыжок. Так вот, все три действия реализовываю с...

Создание персонажа
Я хочу создать персонажа для юнити, но не совсем разбираюсь в блендере, объясните мне...

9
бах-бах и в продакшен!
3032 / 1635 / 573
Регистрация: 23.09.2014
Сообщений: 5,084
Записей в блоге: 4
06.09.2019, 21:12 2
Цитата Сообщение от ElKros Посмотреть сообщение
3. Мощность.
не стого не с сего, как гром среди ясного неба,
с чем связана и на что влияет?

Цитата Сообщение от ElKros Посмотреть сообщение
Входные данные:
1. Предел здоровья.
Цитата Сообщение от ElKros Посмотреть сообщение
Массив целых чисел, где последовательные группы из двух чисел описывают действия:
Цитата Сообщение от ElKros Посмотреть сообщение
Входные данные: 100 150 50 20 1 50 2 20 1 30 2 30 2 10 3 60 2 20 -1
100 это предел здровья или начало группы из двух числе.

если это предел здоровья то следующее тогда должно
Цитата Сообщение от ElKros Посмотреть сообщение
2. Текущее здоровье.
смотрим в массив: там 150

Текущее здоровье больше предела здоровья?

Если же в массиве сразу идут пары:
Цитата Сообщение от ElKros Посмотреть сообщение
получить урон (1), исцелить (2) или восстановить ману (3).
то откуда тогда взять Текущее здоровье с его пределом???


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

Или нужно составить уравнение или брутфорсом найти недостающие данные?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 580
06.09.2019, 23:23  [ТС] 3
XLAT, вот продолжение, но больше ничего нет

Параметры персонажа:
· Поскольку входные данные о состоянии здоровья превышают предел работоспособности, для здоровья установлено ограничение: 150> 100 -> 100
· Здоровье / Лимит: 100/100
· Мана: 50
· Количество маны, необходимое для заклинания Исцеление : 20
Действия:
Здоровье Mana Комментарий
100 50
1 50 100 - 50 = 50 50 Урон 50
2 20 50 + 20 = 70 50 - 20 = 30 Лечить 20
1 30 70 - 30 = 40 30 Урон 30
2 30 40 + 30 = 70 30 - 20 = 10 Лечить 30
2 10 70 + 0 = 70 10 - 0 = 10 Недостаточно маны
3 60 70 10 + 60 = 70 Восстановление маны 60
2 20 70 + 20 = 90 70 - 20 = 50 Лечить 20
Во-вторых:
Параметры персонажа:
· Здоровье / Лимит: 40/50
· Мана: 50
· Количество маны, необходимое для заклинания Исцеление : 10
Действия:
Здоровье Mana Комментарий
40 50
1 20 40 - 20 = 20 50 Урон 20
2 10 20 + 10 = 30 50 - 10 = 40 Лечить 10
1 40 30 - 40 = -10 <0 40 Урон 40 - мертвый
2 20 0 Пропущенные
1
бах-бах и в продакшен!
3032 / 1635 / 573
Регистрация: 23.09.2014
Сообщений: 5,084
Записей в блоге: 4
07.09.2019, 02:35 4
ElKros,
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
///----------------------------------------------------------------------------|
/// Эмуляция действий персонажа.
///----------------------------------------------------------------------------:
#include <iostream>
 
#define LOG(v)  std::cout << #v << "=" << v << ";  "
#define LOGE(v) std::cout << #v << "=" << v << "\n"
#define ENDL    std::cout << "\n"
#define BANNER  std::cout <<
 
///----------------------------------------------------------------------------|
/// Персонаж.
///----------------------------------------------------------------------------:
struct sPers
{
    sPers(const char* nm, int* _fate) : fate(_fate), i(4), name(nm)
    {   hp_max  = fate[0];
        hp      = load_hp(fate[1]);
        mp      = fate[2];
        mp_need = fate[3];
        
        BANNER
        "\n///--------------------------------------------------|"<<
        "\n/// "<< name 
                <<" родился!                                    |"<<
        "\n///--------------------------------------------------:\n";
        LOG(hp_max); LOG(hp); LOG(mp); LOGE(mp_need);
        
        to_live();
    }
    
    int hp_max;
    int hp;
    int mp;
    int mp_need;
    
    const char* name;
    
    void to_live()
    {   while(true)
        {   switch(fate[i++])
            {   case 1:
                    BANNER
                    "\n///--------------|"<<
                    "\n/// Урон!        |"<<
                    "\n///--------------:\n";
                    if(damage(fate[i]))
                    {   BANNER
                        "\n///~~~~~~~~~~~~~~конец истории..."<<
                        "\n/// "<< name 
                                <<" умер... (((:           |"<<
                        "\n///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:\n";
                        LOG(hp); LOGE(mp);
                        return;
                    }
                    LOG(hp); LOGE(mp);
                    break;
            
                case 2:
                    BANNER
                    "\n///+++++++++++++++++++++++++++++|"<<
                    "\n/// Лечить.                     |"<<
                    "\n///+++++++++++++++++++++++++++++:\n";
                    doctor(fate[i]);
                    LOG(hp); LOGE(mp);
                    break;
           
                case 3:
                    BANNER
                    "\n///***************************************|"<<
                    "\n/// Медитация.                            |"<<
                    "\n///***************************************:\n";
                    meditate(fate[i]);
                    LOG(hp); LOGE(mp);
                    break;
            
                case -1:
                    BANNER
                    "\n///~~~~~~~~~~~~~~конец истории..."<<
                    "\n/// Линия судьбы закончилась.   |"<<
                    "\n///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:\n";
                    LOG(hp); LOGE(mp);
                    return;
                
                default:
                    BANNER
                    "\n///.............................|"<<
                    "\n/// Неизвестная команда.        |"<<
                    "\n///.............................:\n";
                    LOG (i); LOGE(fate[i]);
            }
            i++;
        }
    }
    
private:
    int* fate;
    int i;
    
    int load_hp(int _hp)
    {   if(_hp > hp_max)
        {   return hp_max;
        }
        else  return _hp;
    }
    
    bool damage(int dam)
    {   hp -= dam;
        if(hp > 0) return false;
        return true;
    }
    void doctor(int doc)
    {   if(mp > 20)
        {   hp += doc;
            if(hp > hp_max) hp = hp_max;
            mp -= mp_need;
        }
        else
        {   std::cout << "Недостаточно маны!\n";
        }
        
    }
    void meditate(int med)
    {   mp += med;
    }
};
 
///----------------------------------------------------------------------------|
/// Start
///----------------------------------------------------------------------------:
int main()
{   setlocale(0, "");
    
    BANNER
    "\n///ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo|"<<
    "\n///                      Запуск программы.                          |"<<
    "\n///ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo:\n";
    
    {   int fate[] = 
        {   100, 150, 50, 20, 
            1, 50, 2, 20, 1, 30, 2, 30, 2, 10, 3, 60, 2, 20, -1
        };
        sPers pers("Вася", fate);
    }
    
    {   int fate[] = 
        {   50, 40, 50, 10,
            1, 20, 2, 10, 1, 40, 2, 20, -1
        };
        sPers pers("Джон", fate);
    }
    
    BANNER
    "\n///ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo|"<<
    "\n///                 Программа закончила работу.                     |"<<
    "\n///ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo:\n";
    std::cin.get();
    return 0;
}
[ATTACH]1065157[/ATTACH]
ваша критика или пожелания?
1
Миниатюры
Эмуляция действий персонажа  
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 580
07.09.2019, 07:09  [ТС] 5
XLAT, пока много непонятно, постараюсь разобраться, спасибо)
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 580
10.09.2019, 10:08  [ТС] 6
XLAT, подскажите пожалуйста, если я заполню fate как вектор, то уже структура, которая была в вашем варианте не подойдет ?

я хотела переделать немного, получилось вот так:
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
83
84
85
86
87
88
89
#include <iostream>
#include <vector>
 
using namespace std;
 
struct sPers {
    sPers(vector<int> _fate) : fate(_fate), i(4) {
        hp_max = fate[0];
        hp = load_hp(fate[1]);
        mp = fate[2];
        mp_need = fate[3];
 
        std::cout << hp_max << " " << hp << " " << mp << " " << mp_need;
        to_live();
    }
 
    int hp_max, hp, mp, mp_need;
    const char* name;
 
    void to_live() {
        while (true) {
            switch (fate[i++]) {
            case 1:
                if (damage(fate[i])) {
                    std::cout << hp << " " << mp;
                    return;
                }
                std::cout << hp << " " << mp;
                break;
            case 2:
                doctor(fate[i]);
                std::cout << hp << " " << mp;
                break;
            case 3:
                meditate(fate[i]);
                std::cout << hp << " " << mp;
                break;
            case -1:
                std::cout << hp << " " << mp;
                return;
            default:
                std::cout << i << " " << fate[i];
            }
            i++;
        }
    }
 
private:
    vector<int> fate;
    int i;
 
    int load_hp(int _hp) {
        if (_hp > hp_max) {
            return hp_max;
        }
        else  return _hp;
    }
 
    bool damage(int dam) {
        hp -= dam;
        if (hp > 0) return false;
        return true;
    }
    void doctor(int doc) {
        if (mp > 20) {
            hp += doc;
            if (hp > hp_max) hp = hp_max;
            mp -= mp_need;
        }
        else {
            std::cout << "Недостаточно маны!\n";
        }
    }
    void meditate(int med) {
        mp += med;
    }
};
 
int main() {
    setlocale(0, "");
    vector<int> fate;
    int val{};
    while (cin >> val && val != -1)
        fate.push_back(val);
    sPers pers(fate);
 
    std::cin.get();
    return 0;
}
но у меня вылетает программа
0
бах-бах и в продакшен!
3032 / 1635 / 573
Регистрация: 23.09.2014
Сообщений: 5,084
Записей в блоге: 4
10.09.2019, 11:34 7
ElKros, если коротко, как вы любите, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
...
 
int main()
{   setlocale(0, "");
    vector<int> fate;
    int val {};
 
    while (cin >> val && val != -1)
        fate.push_back(val);
 
    fate.push_back(-1); /// Ваша ошибка: 
                        /// Вы забыли про конец массива,
                        /// который терминируется значением -1.
 
    sPers pers(fate);
 
    std::cin.get();
    return 0;
}
разумеется для работы с вектором код программы лучше переделать,
в частности использовать тот факт что вектор знает свой размер,
ну и конешно куда без итераторов.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 580
10.09.2019, 11:46  [ТС] 8
XLAT, так, а при вводе добавляется уже -1
0
бах-бах и в продакшен!
3032 / 1635 / 573
Регистрация: 23.09.2014
Сообщений: 5,084
Записей в блоге: 4
10.09.2019, 12:10 9
Цитата Сообщение от ElKros Посмотреть сообщение
так, а при вводе добавляется уже -1
нет
при вводе -1 до fate.push_back(val); не доходит, т.к. происходит вылет из while.

а в чем сложность то: самим проверить???

вот:
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
int main()
{   setlocale(0, "");
    vector<int> fate;
    int val;
 
    while (cin >> val && val != -1)
        fate.push_back(val);
 
  //fate.push_back(-1); /// Ваш ошибка: 
                        /// Вы забыли про конец массива,
                        /// который терминируется значением -1.
    
    ///-----------------------------------------------------------|
    /// Смотрим содержимое fate.                                  |
    ///-----------------------------------------------------------:
    cout << "\nКоличество элементов в fate = "<< fate.size() << "\n";
    for(int i = 0; i < fate.size(); i++)
        cout << "fate[" << i << "] = " << fate[i] << "\n";
        
    cout << "\nАХТУНГ! Если продолжить, то дальше будет БЕЛИБЕРДА!!!\n";
    
    ///-------------|
    /// Пауза.      |
    ///-------------:
    std::cin.clear();
    std::cin.sync();
    std::cin.get();
 
    sPers pers(fate);
 
    std::cin.get();
    return 0;
}
Эмуляция действий персонажа
0
бах-бах и в продакшен!
3032 / 1635 / 573
Регистрация: 23.09.2014
Сообщений: 5,084
Записей в блоге: 4
10.09.2019, 12:44 10
можно исправить и вот так:
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
...
 
int main()
{   setlocale(0, "");
    vector<int> fate;
    int val = 0;
 
    while (val != -1)
    {   cin >> val;
        fate.push_back(val);
    }
    
    ///-----------------------------------------------------------|
    /// Смотрим содержимое fate.                                  |
    ///-----------------------------------------------------------:
    cout << "\nКоличество элементов в fate = "<< fate.size() << "\n";
    for(int i = 0; i < fate.size(); i++)
        cout << "fate[" << i << "] = " << fate[i] << "\n";
    
    ///-------------|
    /// Пауза.      |
    ///-------------:
    std::cin.clear();
    std::cin.sync();
    std::cin.get();
 
    sPers pers(fate);
 
    std::cin.get();
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2019, 12:44

Передвижение персонажа
Всем здравствуйте! У меня возникла проблема с передвижением персонажа. Я в интернете много искала...

Вращение персонажа
2D игра,вид сверху,необходимо сделать так,чтобы персонаж поворачивался за курсором мышки,как...

Движение персонажа
Всем привет! Подскажите как сделать движение персонажа на С# как в игре Subway surfers?

Создание персонажа
Подскажите с чего начать, как это все делается, какой нить алгоритм действий


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.