0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 5
1

Class, переменные и взаимодействие между ними

24.10.2020, 21:57. Показов 489. Ответов 7
Метки c++ (Все метки)

Дорого времени суток господа уважаемые. Немного предыстории, дабы после некоторые не ругались - какой ты тупой или что-то в этом духе.

Для моих нужд потребовалось начать изучать с++ и уже неделю с хвостиком этим занимаюсь, очень активно читаю всякое, но почти везде приводят в пример простейшие примеры, которые повторить или немного видоизменить не сложно, но как только дело доходит до чего-то посложнее - ахтунг. Я человек, которому всё проще постичь на практике и с++ точно также, как-то овладел же 3Д графикой, риггом и самой анимацией за 6 месяцев то, и тут разберусь. Но там всё проще ибо ты видишь перед собой результат, в с++ немного иначе, поэтому я решил учиться делая типо игру, консольную естественно, как в 60-70 ))) и столкнулся с целым рядом проблем из-за не понимания сленга. Все уроки оперируют одними и теми же понятиями в перемешку и ты ничерта не понимаешь ибо примеры не приводят, дабы было с чем ассоциироваться, приходится опытным путём всё постигать, а это время. В общем я новенький, прям кепка всем кепкам )))

Проблема вот в чём. Мне нужно произвести расчёты между переменными, вроде как всё просто, но не тут-то было, для меня уж точно.

Код ниже лишь вырезка из общего, общий в самом низу, но он длинноват. Также я пока не разбивал на заголовки эти или как они там называются с припиской .h, ибо я пытаюсь понять принцип работы, а потом уже буду мучать себя с ними. Теперь задача, которая стоит передо мной.

