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

Сделать выбор персонажа игры, вывод его скилов и предметов, используя паттерн стратегия - C++

28.06.2016, 18:41. Просмотров 367. Ответов 12
Метки нет (Все метки)

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

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
main.cpp
 
#include "Boy.h"
#include "Girl.h"
#include <iostream>
using namespace std;
 
int main()  //весь main обведен,написано "ошибка логики"
{
    Character* character;
 
    character = new Boy();
    character->display();
    character->getAbility();
    character->getWeapon();
 
    std::cout << std::endl;
 
    character = new Girl();
    character->display();
    character->getAbility();
    character->getWeapon();
    delete character;
}
 
Character.h
 
#pragma once
#include "Ability.h"
#include "Weapon.h"
 
class Character
{
public:
    virtual void display(void) = 0;
    virtual void getAbility(void) = 0;
    virtual void getweapon(void) = 0;
protected:
    Ability* ability; //зачеркнуто
    Weapon* weapon; //зачеркнуто
};
 
Ability.h //зачеркнут весь файл
 
#pragma once
class Ability
{
public:
    virtual void displayAb(void) = 0;
};
 
AbilityBoy.h //зачеркнут весь файл
 
#pragma once
#include "Ability.h"
 
class AbilityBoy : public Ability
{
public:
    void displayAb();
};
 
AbilityBoy.cpp
 
#include "AbilityBoy.h"
#include <iostream>
 
void AbilityBoy::displayAb()
{
    std::cout << "Boy's ability granted" << std::endl;
}
 
AbilityGirl.h
 
#pragma once
#include "Ability.h"
 
class AbilityGirl : public Ability
{
public:
    void displayAb();
};
 
AbilityGirl.cpp
 
#include "AbilityGirl.h"
#include <iostream>
 
void AbilityGirl::displayAb()
{
    std::cout << "Girl's ability granted" << std::endl;
}
 
Weapon.h
 
#pragma once
 
class Weapon
{
public:
    virtual void displayWp(void) = 0
};
 
WeaponBoy.h
 
#pragma once
#include "Boy.h"
 
class WeaponBoy : public Weapon
{
public:
    void displayWp();
};
 
WeaponBoy.cpp
 
#include "WeaponBoy.h"
#include <iostream>
 
void WeaponBoy::displayWp()
{
    std::cout << "Boy's weapon granted" << std::endl;
}
 
WeaponGirl.h
 
#pragma once
#include "Weapon.h"
 
class WeaponGirl : public Weapon
{
public:
    void displayWp();
};
 
WeaponGirl.cpp
 
#include "WeaponGirl.h"
#include <iostream>
 
void WeaponGirl::displayWp()
{
    std::cout << "Girl's weapon granted" << std::endl;
}
 
Boy.h
 
#pragma once
#include "Character.h"
#include "AbilityBoy.h"
 
class Boy : public Character
{
public:
    void display();
    void getAbility();
    void getWeapon();
};
 
Boy.cpp
 
#include "Boy.h"
#include "AbilityBoy.h"
#include "WeaponBoy.h"
#include <iostream>
 
void Boy::display()
{
    std::cout << "Boy created" << std::endl;
}
 
void Boy::getAbility()
{
    ability = new AbilityBoy(); //зачеркнуто
    ability->displayAb(); //зачеркнуто
    delete ability; //зачеркнуто
}
 
void Boy::getWeapon()
{
    weapon = new WeaponBoy(); //зачеркнуто
    weapon->displayAb(); //зачеркнуто
    delete weapon; //зачеркнуто
}
 
Girl.h 
 
#pragma once
#include "Character.h"
#include "AbilityGirl.h"
 
class Girl : public Character
{
public:
    void display();
    void getAbility();
    void getWeapon();
};
 
Girl.cpp
 
#include "Girl.h"
#include "AbilityGirl.h"
#include "WeaponGirl.h"
#include <iostream>
 
void Girl::display()
{
    std::cout << "Girl created" << std::endl;
}
 
void Girl::getAbility()
{
    ability = new AbilityGirl(); //зачеркнуто
    ability->displayAb(); //зачеркнуто
    delete ability; //зачеркнуто
}
 
