Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2022, 11:18   #1
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию Не работает выбор имени через switch

Есть такой вот конструктор, если указываю имя явно то все работает, если пытаюсь через рандом то вместо имени пустая строка. Помогите разобраться...

Код:
class mob : public character {

	public:
		string name;
		int hp = 75;
		int xp = 15;
		int lvl = 1;


			game::mob() {
				string setname;
				srand(time(0));
			int name = 1 + rand() % 5;
			switch (name) {
			case 1: setname = "Разбойник"; break;
			case 2: setname = "Волк"; break;
			case 3: setname = "Медведь"; break;
			case 4: setname = "Кабан"; break;
			case 5: setname = "Людоед"; break;
				this->name = setname;
				}
			}

			~mob() {
			
			}
Kukla19 вне форума Ответить с цитированием
Старый 05.04.2022, 23:02   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Делайте "this->name = setname;" после switch, а не внутри одного из кейсов (тем более, что код после break недостижим).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2022, 01:14   #3
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

В консткукции switch нельзя писать код кроме как в case
Код:
class mob : public character {

	public:
		string name;
		int hp = 75;
		int xp = 15;
		int lvl = 1;
		
		game::mob() {
			string setname;
			srand(time(0));
			
			int name = 1 + rand() % 5;
			switch (name) {
				case 1: setname = "Разбойник"; break;
				case 2: setname = "Волк"; break;
				case 3: setname = "Медведь"; break;
				case 4: setname = "Кабан"; break;
				case 5: setname = "Людоед";
			}
			this->name = setname;
		}
		
		~mob() {
		
		}
}
uberchel вне форума Ответить с цитированием
Старый 06.04.2022, 02:17   #4
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

BDA, спасибо, точно не увидел ошибку!
uberchel, спасибо!
Kukla19 вне форума Ответить с цитированием
Старый 06.04.2022, 07:30   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от uberchel Посмотреть сообщение
В консткукции switch нельзя писать код кроме как в case
можно, но обычно это не имеет смысла или даже вредно
https://onlinegdb.com/fh95wjo7-
Алексей1153 вне форума Ответить с цитированием
Старый 07.04.2022, 05:41   #6
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

Еще спрошу в этой теме.

Почему-то не записывает в файл данные. Чтение файла сделано в конструкторе, запись в деструкторе подкласса character. После того как дописал метод battle перестало записывать данные в файл. А мне нужно чтобы здоровье и опыт записывались в файл.

Вот такой вот класс на 200 строк:
Код:
class game {

public:

	class item {

	public:
		string slot;
		int lvl;
		string name;
		string mark;
		string namestat1;
		string namestat2;
		string namestat3;
		int stat1;
		int stat2;
		int stat3;

		item() {

		}

		void iteminfo() {
			for (int i = 1; i > 10; i++) {
				if (this->mark == "выносливости" and lvl == i) {
					stat1 = i * 3;
					stat2 = 0;
					stat3 = 0;
					if (stat1 > 0)
						cout << this->name << " с печатью " << this->mark << endl;
				}
			}
		}
	};

	class character {

	public:
		string name;
		int hp;
		int lvl;
		int dmg;
		int xp;
		int crit;
		int block;
		string type = "knight";

		character() {
			ifstream fin("herodata");
			std::string attr;
			if (fin.is_open()) {
				fin >> attr >> this->name;
				fin >> attr >> this->hp;
				fin >> attr >> this->dmg;
				fin >> attr >> this->lvl;
				fin >> attr >> this->xp;
				fin >> attr >> this->crit;
				fin >> attr >> this->block;
				fin.close();
			}
		};

		~character() {
			std::ofstream out;   
			out.open("herodata");
			if (out.is_open())
			{
				out << "heroname" << " " << this->name << std::endl;
				out << "herohp" << " " << this->hp << std::endl;
				out << "herodmg" << " " << this->dmg << std::endl;
				out << "herolvl" << " " << this->lvl << std::endl;
				out << "heroxp" << " " << this->xp << std::endl;
				out << "herocrit" << " " << this->crit << std::endl;
				out << "heroblock" << " " << this->block << std::endl;
			};
		};

	};

	item shopitems[10];

	item genitem(int nitem) {
		item newitem;
		int noitem = 1 + rand() % (hero.lvl + (1 + rand() % 3));
		if (noitem == 1 and newitem.slot == "head")
		newitem.name = "простой шлeм";
		else if (noitem == 2 and newitem.slot == "head")
			newitem.name = "шлeм";
		else if (noitem == 3 and newitem.slot == "head")
			newitem.name = "простой шлeм";
	
		cout << newitem.name << endl;
		return newitem;
	};

