Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
FybaK
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
1

Взаимодействие классов

03.02.2015, 21:56. Просмотров 471. Ответов 9
Метки нет (Все метки)

Решил потренироваться и написать "игру". Есть класс игрок и класс бот. Как наладить их взаимодействие?
З.Ы. да, я знаю, что в классах нет инклюдов друг друга.

main.cpp
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "player.h"
#include "bot.h"
using namespace std;
 
int main()
{
 
    Player player1;
    player1.setName();
 
    Bot player2;
 
    cout<<"Бой начинается!"<<endl;
    int order=0;
    player2.setRandomDefendPoint();
    while((player1.getHp()>0)&&(player2.getHp()>0))
    {
        order++;
        if((order%2)==0)
        {
            player2.setRandomDefendPoint();
            player2.setRandomAttackPoint();
            player2.hit(&player1);
            cout<<endl<<"вы "<<player1.getHp()<<" противник "<<player2.getHp()<<endl<<endl;
        }
        else
        {
            player1.setDefendPoint();
            player1.setAttackPoint();
            player1.hit(&player2);
        }
    }
 
    if(player1.getHp()<=0)
    {
        cout<<endl<<player2.getName()<<" победил"<<endl;
    }
    else
    {
        cout<<endl<<player1.getName()<<" победил"<<endl;
    }
    return 0;
}

bot.h
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
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
class Bot
{
private:
 
    string name = "Bot";
    int hitPoint = 100;
    int defendPoint;
    int attackPoint;
public:
    void setName()
    {
        cout<<"Введите имя бота"<<endl;
        cin>>name;
    }
 
    string getName()
    {
        return name;
    }
 
    int getHp()
    {
        return hitPoint;
    }
 
    void setRandomDefendPoint()
    {
        defendPoint = (rand()%4)+1;
        return;
    }
 
    int getDefendPoint()
    {
        return defendPoint;
    }
 
    void setRandomAttackPoint()
    {
        attackPoint = (rand()%4)+1;
        return;
    }
 
    int getAttackPoint()
    {
        return attackPoint;
    }
 
    void hit(Player *play)
    {
        int damage =(rand()%9)+1;
        if(play->getDefendPoint()==attackPoint)
        {
            damage/=2;
            play->receiveDmg(damage);
                        cout<<getName()<<", атаковал вас, но благодаря вашей интуиции вы смогли вовремя поставить блок."
                            <<" Урон составил "<<damage<<" очков"<<endl;
        }
        else
        {
            play->receiveDmg(damage);
                        cout<<getName()<<", провел успешную атаку."
                            <<" Урон составил "<<damage<<" очков"<<endl;
        }
        return;
    }
 
    void receiveDmg(int dmg)
    {
        hitPoint -= dmg;
        return;
    }
 
};

player.h
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
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
class Player
{
private:
 
    string name;
    int hitPoint = 100;
    int defendPoint;
    int attackPoint;
public:
    void setName()
    {
        cout<<"Введите игрока"<<endl;
        cin>>name;
    }
 
    string getName()
    {
        return name;
    }
 
    int getHp()
    {
        return hitPoint;
    }
 
    void setDefendPoint()
    {
        cout<<"Выберите точку защиты"<<endl
            <<"1 - голова"<<endl
            <<"2 - тело"<<endl
            <<"3 - ноги"<<endl
            <<"4 - руки"<<endl;
        cin>>defendPoint;
 
    }
 
    int getDefendPoint()
    {
        return defendPoint;
    }
 
    void setAttackPoint()
        {
            cout<<"Выберите точку атаки"<<endl
                <<"1 - голова"<<endl
                <<"2 - тело"<<endl
                <<"3 - ноги"<<endl
                <<"4 - руки"<<endl;
            cin>>attackPoint;
 
        }
 
    int getAttackPoint()
    {
        return attackPoint;
    }
    void hit(Bot *play)
    {
        int damage =(rand()%9)+1;
        if(play->getDefendPoint()==getAttackPoint())
        {
            damage/=2;
            play->receiveDmg(damage);
                        cout<<getName()<<", вы попали, но противник предугадал ваши действия и поставил блок."
                            <<" Урон составил "<<damage<<" очков"<<endl;
        }
        else
        {
            play->receiveDmg(damage);
                        cout<<getName()<<", вы провели успешную атаку."
                            <<" Урон составил "<<damage<<" очков"<<endl;
        }
        return;
    }
 
    void receiveDmg(int dmg)
    {
        hitPoint -= dmg;
        return;
    }
 
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2015, 21:56
Ответы с готовыми решениями:

Взаимодействие классов
Допустим, в первом классе у нас объявлена какая-либо переменная, например...

Взаимодействие Двух классов.
Собственно такая проблема: 1 класс использует другой в некоторых ситуациях,...

Двухстороннее взаимодействие классов
Добрый день ! Столкнулся с такой технической проблемой. Есть два класса...

Разбор полётов: взаимодействие классов
Всем снова здравствуйте, и на этот раз у меня вот такой вопрос: Существует...

Как реализовать взаимодействие классов?
Создаю новую тему ибо новая проблема. Дело в том, что BaseLcd - абстрактная...

9
rocknrolla1
Заблокирован
03.02.2015, 22:20 2
FybaK, я бы начал разработку с абстрактного класса персонажа. От него бы сделал производные классы бота и игрока. Так будет правильней и проще взаимодействовать.
1
FybaK
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 22:29  [ТС] 3
Добавлено через 2 минуты
rocknrolla1, Хорошо, так и сделаю. А как сделать так, чтоб эти классы видели друг друга?
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,687
03.02.2015, 22:33 4
объявить его
например
C++
1
2
3
4
5
6
7
8
9
class A;
class B
{
A *a;
}
class A
{
B *b;
}
1
FybaK
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 22:37  [ТС] 5
ValeryS, forward declaration of ‘class Player’
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,687
03.02.2015, 22:54 6
Цитата Сообщение от FybaK Посмотреть сообщение
А как сделать так, чтоб эти классы видели друг друга?
вообще не очень хорошая идея
а завтра другого игрока /бота придумаешь всю архитектуру переписывать?
создай
Цитата Сообщение от rocknrolla1 Посмотреть сообщение
с абстрактного класса персонажа.
и в нем создай виртуальную функцию взаимодействия, можно чисто виртуальную, потом в наследниках переопределишь
например
C++
1
2
3
4
5
class ParentUnion
{
 
virtual Adventur(ParentUnion *pu)=0;
}
и вот этой функции передавай того персонажа который должен взаимодействовать с текущим

типа
C++
1
2
3
User us;
Boot bt;
us.Adventur(&bt);
0
FybaK
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 23:00  [ТС] 7
ValeryS, Я уже понял, что так надо делать. Просто ради опыта хочу сделать так, чтоб они видели друг друга.
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,687
03.02.2015, 23:09 8
Цитата Сообщение от FybaK Посмотреть сообщение
Просто ради опыта хочу сделать так, чтоб они видели друг друга.
предупрежу на всякий случай
ни в коем случае не делай так
C++
1
2
3
4
5
6
7
8
9
class A;
class B
{
A a;
}
class A
{
B b;
}
при создании объекта(может быть и при компиляции) повиснешь
надо создать объект класса B, а какой у него размер?
ага в него входит объект класса A, а у него какой размер
в него входит объект класса B, какой размер
и пойдет по кругу
0
FybaK
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 5
03.02.2015, 23:20  [ТС] 9
ValeryS, Ну, я так сделал. Ошибка forward declaration of ‘class Player’
0
ValeryS
Модератор
7264 / 5518 / 692
Регистрация: 14.02.2011
Сообщений: 18,687
03.02.2015, 23:26 10
Цитата Сообщение от FybaK Посмотреть сообщение
Ошибка forward declaration of ‘class Player’
код покажи
точнее выжимки из кода
все что не относится к проблеме можно опустить
0
03.02.2015, 23:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2015, 23:26

Взаимодействие объектов разных классов
Я или туплю или чего-то не понимаю\не до понимаю. Вопрос в самом коде. class...

Взаимодействие между объектами единой иерархии классов
Здравствуйте. У меня есть некоторый базовый класс window, который создает...

Как реализовать взаимодействие классов в игре "Змейка"
Всем привет. Я пишу змейку и у меня следующий вопрос. У меня есть несколько...


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

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

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