Психический симулятор или Triumvirate of Hearts

Введение

В RPG играх (например S.T. A.L.K. E.R.) есть система отношения созданная специально для взаимодействия c NPC. И тут я подумал:, а что если использовать эту систему, чтобы построить полноценный психический симулятор, где можно манипулировать людьми для достижения определённого результата. В качестве простого примера я выбрал любовные треугольники: в них мужчины (или женщины) конкурируют за возлюбленн (ой/ого) и используют различные методы для расположения к себе своего партнёра. Меня они всегда интересовали потому, что это своего рода испытания для людей и почему бы не сделать игру-стратегию по ним (спасибо нейросети за гениальное название!)

Устройство игры

Так в чём же заключается стратегия моей игры? Игрок выбирает сначала любое действие затем его оценивает возлюбленная складывая обычную стоимость со своей оценкой (хз зачем я сделал именно так), которая генерируется вместе с характером рандомно, чтобы было интереснее играть.

short appreciation(/*short& relation,*/ int act, short a_relation[]) {
		//Режимы игры (о них позже)
		//if (mode == 0) { 
			if (preferences[act] > 0) //Если отношение положительное
				//cout << name << ": "<< "How kind of you!" << endl;
				cout << name << ": " << "О, как это мило с твоей стороны" << endl;
			else //Иначе, если отрицательное
				//cout << name << ": " << "I don't like it!" << endl;
				cout << name << ": " << "Я не люблю это!" << endl;
		//}
		//else if (mode == 1) {
			if (preferences[act] > 0)
				cout << name << ": " << "Ух, как круто!" << endl;
			else
				cout << name << ": " << "Фу! Долой!" << endl;
		//}
		return a_relation[act] + preferences[act];
	}
	void generate_character() { //Генерация массива-характера персонажа
		srand(time(NULL));
		for (size_t i = 0; i < 6; i++)
		{
			preferences[i] = (rand() % 200) - 99;
		}
	}

Затем идёт противник, который будет избегать неудачных ранее действий (такой вот простейший ИИ). Игрок ориентируясь на неудачные действия противника может выбирать удачные.

while (true) {
		if (player.get_relation() < 0 || enemy.get_relation() >= 300) {
			//cout << "You lose";
			cout << "Вы проиграли, " << lover.get_name() << " выбрала " << enemy.get_name()<= 300 || enemy.get_relation() < 0) {
			//cout << "The player won";
			cout << "Вы выиграли, " << lover.get_name() << " выбрала Вас" << endl;
			break;
		}
		for (size_t i = 0; i < 6; i++)
		{
			cout << i << ". " << actions[i] <<" ("<> action;	
		if (mode == 0) {
			if (action == prev_player_action)
				player_times++;
			else
				player_times = 0;
			prev_player_action = action;
			//cout << "The player chose \"" << actions[action] << "\"" << endl;
			cout << player.get_name() << " " << "выбрал \"" << actions[action] << "\"" << endl;
			if (player_times >= 2) {
				//cout << "I am tired of this! Can't think of anything better?" << endl;
				cout << "Мне это надоело! Ничего лучшего не придумал?" << endl;
				//player_relation -= 20;
				player.increase_relation(-20);
			}
			else

				//player_relation += lover.appreciation(action, actions_relation);
				player.increase_relation(lover.appreciation(action, actions_relation));
			//player_relation += actions_relation[action] + preferences[action];
		}
		else if (mode == 1) {
			cout << player.get_name() << " " << "выбрал \"" << actions[action] << "\"" << endl;
			player.increase_relation(lover.appreciation(action, actions_relation));
		}
			

		cout << player.get_name() << ": " << player.get_relation() 
		<< " | " << enemy.get_name()<<": " << enemy.get_relation() << endl;
		cout << endl;
		while (true) {
			action = rand() % 6;
			if (!findValue(bad_actions, action))
				break;

		}
		cout << enemy.get_name()<< " " << "выбрал \"" << actions[action] << "\"" << endl;
		
		short result;

			result = lover.appreciation(action, actions_relation);
			enemy.increase_relation(result);
			
		cout << player.get_name() << ": " << player.get_relation() << " | " << enemy.get_name() << ": " << enemy.get_relation() << endl;

		if (result < actions_relation[action])
			bad_actions.push_back(action);

	}

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

Кто раньше достигнет максимального балла (300 очков) тот выиграет, а тот кто потеряет очки вплоть до отрицательных отношений — проиграет

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

Идеи для улучшения

Можно конечно улучшить эту игру добавив графический интерфейс (выбрал стиль визуальных новелл), диалоги, прокачку персонажей как в настоящих RPG и конечно же…

…мною недавно открытая формула:

F=m_1*m_2

она аналогична формуле гравитации Ньютона, где m_1 и m_2 — это «весы» личностей вычисляющийся по Большой пятёрке:

  1. Интроверсия и экстраверсия

  2. Приятность

  3. Добросовестность

  4. Эмоциональная стабильность

  5. Открытость опыту

Наличие того или иной черты характера помечаются нулём или единицей.

Конечно же использование бинарной системы вместо процентного отношения не даст точный результат приходящийся в жизни, но думаю, что для игры этого будет достаточно.

Ссылка на архив с кодом игры

© Habrahabr.ru