	class mob : public character {

	public:
		string name;
		int hp = 75;
		int dmg = 15;
		int xp = 15;
		int lvl = 1;
		int crit = 10;
		int block = 15;
		string type;
	
			game::mob() {
				string setname;
				srand(time(0));
			int name = 1 + rand() % 5;
			switch (name) {
			case 1: setname = "Разбойник"; break;
			case 2: setname = "Волк"; break;
			case 3: setname = "Медведь"; break;
			case 4: setname = "Кабан"; break;
			case 5: setname = "Людоед"; break;
				}
			this->name = setname;
			}

			~mob() {
				deadbody body;
				body.type = this->type;
			}
	};

	character hero;
	mob mob;

	class deadbody {
	public:
		int lifetime = 30;
		string type;
	};

	void battle() {
		cout << "Вы сражаетесь с " << mob.name << " " << mob.lvl + (rand() % 3)<< " уровня" << endl;
		cout << endl;
		while (hero.hp > 0 and mob.hp > 0) {
			int heroatk = 1 + rand() % 100;
			int mobatk = 1 + rand() % 100;
			int heroblock = 1 + rand() % 100;
			int mobblock = 1 + rand() % 100;
			if (heroblock < hero.block) {
				cout << "Вы блокируете атаку." << endl;
			}
			else {
				if (mobatk < mob.crit) {
					cout << mob.name << " наносит вам критический удар " << (3 + rand() % mob.dmg) * 2 << "x2 урона" << endl;
					hero.hp -= (3 + rand() % mob.dmg)*2;
				}
				else {
					cout << mob.name << " наносит вам " << 3 + rand() % mob.dmg << " урона" << endl;
					hero.hp -= 3 + rand() % mob.dmg;
				}
			}
			if (mobblock < mob.block) {
				cout << mob.name << " блокирует атаку." << endl;
			cout << endl;
		}
			else {
				if (heroatk < hero.crit) {
					cout << "Вы наносите критический удар" << mob.name << " " << (5 + rand() % hero.dmg)*2 << "x2 урона" << endl;
					mob.hp -= (5 + rand() % hero.dmg)*2;
					cout << endl;
				}
				else {
					cout << "Вы наносите " << mob.name << " " << 5 + rand() % hero.dmg << " урона" << endl;
					mob.hp -= 5 + rand() % hero.dmg;
					cout << endl;
				}
				if (mob.hp <= 0) {
					cout << "Вы получили " << mob.xp << " опыта." << endl;
				
				}
			}
		}
		hero.xp = hero.xp + mob.xp;
	}
}
Kukla19 вне форума Ответить с цитированием
Старый 09.04.2022, 11:09   #7
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Надо смотреть почему файловый поток не открывается. И да, писать любой значимый код, не считая очистки в деструкторе объетка считается плохой практикой
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 11.04.2022, 05:20   #8
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

Цитата:
Сообщение от maks1331 Посмотреть сообщение
Надо смотреть почему файловый поток не открывается. И да, писать любой значимый код, не считая очистки в деструкторе объетка считается плохой практикой
Спасибо!
Kukla19 вне форума Ответить с цитированием
Старый 11.04.2022, 05:31   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

А еще каждый вызов rand() возвращает новое число, так что в коде функции battle вы печатаете одни числа, а отнимаете другие, что может ввести в заблуждение. Сохраняйте результат выражения во временную переменную, выводите и отнимайте её.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.04.2022, 05:42   #10
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

После каждой команды battle накапливается опыт и изменяется здоровье, но не записывается в файл.

Возможно это из-за goto?
А когда я хардово (ну типа кнопкой крестиком) отключаю прогу деструктор срабатывает?
Kukla19 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает оператор Switch denis_alekss JavaScript, Ajax 13 08.12.2020 14:24
Выбор из ListBox работает через раз Kerajel Помощь студентам 5 08.12.2015 20:33
Не работает выбор ОС через клавиатуру в "диспетчере Загрузок ОС" Ecosasha Компьютерное железо 6 30.10.2011 01:03
ВПР - выбор файла в зависимости от имени Questru Microsoft Office Excel 19 08.12.2010 10:40
Выбор айтема в Listbox1 по имени Mihanches Общие вопросы Delphi 1 12.10.2010 13:18