void Girl::getWeapon()
{
    weapon = new WeaponGirl(); //зачеркнуто
    weapon->displayAb(); //зачеркнуто
    delete weapon; //зачеркнуто
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2016, 18:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сделать выбор персонажа игры, вывод его скилов и предметов, используя паттерн стратегия (C++):

Паттерн стратегия
Всем привет! Начал изучать паттерны. Одним из наиболее понятных и интересных мне оказался паттерн Стратегия. Я начитался статей и...

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

Паттерн стратегия и ошибки при компиляции
Здравствуйте уважаемые форумчане. Вот решил я как-то недавно, что мой код говно и надо что-то с этим делать, так как я пишу нормальные по...

Сделать так, что бы в общем балле отображался сумма, складываемых 4 предметов и деленный на тот же количество предметов
Здравствуйте программисты! Как можно сделать так, что бы в общем балле отображался сумма, складываемых 4 предметов и деленный на тот же...

Паттерн стратегия
Всем привет. Решил разобраться с паттерном стратегия, прочитал несколько статей и сделал по их примеру код. Код рабочий. Просто хочу...

Как сделать инвентарь для игры с возможностью премещения предметов из него?
Помогите пожалуйста знающие люди создать инвентарь похожий как в играх Alawar про Масяню. Мне бы только кто помог инвентарь сам сделать, а...

12
Hikari
Хитрая блондиночка $)
1451 / 960 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.06.2016, 19:08 #2
Цитата Сообщение от Vladiboy Посмотреть сообщение
int main() //весь main обведен,написано "ошибка логики"
Ну... return 0 не хватает...
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
28.06.2016, 19:14 #3
Цитата Сообщение от Vladiboy Посмотреть сообщение
C++
1
character = new Girl();
Забыли освободить память перед этим действием.
в результате объект типа Boy уплыл в свободное плавание.
Цитата Сообщение от Vladiboy Посмотреть сообщение
C++
1
2
3
4
5
6
void Boy::getAbility()
{
    ability = new AbilityBoy(); //зачеркнуто
    ability->displayAb(); //зачеркнуто
    delete ability; //зачеркнуто
}
Зачем Вы каждый раз создаете и удаляете способность?
Она у Вас что, "приходящая по требованию"?
Тем более, getAbility, наверное,
подразумевает вернуть вызывающему коду данные,
чтобы он их обработал, а не вывести данные в поток.
С getWeapon тоже самое и в Girl тоже.
Цитата Сообщение от Vladiboy Посмотреть сообщение
написано "ошибка логики"
Смотря что нужно было сделать.
А вообще, думаю, данный код должен
обрабатывать полученные способности и т.д.,
а не просто дергать функции-члены класса.

Так что, препод прав, имхо.

Цитата Сообщение от Hikari Посмотреть сообщение
Ну... return 0 не хватает...
Он там не обязателен
3
DUMP
73 / 47 / 26
Регистрация: 22.02.2015
Сообщений: 306
28.06.2016, 19:21 #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Он там не обязателен
с каких пор ?
0
ct0r
Игогошка!
1784 / 686 / 43
Регистрация: 19.08.2012
Сообщений: 1,323
Завершенные тесты: 1
28.06.2016, 19:32 #5
Цитата Сообщение от DUMP Посмотреть сообщение
с каких пор ?
C 2003 года минимум А может и с 98, но такого древнего стандарта у меня нету просто, чтоб убедиться.
1
Hikari
Хитрая блондиночка $)
1451 / 960 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.06.2016, 19:32 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Он там не обязателен
Ну так то оно так, но фраза "ошибка логики"...
В общем скорее всего имелось это ввиду.
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
28.06.2016, 19:46 #7
Цитата Сообщение от ct0r Посмотреть сообщение
А может и с 98, но такого древнего стандарта у меня нету просто, чтоб убедиться.
По-моему с 98'ого как раз.
Буду дома, надо будет посмотреть
0
rikimaru2013
28.06.2016, 19:51
  #8

Не по теме:

Croessmah, у вас дома стенд с пергаментами старых стандартов от эпохи Александра Македонского?

0
Croessmah
28.06.2016, 19:56
  #9

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
у вас дома стенд с пергаментами старых стандартов от эпохи Александра Македонского?
Есть 98'ой, 2003, 2011, 2014.
Также есть C11 и еще какой-то Си'шный.
Спецификация java 8.
Спецификация c# (не помню что там же и от чего).
Спецификация (или как оно там) паскаля, девяносто-лохматого года
Не, документов из Александрии нет

