Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
1

Классы и объекты. Прошу проверить правильность

07.05.2020, 22:57. Показов 774. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго, коллеги.

Вот дошел до изучения классов, начирикал небольшой примерчик для себя, в котором игроку либо прибавляется жизнь либо наоборот.
Попросил бы если можно проверить, правильно ли я понял эту тему? Ну то есть, в реальных программах так делается то вообще? Приветствую любую конструктивную критику, дабы на начальном этапе не привыкнуть делать не правильно!

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
/// КЛАСС - class_get_heart
 
#include <windows.h>
#include <iostream>
using namespace std;
 
class get_heart
{
    public:
    int green_heart;
    int yellow_heart;
    int red_heart;
    int grey_heart;
    int black_heart;
    int player_life = 5;      // одна жизнь персонажа = 5 делениям
    int x, y;
 
    public:
    void method_get_heart()   // метод добавляет/отнимает здоровье/жизнь персонажа
    {
       if (x == 14 && y == -6)
       {
           player_life = player_life + 1;                      // прибавляем 1 деление
           cout << "\n вы взяли зеленое сердечко (+ 1)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == 10 && y == 15)
       {
           player_life = player_life + 2;                      // прибавляем 2 деления
           cout << "\n вы взяли желтое сердечко (+ 2)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -14 && y == 11)
       {
           player_life = player_life + 5;                      // прибавляем 1 жизнь
           cout << "\n вы взяли красное сердечко (+ 1 жизнь)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -14 && y == -4)
       {
           player_life = player_life - 5;                      // отнимаем 1 жизнь
           cout << "\n вы взяли черное сердечко (- 1 жизнь)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -6 && y == -12)
       {
           player_life = player_life - 1;                      // отнимаем 1 деление
           cout << "\n вы взяли серое сердечко (- 1)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else
       {
           cout << "\n здесь пусто";
           cout << "\n уровень здоровья = " << player_life;
       }
 
    }
};
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
system("chcp 1251>0");
 
get_heart h1;    // создаем объект класса
h1.green_heart;
h1.yellow_heart;
h1.red_heart;
h1.grey_heart;
h1.black_heart;
h1.player_life;
h1.x;
h1.y;
 
cout << "\n начальный уровень здоровья = " << h1.player_life;
 
while (h1.player_life != 0)                             // цикл работает пока жинь персонажа не обнулится
{
    cout << "\n\n enter the coordinates ( х / y ): ";
    cin >> h1.x >> h1.y;
 
    h1.method_get_heart();                              // вызов метода класса на выполнение
 
    if (h1.player_life == 0 || h1.player_life < 0)      // как только счетчик уровня жизни = 0 или меньше 0
    {
        cout << "\n игра окончена!";                    // выводим сообщение
        return 0;                                       // завершаем игру
    }
}
 
 
system("pause>0");
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2020, 22:57
Ответы с готовыми решениями:

прошу проверить на правильность if ! ) так же прикрепил файл с блок -схемой и кодом
ln|x| при sinx+cos2x при z= x*x*x+1 при x+1/x*x+8 при ln...

Найти изображение функции (прошу проверить правильность решения)
Здравствуйте! Пожалуйста, проверьте, правильно ли выполнила задание? Найти изображение...

Прошу проверить правильность решения задач по теории принятия решений
Добрый день! Прошу проверить, правильно ли решены задания? Мой вариант выполнения и числовые...

Какова вероятность того, что хотя бы 450 поступивших выдержат испытания. Прошу проверить правильность решения
При поступлении в университет вступительные испытания выдерживают в среднем 25% абитуриентов. В...

36
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
07.05.2020, 23:15 2
R_U_S_V, хотелось бы узнать, для чего нужен class get_heart, если у него все поля public и половина логики в main? Какую сущность должен представлять get_heart: это игрок, игровое поле, игровая логика? Для чего строки 66-73?
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
07.05.2020, 23:19  [ТС] 3
Цитата Сообщение от valen10 Посмотреть сообщение
R_U_S_V, хотелось бы узнать, для чего нужен class get_heart, если у него все поля public и половина логики в main? Какую сущность должен представлять get_heart: это игрок, игровое поле, игровая логика? Для чего строки 66-73?
get_heart - это игрок, персонаж, который ходит по игровой локации

h1.player_life; в строке 73 используется в цикле и в условии - if

остальные строки)) хороший вопрос)) по ходу я их в коде пока никак не использую!
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
07.05.2020, 23:20 4
Цитата Сообщение от R_U_S_V Посмотреть сообщение
get_heart - это игрок
А почему он тогда называется get_heart, а не player?
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
07.05.2020, 23:37  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
А почему он тогда называется get_heart, а не player?
ААА, так надо оказывается!
Я подумал, что ведь класс овечает за присвоение уровней жизни так и назвал))
Ну вот собственно не зря народ зову! Знал, что что-то пойдет не так))

Добавлено через 14 минут
Цитата Сообщение от R_U_S_V Посмотреть сообщение
R_U_S_V, хотелось бы узнать, для чего нужен class get_heart, если у него все поля public и половина логики в main?
Вот как раз с public пока не очень разобрался, в книге написано, что нет четкого регламента когда как применять.
Я думал, что в main должно быть что-то! Не все же запихивать в класс? Или это не так и лучше все засунуть в класс?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
07.05.2020, 23:42 6
Цитата Сообщение от R_U_S_V Посмотреть сообщение
h1.player_life; в строке 73 используется в цикле и в условии - if
Если вы делаете player_life открытым членом, то обесцениваете наличие метода get_heart класса. В любой момент некий сторонний код может взять и сломать состояние, которое задано этим методом.
Ну, вы сейчас конечно же скажете, что вы не станете писать такой код, который будет что-то ломать.
А я вам скажу что вы в этом случае не совсем понимаете что такое инкапсуляция. И дам вот эту ссылку: Зачем нужна инкапсуляция?

Добавлено через 1 минуту
Цитата Сообщение от R_U_S_V Посмотреть сообщение
нет четкого регламента когда как применять.
Регламента нет, но есть логическая непротиворечивость. И вот ваша обязанность делать класс таким, чтобы в нем не было противоречий.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
07.05.2020, 23:46  [ТС] 7
Цитата Сообщение от DrOffset Посмотреть сообщение
Регламента нет, но есть логическая непротиворечивость. И вот ваша обязанность делать класс таким, чтобы в нем не было противоречий.
сейчас скрыл

C++
1
2
3
4
5
6
7
8
9
10
class player
{
    private:
    int green_heart;
    int yellow_heart;
    int red_heart;
    int grey_heart;
    int black_heart;
    int player_life = 5;      // одна жизнь персонажа = 5 делениям
    int x, y;
10 ошибок выдал компилятор

Классы и объекты. Прошу проверить правильность


Буду разбираться ...

Да, вижу, тема классов до меня еще не дошла!
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
07.05.2020, 23:48  [ТС] 8
ссылку принял, спасибо!
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
07.05.2020, 23:48 9
Цитата Сообщение от R_U_S_V Посмотреть сообщение
сейчас скрыл
Было бы здорово, чтобы вы, прежде чем менять код, вникли в информацию, которую я выше дал.
1
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
07.05.2020, 23:50 10
R_U_S_V, хорошо. Дальше можно спрятать логику в сам класс.
Цитата Сообщение от R_U_S_V Посмотреть сообщение
C++
77
while (h1.player_life != 0)
Тут необходимо получить ответ на вопрос, жив ли игрок. Пусть это будет метод bool is_live(), true - жив, false - мертв. Условие соответственно меняются: while (h1.is_live()). В строке 84 аналогично, только с отрицанием.

Цитата Сообщение от R_U_S_V Посмотреть сообщение
cin >> h1.x >> h1.y;
Вместо прямого изменения этих значений лучше определить метод void move(int x, int y). Пользовательский ввод сохранять в локальные переменные x и y, а затем перемещать игрока h1.move(x, y);.

Внутри метода обновлять позицию и, возможно, выполнять какие-то дополнительные проверки и действия. Метод method_get_heart конечно должен относиться к игровой логике и ему еще бы игровое поле добавить. Но пока ничего этого нет, его можно вызвать внутри метода move (и назвать именем, отражающим его суть, update_heart например).

Сравните
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>
using namespace std;
 
class Player {
    int m_life = 5;      // одна жизнь персонажа = 5 делениям
    int curr_x = 0, curr_y = 0;
 
public:
    bool is_live() {
        return (m_life > 0);
    }
 
    void move(int x, int y) {
        curr_x = x;
        curr_y = y;
        update_heart();
    }
 
    int get_life() {
        return m_life;
    }
 
    void update_heart()   // метод добавляет/отнимает здоровье/жизнь персонажа
    {
        if (curr_x == 14 && curr_y == -6)
        {
            m_life = m_life + 1;                      // прибавляем 1 деление
            cout << "\n вы взяли зеленое сердечко (+ 1)";
            cout << "\n уровень здоровья = " << m_life;
        }
        else if (curr_x == 10 && curr_y == 15)
        {
            m_life = m_life + 2;                      // прибавляем 2 деления
            cout << "\n вы взяли желтое сердечко (+ 2)";
            cout << "\n уровень здоровья = " << m_life;
        }
        else if (curr_x == -14 && curr_y == 11)
        {
            m_life = m_life + 5;                      // прибавляем 1 жизнь
            cout << "\n вы взяли красное сердечко (+ 1 жизнь)";
            cout << "\n уровень здоровья = " << m_life;
        }
        else if (curr_x == -14 && curr_y == -4)
        {
            m_life = m_life - 5;                      // отнимаем 1 жизнь
            cout << "\n вы взяли черное сердечко (- 1 жизнь)";
            cout << "\n уровень здоровья = " << m_life;
        }
        else if (curr_x == -6 && curr_y == -12)
        {
            m_life = m_life - 1;                      // отнимаем 1 деление
            cout << "\n вы взяли серое сердечко (- 1)";
            cout << "\n уровень здоровья = " << m_life;
        }
        else
        {
            cout << "\n здесь пусто";
            cout << "\n уровень здоровья = " << m_life;
        }
 
    }
};
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    system("chcp 1251>0");
 
    Player p1;    // создаем объект класса
 
    cout << "\n начальный уровень здоровья = " << p1.get_life();
 
    while (p1.is_live())                             // цикл работает пока жинь персонажа не обнулится
    {
        cout << "\n\n enter the coordinates ( х / y ): ";
        int x, y;
        cin >> x >> y;
        p1.move(x, y);                            // вызов метода класса на выполнение
 
        if (!p1.is_live())      // как только счетчик уровня жизни = 0 или меньше 0
        {
            cout << "\n игра окончена!";                    // выводим сообщение
            return 0;                                       // завершаем игру
        }
    }
 
    system("pause>0");
    return 0;
}


Warning! Не принимайте, как руководство к действию, это просто пример того, что можно улучшить, но не цель и не предел.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
07.05.2020, 23:57  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Было бы здорово, чтобы вы, прежде чем менять код, вникли в информацию, которую я выше дал.
добро.

Добавлено через 7 минут
Цитата Сообщение от valen10 Посмотреть сообщение
Warning! Не принимайте, как руководство к действию, это просто пример того, что можно улучшить, но не цель и не предел.
Спасибо!
Да, я понимаю, мой код в принципе то рабочий и, что вариантов реализации той задачки которую я выложил много, это же с++!
Я позвал Вас в эту тему именно для того, чтобы понять свои ошибки, потому как по книге это не возможно, ну в моем случае ...))
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.05.2020, 00:03 12
R_U_S_V, на самом деле от C++ тут только процентов 10. Остальная информация уже из области проектирования и архитектуры программ.
Поэтому нормальные ответы нужно искать совсем в других книгах.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:07  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому нормальные ответы нужно искать совсем в других книгах.
Надо полагать - алгоритмы?

Добавлено через 53 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы делаете player_life открытым членом, то обесцениваете наличие метода get_heart класса.
Задали Вы мне задачку.
Пока не здаюсь
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.05.2020, 00:08 14
R_U_S_V, нет, что-то вроде этого:
Бертран Мейер, - "Объектно-ориентированное конструирование программных систем".
Гради Буч, - "Объектно-ориентированный анализ и проектирование с примерами приложений на С++".
Роберт Мартин, - "Чистая архитектура. Искусство разработки программного обеспечения".
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:12  [ТС] 15
Цитата Сообщение от DrOffset Посмотреть сообщение
что-то вроде этого:
принято!
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.05.2020, 00:17 16
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Задали Вы мне задачку.
Что это означает? Вам не понятно, что имелось в виду?