Надо, чтобы монстр, мог нанести урон игроку, но при этом, чтобы учитывались показатели игрока, а именно его HP и его броня, которая лишь уменьшает входящий урон в процентах. Единственный известный мне вариант это через присвоение Units player и Units enemy и дальше понеслась player.hp-=enemy.dmg; и так далее, но это в main(), а мне надо, чтобы это работало внутри вызываемой функции Attack_AI. Как это сделать я не знаю (((((( второй день сижу по 18часов и не могу понять, глаза уже как у совы.
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
    class Library
{
public:
//  string name, Head, Torso;
    int hp, hpUpper, hpMin, hpMax, lvl, dmg, dmg2, dmgMin, dmgMax, randChance;
    double defHead, defTorso;
};
 
class Unit: public Library
{
public:
    void defense()// броня, а точнее её показатель, который вычисляется в процентах
    {
        defHead = 0.9;// это проценты которые снимаются с урона!!!!
        defTorso = 0.5;
    }
    void attack_AI()//просчёт урона врага
//Тут делется выбор между атакой в голову или торс и результат нанесённого урона
//Из name1.hp отнимать name2.dmg. как иначе, не знаю пока!!!!
    {
        randChance = rand() % 100 + 1;
        if (randChance>=0)
        {
            randChance = rand() % 100 + 1;
            if (randChance >= 0)
            {
                dmg = -1;
                while (dmg < dmgMin)
                {
                    dmg = (dmgMin + rand() % dmgMax - dmgMin);// знаю что можно убрать dmgMin, мне так проще понимать сейчас - что я делаю и как оно работает, на финале уберу )))
                }
                dmg *= 3;
                dmg2= dmg*defHead;
                dmg = dmg-dmg2;
                cout << name << " Damaged you in Head by: " << dmg << "\n";
            }
            else
                cout << name << " trying attack you in Head, but missing\n";
        }
    }
 
};
 
int main()
{
    srand(time(0));
    /////////////////////////////////////////////
    setlocale(LC_ALL, "Russian");//Руссификация//
    /////////////////////////////////////////////
 
    Unit player;
    Unit enemy;
    enemy.attack_AI();
};
ПОЛНЫЙ КОД
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
// SoftWare_1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
#include <iostream> // Импорт библиотеки ввода-вывода
#include <string> // это необходимо для использования строковых переменных!
#include <cstdlib> // для функций rand() и srand()
#include <ctime> // для функции time()
#include <windows.h>// для аналога delay - sleep(xxxx), еду х это милисекунда, то есть для 1 секунды надо 1000
#include <cmath>//содержит прототипы основных математических функций
using namespace std; // позволяет нам писать оператор cout. вместо std::cout
using std::string;// Замена using namespace std. В чём отличее не зна, но профи говорят этот вариант самый верный и без баговый
 
class Library
{
public:
    string name, Head, Torso;
    int hp, hpUpper, hpMin, hpMax, lvl, dmg, dmg2, dmgMin, dmgMax, bonExp, bonGold, gold, randChance;
    double exp, expUpper, defHead, defTorso;
};
 
class Unit: public Library
{
public:
    void stat()// стата всех мобов включая игрока. просто для объявления, по сути типо базы с которой всё копается. значения внутри не важны... почти
    {
        name = "Player";
        hp = 100;
        hpUpper = 100;
        hpMin = 50;
        hpMax = 200;
        lvl = 0;
        exp = 0;
        expUpper = 100;
        dmg = 10;
        dmgMin = 1;
        dmgMax = 10;
    }
    void statShowEnemy()//стата врага
    {
        cout<<"\nХарактеристика врага\n"<<"Имя: "<<name<<"\nЗдоровье: "<<hp<<"/"<<hpUpper<<"\nУрон: "<<dmgMin<<"-"<<dmgMax<<"\n";
    }
    void statShowPlayer()//стата игрока
    {
        cout << "\nХарактеристика врага\n" << "Имя: " << name << "\nУровень: " << lvl << "\nОпыт: " << exp << "/" << expUpper << "\nЗдоровье: " << hp << "/" << hpUpper << "\nУрон: " << dmgMin << "-" << dmgMax;
    }
    void dmgDeal()/// урон для врага.
    {
        hp -= dmg;
        if (hp<=0)
        {
            cout << name << " die";
        }
    }
    void dmgDeal_p()//урон для игрока и если hp 0 или ниже, то .... увидэшъ ))))
    {
        hp -= dmg;
        if (hp <= 0)
        {
            for (int i = 1; i > hp; i++)
            {
                cout <<"\nYou die\nGame Over\n";
            }
        }
    }
    void lvlUpCheack()//проверка на lvl up. Обязательна приписка enemy#.lvlUpCheack;
    {
        while (exp>=expUpper)
        {
            exp = exp - expUpper;
            lvl += 1;
            expUpper *=1.15;
            hpUpper += 12;
            hp = hpUpper;
        }
    }
    void RandomMonsterSpawn_lvl_low()//рандомно назначает значения урона и хп для врагов низкого уровня, так же назначает награду в виде опыта и денег за его убийство
    {
        hpMin = 1 + rand() % 5;
        while (hpMax<=hpMin)
        {
            hpMax = hpMin + rand() % 30 - hpMin;
        }
        hp = hpMin + rand() % hpMax;
        hpUpper = hp;
 
        dmgMin =1+ rand() % 5;
        dmgMax = 0;
        while (dmgMax<=dmgMin)
        {
            dmgMax = dmgMin + rand() % 15 - dmgMin;
        }
        bonExp = ((dmgMin + dmgMax)/3) + (hp / 4);
        bonGold = ((dmgMin + dmgMax) / 2) + (hp / 2)+5;
        while (true)//выбираем имя из библиотеки написанной прямо тут!!! Шанс рандомный. Дипозон можно менять разный в пределах 100. выбирет всё равно только 1.
        {
            randChance = rand()%100;
            if ((randChance>0)&&(randChance<10))
            {
                name = "Little Rat";
                break;
            }
            if ((randChance > 10) && (randChance < 20))
            {
                name = "Rat";
                break;
            }
            if ((randChance > 20) && (randChance < 30))
            {
                name = "Little Hobit";
                break;
            }
            if ((randChance > 30) && (randChance < 40))
            {
                name = "Gamunkul";
                break;
            }
            if ((randChance > 40) && (randChance < 50))
            {
                name = "Baby Putin";
                break;
            }
            if ((randChance > 50) && (randChance < 60))
            {
                name = "Заебало уже писать имена, это блять тест!!!ы";
                break;
            }
        }
        cout << "На вас напали";
        statShowEnemy();
    }
    void endBattle()// даёт опыт и золото после боя
    {
        exp += bonExp;
        gold += bonGold;
    }
    void defense()// броня, а точнее её показатель, который вычисляется в процентах
    {
        defHead = 0.9;// это проценты которые снимаются с урона!!!!
        defTorso = 0.5;
    }
    void attack_AI()//просчёт урона врага//Тут делется выбор между атакой в голову или торс и результат нанесённого урона//Из name1.hp отнимать name2.dmg. как иначе, не знаю пока!!!!
    {
        randChance = rand() % 100 + 1;
        if (randChance>=0)
        {
            randChance = rand() % 100 + 1;
            if (randChance >= 0)
            {
                dmg = -1;
                while (dmg < dmgMin)
                {
                    dmg = (dmgMin + rand() % dmgMax - dmgMin);
                }
                dmg *= 3;
                dmg2= dmg*defHead;
                dmg = dmg-dmg2;
                cout << name << " Damaged you in Head by: " << dmg << "\n";
            }
            else
                cout << name << " trying attack you in Head, but missing\n";
        }
        else if (randChance <= 69)
        {
            randChance = rand() % 100 + 1;
            if (randChance >= 20)
            {
                dmg = -1;
                while (dmg < dmgMin)
                {
                    dmg = (dmgMin + rand() % dmgMax - dmgMin);
                }
                dmg2 = dmg * defTorso;
                dmg -= dmg2;
                cout << name << " Damaged you in Torso by: " << dmg << "\n";
            }
            else
                cout << name << " trying attack you in Torso, but missing\n";
        }
    }
 
};
 
int main()
{
    srand(time(0));
    /////////////////////////////////////////////
    setlocale(LC_ALL, "Russian");//Руссификация//
    /////////////////////////////////////////////
 
    Unit player;
    Unit enemy;
    //player.stat();
    //enemy.stat();
    enemy.defHead = 0.99;
    enemy.RandomMonsterSpawn_lvl_low();
    enemy.attack_AI();
    player.hp -= enemy.dmg;
    
 
 
//system("pause");
return 0;
}
Добавлено через 2 часа 46 минут
Нет я конечно понимаю, что тексту много, читать лень, ну его, но хоть какой-то теоритический пример написать можно? Я ведь не прошу решить проблему за меня, мне нужно понять. Не я и сам конечно смогу 100% понять, но одно дело когда это будет, завтра или через неделю, разница ощутима)))

Если уж так много текста, я уменьшу его тут, до самого сущего. (я бы внёс изменения в исходник, но как вы понимаете, сделать не могу, так как сайт не позволят)

ВОПРОС
Надо, чтобы монстр, мог нанести урон игроку, но при этом, чтобы учитывались показатели игрока, а именно его HP и его броня, которая лишь уменьшает входящий урон в процентах. Единственный известный мне вариант это через присвоение Units player и Units enemy и дальше понеслась player.hp-=enemy.dmg; и так далее, но это в main(), а мне надо, чтобы это работало внутри вызываемой функции Attack_AI. Как это сделать я не знаю (((((( второй день сижу по 18часов и не могу понять, глаза уже как у совы.
Я не хочу просто объявлять переменные и с ними играться в main(), надо научиться работать с class (я не знаю как они верно называются если честно, я называю классами, ибо слово class, как класс, как не странно). Почему мне надо именно так? Чтобы не писать код на 100500 строк, когда можно сделать это буквально в 100-200 (я про main если что).

Моя логика выглядит как-то так(если кому интересно естественно, скорее всего ни кому, ну да ладно):
Перед мной стоит задача -
1. сделать так, чтобы враг мог нанести мне урон. Решается просто созданием структуры с интовыми переменными урон и дамага, изи мэн.
2. Враг может напасть в ответ. Решается точно также, работаем через player.hp-=enemy.dmg; иииизи, финк эбаут ит
3. Дали шекелей и опыта. Ну в принципе ничего не меняется, но постой, мне всё это придётся делать кодом и прописывать каждый бой, скриптуя? А не рехнусь ли я уже на 100-200 строке кода? Нее, надо что-то другое думать. (тут я начал познавать эти классы, там про указатели что-то начали мне в уши лить, я так и не понял на кой они нужны и нужны ли воообще).
4. Теперь у меня есть класс с пафосным названием - библиотека, где хранятся все переменные разных мастей, теперь надо просто создать новый класс, который унаследует всё от библиотеки, еее, чётко, работает, я молодец, дааааа.
5. Написать функции с разного рода просчётами, где цифр будет минимум. Есть, не сложно (на самом деле - 20ч жизни и упаковки табака, чтобы смекнуть как верно считать, дело даже не в коде, а в математике, по которой у меня в школе было 2 3 2 3 3 2, чёт увлёкся).
6. Я все просчёты делал внутри функций и это круто, даже в некоторые фнкции стал впихивать другие ранее написанные функции(сам смекнул если что, сработало, может по оптимизации просадка, я не знаю, я нубас в кодинге, всего 7-9 дней как заниматься им начал).
Но тут возникает проблема, когда я написав код вычесления осознаю, что мне нужно, чтобы одна из написанных тут переменных, работала...мммм, иначе. Я ведь привязал эти функции к одному классу Units и в Main() обзвал её нехорошим словом Units Player для игрока и Units Enemy для врага. Соответственно, когда я вызываю функцию я ведь пишу Player.FUNCTION_name(); а эта функция, одна из переменных в ней, должна брать информацию из enemy.etc. То есть должна взять информацию из enemy и зафигачить её в в функцию от player КАК ЭТО КОЛДУНСТВО осуществить, я не знаю... Я обязательно попробую разделить это на 2 разных класса, но это всё равно не даст мне ничего совершенно, ведь от этого не изменится тот факт, что функция ссылается на собственные данные своего созданного класса.

Не по теме:

ПОСЛЕСЛОВИЕ, не рекомендуется к прочтению НИКОМУ
Я бы объяснил вашим языком с употреблением 100500 специальных словечек, но я их чёрт возьми не знаю, а прочитать определение не тоже самое, что понять. Я учил людей 3Д графике и зная, что они профаны, всегда искал термины максимально нейтральные и понятные в обиходе и не топил их, когда давал ответ на их вопрос. Примера ради - мне задают вопрос: как сделать так, чтобы объект, был из двух частей, а выглядел как один. Да тут ещё понять надо, что имеет ввиду, но, так как я специалист уже в том вопросе, я понял сразу (вру, было 2 варианта о чём он :) ). Я мог начать ему быстро отвечать спец словечками и ответ свёлся бы к такому: Если это единый Mesh, то группой сглаживания, если это 2 Mesh'а, то просто вершины склей в местах разрыва. Я бы потратил на это буквально секунды, но я заморочился и дал ответ побольше с примером даже, это заняло целых 10 минут, но с тех пор, человек мне не то, чтобы спасибо говорит почти при каждой нашекй встрече, он за меня начал другим помогать, облегчая мою ношу. Никогда не понимал, что сложного в 3д графиике, сестру учили 3 года, ничерта не научилась, как и почти весь курс, я за 3 месяца уже человека слепил, а через месяц уже учить сам начал, бесплатно кстати, но сейчас я не учу, я сам учусь и как могли понять , я учусь кодить, дабы после учить других кодить и облегчить вашу ношу)
P.S. хотел по короче, получилось как всегда, извиняюсь, такова моя натура, обожаю писать, я так-то сценарист по идее, а занимаюсь чем угодно, только не этим.... Мдэ

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2020, 21:57
Ответы с готовыми решениями:

Динамическое подключение DLL библиотек и взаимодействие между ними
Здравствуйте, никогда раньше не обращался на форумы за помощью, но тут совсем дубняк. Суть вот в...

Создать 2 целые переменные и определить «расстояние» между ними в памяти
// dz13_3.cpp : Defines the entry point for the console application. // Создать 2 целые переменные...

Потоки и взаимодействие между ними
Всем привет! С потоками вот только начал разбираться, поэтому вопрос нубский. Каким образом...

Два потока и взаимодействие между ними
всем привет, прочел куча материала по потокам, так и не нашел для себя ответа есть основной класс...

7
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,282
24.10.2020, 22:12 2
Ka3ah, функции(методы) могут принимать параметры. И это обычный способ организовать взаимодействие между разными объектами. Возьмите хорошую книгу по С++ (Липпмана, например) и изучайте язык по ней, а не методом тыка или по видосикам.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 5
24.10.2020, 22:22  [ТС] 3
Мммм, 1100 страниц текста, сухого текста, того же, что я читал 2 дня назад, только там было 200 страниц. Да я больше узнал из метода тыка, нежели от прочтения прошлой книги на 200 страниц, меня там учили пол книги как переменную создать и объявлять. Может хотя бы пример можно получить из описанного мной выше? Это, ведь, самое простое, что можно сказать - иди читай книги. Оно мне не даст ничего совершенно по одной простой причине - все примеры примитивны и совершенно никак друг с другом не связаны из-за чего получается, что каждый пример это просто х, y и какой-то результат. Ладно, спасибо и на этом, не особо то и верил, что тут мне смогут помочь, как впрочем и обычно в снг сегменте. Пойду по старинке, как с графикой было, там мне тоже говорил, что не поможет метод тыка, а теперь я им объясняю кучу вещей, и с анимацией было тоже самое. Каждый раз одно и то же, сколько можно!
0
5232 / 2886 / 1208
Регистрация: 07.02.2019
Сообщений: 7,282
24.10.2020, 22:35 4
Цитата Сообщение от Ka3ah Посмотреть сообщение
Да я больше узнал из метода тыка, нежели от прочтения прошлой книги на 200 страниц
За 200 страниц можно узнать разве что какой стороной вставлять вилку в розетку.

Цитата Сообщение от Ka3ah Посмотреть сообщение
Это, ведь, самое простое, что можно сказать - иди читай книги.
Можно отправить на какой-нибудь гитхаб читать код. Только всё это будет для вас филькина грамота. Без теории заниматься "экспериментами" - бессмысленное занятие. С++ сложный язык. И если хотите решать с его помощью задачи, вам придется прочитать куда больше, чем 1000 страниц. И написать ещё больше строк кода. Настоятельно рекомендую освоить базовый курс по предложенной книге.
0
1158 / 821 / 357
Регистрация: 26.02.2015
Сообщений: 3,700
24.10.2020, 22:52 5
Цитата Сообщение от Ka3ah Посмотреть сообщение
ибо я пытаюсь понять принцип работы, а потом уже буду мучать себя с ними.
Обычно сначала проводят анализ и проектирование, а уже после этого занимаются разработкой кода.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Возьмите хорошую книгу по С++ (Липпмана, например) и изучайте язык по ней
Это очень дельный совет.
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,967
25.10.2020, 00:41 6
Цитата Сообщение от Ka3ah Посмотреть сообщение
ВОПРОС
Надо, чтобы монстр, мог нанести урон игроку, но при этом, чтобы учитывались показатели игрока, а именно его HP и его броня, которая лишь уменьшает входящий урон в процентах. Единственный известный мне вариант это через присвоение Units player и Units enemy и дальше понеслась player.hp-=enemy.dmg; и так далее, но это в main(), а мне надо, чтобы это работало внутри вызываемой функции Attack_AI. Как это сделать я не знаю (((((( второй день сижу по 18часов и не могу понять, глаза уже как у совы.
Я не хочу просто объявлять переменные и с ними играться в main(), надо научиться работать с class (я не знаю как они верно называются если честно, я называю классами, ибо слово class, как класс, как не странно). Почему мне надо именно так? Чтобы не писать код на 100500 строк, когда можно сделать это буквально в 100-200 (я про main если что).
Возможно толкнет в правильном направлении: Проверить объект в std::bind на живучесть
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 5
27.10.2020, 19:53  [ТС] 7
В общем я последовал совету про книгу и ещё одну нашёл и начал как чумачечий читать и пробовать. Но вот опять незадача, чт-то явно делаю не так, а что ну просто не понять!!! Я уже и через указатель этот пошёл в материнском классе на вспомогательные и вроде всё окей, а при отладке всё равно говорит какую-то ерунду. В этих книгах не слово про подобные ошибки, только блин про Х и Y абстрактный всё, даже близко ничего подобного нет, а по крупицам собирать такое себе удовольствие. aaa Ma ei saa aru....
Class, переменные и взаимодействие между ними
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,967
27.10.2020, 20:57 8
Цитата Сообщение от Ka3ah Посмотреть сообщение
а что ну просто не понять
Указатели у вас есть. А вот на что они указывают? Стало быть, объекты должны быть нужных классов, указатели на которые у вас заведены. Но объектов у вас нет (точнее указатель не инициализирован адресом реально существующего объекта), а доступ по указателю, который не указывает на объект, приводит вот к таким ошибкам.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2020, 20:57
Помогаю со студенческими работами здесь

Взаимодействие контроллеров домена при обрыве соединения между ними
Есть DC1 - основной контроллер домена (dc1.domain.com) и DC2 дополнительный контроллер домена...

Кто подскажет какая между ними разница (Object and class)
Кто подскажет какая между ними разница

Потоки, глобальные переменные и обмен данными между ними
Имеется два потока (А и Б) которые каждую минуту генерируют число. Также имеются две переменные...

Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили пе
Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить...

Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними чер
Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить...

Взаимодействие с элементом HTML через class
Возможно ли воссоздать нечто подобное var id_menu = new Array('subMenu'); startList = function...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru