Прежде всего я хотел бы заявить, что я новичок в программировании. Я не смог найти совета конкретно о том, что мне интересно.
Я изучаю C ++ через несколько книг и всегда использую то, что я изучаю, придумывая свои собственные маленькие идеи и кодируя их в меру своих возможностей. Одной из таких вещей, о которой я подумал, была короткая текстовая RPG с возможностью ветвления. В этой RPG у вас есть несколько разных рас и профессий на выбор, когда вы создаете своего персонажа. Он организован в несколько событий, на которые могут влиять ваши предыдущие действия (или даже атрибуты вашего персонажа) — например, если вы выбрали опцию 3 в первом событии, вы можете разблокировать дополнительную опцию во втором событии. Или, если ваш персонаж Х, возможно, вам не хватает варианта, который есть у других.
Первоначально я начал с этого всего через несколько дней после того, как начал изучать, и закодировал около 4 таких событий, это было довольно без ошибок (но код был очень грязным). Теперь, когда я вхожу в объектно-ориентированное программирование, я решил переделать эту программу с классами. До сих пор я кодировал класс «Character», содержащий элементы данных, такие как раса, профессия, пол и т. Д., А также функции-члены для их получения и установки, а также конструктор, инициализирующий создание (I Я добавлю весь класс в конце этого поста, чтобы вы тоже могли его изучить и указать на любые недостатки или как это можно улучшить). Единственное, что у меня есть в основной функции — это вызов функции charCreate.
В принципе, я не знаю точно, куда идти отсюда. Я хочу принять к этому чисто объектно-ориентированный подход. Должен ли я сделать еще один класс мероприятий? Должны ли события быть частью класса «Персонажи»? Как бы я стимулировал разветвление, используя методы ООП?
Я подчеркиваю: цель этого вопроса — получить совет от тех, кто имеет опыт, которые могут помочь мне выбрать правильный путь и дать мне ценные советы, которые помогут мне расти как ученик.
Спасибо
Character.H
#ifndef CHARACTER_H
#define CHARACTER_H
#include <string>
using namespace std;
class Character
{
public: //these are fairly self explanatory... set/get functions for the data members
Character();
void charCreate();
void setName(string);
void setGender(int);
void setRace(int);
void setProf(int);
string getName();
string getGender();
string getRace();
string getProf();
private:
string charName; //character name
string charGender; //character gender
string charRace; //character race
string charProf; //character profession
int charGold = 50; //initial gold amount
int charMana; //this is only relevant for wizards, doesn't matter for other professions
string profWep; //profession-exclusive weapons
};
#endif // CHARACTER_H
Character.cpp
#include "Character.h"#include <iostream>
#include <string>
using namespace std;
Character::Character()
{
Character::charCreate(); //constructor initializes the character creation function below
}
void Character::charCreate(){
string name;
bool gender;
int race;
int prof;cout << "\n\n\n\nFirst, what is your name? (23 characters max) ";
getline(cin,name);
setName(name);
cout << "\n\nAre you male or female? (0 for female, 1 for male)";
cin >> gender;
while (gender > 1 || gender < 0){
cout << "\n\nInvalid. Please select a valid option.";
cin >> gender;
}
setGender(gender);
cout << "\n\nSelect your race: \n\n""1 - Human\n""2 - Dwarf\n""3 - Elf\n\n";
cin >> race;
while (race > 3 || race < 1){
cout << "\n\nInvalid. Please select a valid option.";
cin >> race;
}
setRace(race);
cout << "\n\nFinally, select your class: \n\n""1 - Warrior\n""2 - Thief\n""3 - Wizard\n\n";
cin >> prof;
while (prof > 3 || prof < 1){
cout << "\n\nInvalid. Please select a valid option.";
cin >> prof;
}
setProf(prof);
}
void Character::setName(string name){
if (name.length() <= 23){
charName = name;
}
else{
charName = name.substr(0,23);
cout << "\nName too long; limiting to 23 characters.\n\n""Your name is " << charName << ".";
}
}
void Character::setGender(int gender){
if(gender == 1){
charGender = "male" ;
}
else if (gender == 0){
charGender = "female";
}
}
void Character::setRace(int race){
if (race == 1){
charRace = "human";
}
else if (race == 2){
charRace = "dwarf";
}
else if (race == 3){
charRace = "elf";
}
}
void Character::setProf(int prof){
if (prof == 1){
charProf = "warrior";
profWep = "sword & shield";
}
else if (prof == 2){
charProf = "thief";
profWep = "dagger";
}
else if (prof == 3){
charProf = "wizard";
profWep = "staff";
}
}
string Character::getName(){
return charName;
}
string Character::getGender(){
return charGender;
}
string Character::getRace(){
return charRace;
}
string Character::getProf(){
return charProf;
return profWep; //the weapon is linked to the class, so I decided
//to have them both returned together
}
Класс должен представлять абстрактную сущность в вашей вселенной; если вы создаете Warrior
класс и Enemy
класс, вы заметите, что оба имеют одинаковые свойства (такие как life
). В этом случае вы можете подняться на уровень и создать Entity
класс и получить Warrior
а также Enemy
от него.
Ничего из этого не нужно, однако; Вы можете написать целую программу внутри метода класса и заставить его работать должным образом. Что действительно важно, так это концепция объектно-ориентированного дизайна; какие должны идти где а также Зачем? Объектно-ориентированные инструменты, такие как C ++, позволяют постепенно реализовать эти идеи.
Попробуйте определить все существующие и возможные объекты ваша программа будет иметь и реализовывать классы соответственно. В настоящее время у вас есть один Character
учебный класс. Разветвление может быть сделано внутри main
функция; нет необходимости размещать его в другом месте, правда. На самом деле, поскольку ваша программа все еще слишком мала, я бы не стал использовать ОО-подход к этой игре (если только я не собираюсь расширять ее до десятков классов, полностью использующих такие концепции ОО, как наследование, инкапсуляция и полиморфизм).
Других решений пока нет …