Давайте вернемся к абстрактным примерам. Вы никогда не задумывались, почему очень многие вещи, которыми мы пользуемся, имеют корпус, оболочку, кнопки и т.п.? Ну вот например, настольная лампа. Обратите внимание, что обычно лампа сделана так, что как бы вы ее не трогали, вы не сможете пальцами замкнуть оголенные провода. Лампа включается выключателем или кнопкой, но используя ее вы не сможете включить лампу "неправильно", например сделать короткое замыкание. Иными словами кнопка "включить" - это метод класса "лампа". И ваш класс сейчас похож на такую лампу, которой вы сделали кнопку "включить", но забыли снабдить ее провода изоляцией. Иными словами, любое неосторожное действие со стороны пользователя лампы может привести к короткому замыканию. И этот факт обесценивает наличие кнопки, которую вы так старательно делали.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы делаете player_life открытым членом, то обесцениваете наличие метода get_heart класса.
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:27  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Что это означает? Вам не понятно, что имелось в виду?
Давайте вернемся к абстрактным примерам. Вы никогда не задумывались, почему очень многие вещи, которыми мы пользуемся, имеют корпус, оболочку, кнопки и т.п.? Ну вот например, настольная лампа. Обратите внимание, чтоб обычно лампа сделана так, что как бы вы ее не трогали, вы не сможете пальцами замкнуть оголенные провода. Лампа включается выключателем или кнопкой, но используя ее вы не сможете включить лампу "неправильно", например сделать короткое замыкание. Иными словами кнопка "включить" - это метод класса лампа. И ваш класс сейчас похож на такую лампу, которой вы сделали кнопку "включить", но забыли снабдить ее провода изоляцией. Иными словами, любое неосторожное действие со стороны пользователя лампы может привести к короткому замыканию. И этот факт обесценивает наличие кнопки, которую вы так старательно делали.
Я понял, что данные не защищены, из-за того, что я объявил публичным - player_life с которым работает функция (метод)
Пока не понимаю как как это решить! Беру пару дней на решение самостоятельно, если не получится, позову на помощь снова.

Да я понимаю это наглядный пример СПАСИБО!, я видимо просто не в полной мере еще понимаю архитектуру класса.
Со структарами (чтоб ни дна им не покрышки))) проще было.

Добавлено через 4 минуты
Цитата Сообщение от valen10 Посмотреть сообщение
Для чего строки 66-73
А разьве нельзя заранее в виде списка объявить все переменные класса, даже если какие-то из них пока не задействованы?
Или тут должен работать принцип - переменная должна быть объявлена и инициализирована в тот момент и как можно ближе к исполняющей инструкции?
И заранее объявлять - это плохой тон?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
08.05.2020, 00:28 18
Цитата Сообщение от R_U_S_V Посмотреть сообщение
А разьве нельзя заранее в виде списка объявить все переменные класса, даже если какие-то из них пока не задействованы?
Так вы их уже объявили в строках 10-16.
А в строках 66-73 - это не объявление, а обращение к переменным объекта.
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:34  [ТС] 19
Таааак, я нахрен вообще запутался))) Сорри за жаргон конечно.

Щас я разберусь с этой темой
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:38  [ТС] 20
Цитата Сообщение от valen10 Посмотреть сообщение
Метод method_get_heart конечно должен относиться к игровой логике и ему еще бы игровое поле добавить
Да, забыл, вот, есть ведь игровое поле
Миниатюры
Классы и объекты. Прошу проверить правильность  
0
08.05.2020, 00:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2020, 00:38
Помогаю со студенческими работами здесь

Прошу оценить правильность сверстанной формы (HTML, Bootstrap 4)
Товарищи форумчане, прошу сделать жесткую критику по сверстанной мною данной формы ибо её HTML меня...

Классы, объекты и self
Добрый вечер) Читаю литературу по руби. Разумеется есть вопросы. 1) Есть объект class A ...

Классы и объекты
Как выполнить следующие задания: 1) Написать класс Round, задающий круг с указанными координатами...

Классы и объекты
Добрый день всем.Хотел узнать кое что,надеюсь вопрос будет соответствовать название темы:) На...

Классы и объекты
Не могу разобраться с классами для курсовой. Нужно сделать мобов. Каждый должен иметь timer и...

классы и объекты
Здравствуйте. Помогите с задачей. Нужно написать программу на классы и объекты. Пользователь вводит...


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

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