Психический симулятор или 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()<<endl;
			break;
		}
		else if (player.get_relation() >= 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] <<" ("<<actions_relation[i]<<" очков)" << endl;
		}
		//cout << "Which of these actions will you choose? ";
		cout << "Какое из этих действий выберешь ты? ";
		cin >> 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. Открытость опыту

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

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

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

Источник: https://habr.com/ru/articles/768992/


Интересные статьи

Интересные статьи

В разработке электроники часто приходится делать отладку при помощи графических дисплеев. Есть и вовсе законченный устройства с точечными экранчиками. Проблема в том что у языка Си нет встроенной библ...
Как вы относитесь к симуляторам электронных схем? Кто-то на них плюется, а мне нравится! Особенно нравится, когда организму лень отлипать от дивана, а мозг требует схемотехники. Arduino IDE + ISIS...
Это руководство по созданию симулятора простого 8-битного ассемблера на Javascript.
Привет, Хабр! В свободное от работы время по вечерам мне нравится воплощать в жизнь свои сумасшедшие идеи. В один из таких вечеров родилась мысль реализовать компилятор кода в машину Тьюринга. Осознав...
Всем привет! Меня зовут Паша Лесюк, я работаю мобильным тестировщиком в компании Циан. В этой статье я расскажу о возможностях управления яблочными симуляторами из командной строки. ...