Есть записки динозавров, но оно не в тему

0
Kerry_Jr
28.06.2016, 21:02
  #10

Не по теме:

Цитата Сообщение от Hikari Посмотреть сообщение
お元気で!
И снова глупости в подписи.

0
Hikari
28.06.2016, 21:10
  #11

Не по теме:

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
И снова глупости в подписи.
Почему?

0
AlexVRud
477 / 189 / 72
Регистрация: 04.07.2014
Сообщений: 530
29.06.2016, 12:50 #12
Ты не понял сути шаблона проектирования Стратегия.
В контексте твоей задачи, скилы и предметы должны реализовать иерархии классов с общим методом. А эти методы используются внутри класса персонажа.

Т.е. для скилов заводим базовый класс

C++
1
2
3
4
5
class SkillBase {
public:
  virtual ~SkillBase() = default;
  virtual std::string toString() const = 0;
};
И его потомков:

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
class Alchemy: public SkillBase {
public:
  virtual ~Alchemy() override = default;
  virtual std::string toString() const override {
    return "Alchemy";
  };
};
 
 
class Destruction: public SkillBase {
public:
  virtual ~Destruction() override = default;
  virtual std::string toString() const override {
    return "Destruction";
  };
};
 
 
class Onehandevd: public SkillBase {
public:
  virtual ~Onehandevd() override = default;
  virtual std::string toString() const override {
    return "Onehandevd";
  };
};
 
 
class Twohanded: public SkillBase {
public:
  virtual ~Twohanded() override = default;
  virtual std::string toString() const override {
    return "Twohanded";
  };
};
Далее надо создать класс персонажа, который будет хранить скилы (хотя в классической "Стратегии" он должен был бы хранить один скилл, но хранение ещё и только одного предмета было бы вырвиглазно)
Так как у нас наследование, то скилы надо хранить по ссылке, но мне лень писать корректные конструкторы и деструктор, так что я позволю себе вольность и воспользуюсь умными указателями (учитывая что персонаж должен владеть способностью единолично и она не светиться во вне, то воспользуюсь я std::unique_ptr для их хранения).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Character {
private:
  std::vector<std::unique_ptr<SkillBase>> skills_;
public:
  void printSkills() const {
    std::cout << "Skills:" << std::endl;
    if (skills_.size()>0) {
      for(auto &&skill: skills_) {
        std::cout << "  - " << skill->toString() << std::endl;
      }
    } else {
      std::cout << "  None" << std::endl;
    }
  }
 
  void addSkill(std::unique_ptr<SkillBase> &&skill) {
    skills_.emplace_back(std::move(skill));
  };
};
(Ох и не нравиться мне этот метод printSkills, из-за смешения данных и представления, но уж ладно, пусть для примера шаблона проектирования будет и этот антипатерн).

Вот теперь можно и воспользоваться всем этим добром:

C++
1
2
3
4
5
6
7
8
9
int main () {
  auto character = std::make_shared<Character>();
 
  character->addSkill( std::make_unique<Alchemy>() );
  character->addSkill( std::make_unique<Twohanded>() );
  character->printSkills();
 
  return 0;
};
1
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
30.06.2016, 12:13 #13
Цитата Сообщение от ct0r Посмотреть сообщение
А может и с 98
Случайно вспомнил, что хотел посмотреть.
Да, в 98-ом так же, как и в 03.
Если в конце main нет return, то подразумевается return 0;
0
30.06.2016, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2016, 12:13
Привет! Вот еще темы с решениями:

Как сделать персонажа и его передвижение
Вопрос зеленого новичка. Не так давно начал программировать, решил начать со сложного для меня проекта - рпг игра(прикрепил файл). У меня...

Паттерн Утка или стратегия зачем вообще паттерны?
Начал ознакамливаться с ООП паттернами программирования, все, конечно, красиво, но разрастается все до кучи классов, файлов и тд. Конкретно...

Задать ItemsSource для RibbonMenu используя паттерн MVVM и сгенерировать его элементы
Предполагается, что есть некоторая вьюмодель, содержащая коллекцию элементов, которые привязываются к источнику данных для ленточного меню....

Паттерн "Стратегия". Зачем нужен контекст
Здравствуйте, у меня вопрос про паттерн &quot;Стратегия&quot;. Я понимаю что он используется для инкапсулирования алгоритмов. Выбирая нужный нам...


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

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

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