#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#include <time.h>
using namespace std;

int const number_of_chooses = 10;//количество выборки
int const number_of_steps = 10;//количество шагов


class parametr_org//класс, который будет использован для построения вектора из параметров
{
public: 
	char name[20];
	int value;
	char name_of_env[20];
	int value_env;
	int points;
};

class link_org//для хранения ссылок на переметры организма
{
public:
	char name[20];
	int place;//место в векторе, которое занимает этот параметр
	int value_number;//количество значений
};

class parametr_env//для записи параметров среды
{
public:
	char name[20];
	vector <int> value;//вектор значений
	int sizee()
	{
		return value.size();
	};
	
};


class env_now
{
public:
	char name[20];
	int value;

};


struct mass_of_org//структурка, в которой будет запись по каждому из параметров.
{
	
	char name[20];
	int key;
	int number_of_par;
	int value_v[number_of_chooses];//для выборки
	int points_v[number_of_chooses];//для выборки
	int value_s[number_of_steps];//для шага
	int points_s[number_of_steps];//для шага
};
int main()
{
	int number_of_env_par=0;
	
	ifstream in("Catalog.txt");
	if(!in) 
	{
		cout<<"Can't open file\n";
		return 1;
	}


	int i,j,k,t;
	char line[50];
	
	vector <mass_of_org> organs;//вектор, где будут лежать имена
	mass_of_org mass;//переменная, которую будем заполнять

	int max_par_env;
	in >> line;
	cout<<line<<"\n";
	
	
	vector <parametr_env> environment;
	
	if(strcmp(line,"/Environment_par\n"))//начинаем считывать параметры среды
	{
		
		in >> line;
		
		for(i=0;;i++)
		{
			parametr_env a;
			strcpy(a.name,line);
			cout<<"\nName is "<<a.name<<"\n";
			in >> line;
			
			cout<<"Values: ";
			for(j=0;;j++)
			{
				if(((line[0]>'A')&&(line[0]<'z'))||(line[0]=='/')) break; 
				
				a.value.push_back(atoi(line));
				cout<<a.value[j]<<" ";
				
				in>>line;
				
			}
			environment.push_back(a);
			number_of_env_par++;
			cout<<"Name from vect is "<< environment[number_of_env_par-1].name;
			cout<<"\n";
			if(line[0]=='/') break;
			
			
		}
	}
	cout<<"\nwe ended for environment\n";
	cout<<line<<"\n";
	int number_org_vect=0;
	max_par_env = i;
	cout<<"\n";
	vector <parametr_org> organism;//вектор, где собственно и будет все храниться.
	if(strcmp(line,"/Organism_par\n"))
	{
		char name[20];
		char name_env[20];
		int value;
		
		parametr_org b;//переменная, в которую будем записывать временные считывание и результаты
		in >> line;
		
		for(i=0;;i++)
		{
			strcpy(b.name,line);//копируем имя параметра организма
			cout<<"\nName is "<<b.name<<"\n";
			in>>line;

			strcpy(mass.name,b.name);//записываем имя
			mass.number_of_par = 0;
			mass.key = organism.size()+1;

			cout<<"values + names + values + points\n";
			for(j=0;;j++)
			{
				if(((line[0]>'A')&&(line[0]<'z'))||(line[0]=='/')) break; 
				b.value = atoi(line);	
				mass.number_of_par++;
				in>>line;
				
				if(line[0]=='{')
				{
					in >> line;//считали имя параметра среды
					
					for(k=0;;k++)
					{
						strcpy(b.name_of_env,line); 
						in >> line;
						
						for(t=0;;t++)
						{
							if(((line[0]>='A')&&(line[0]<='z'))||(line[0]=='}')) break;
							b.value_env = atoi(line);in >> line;
							
							b.points = atoi(line);
							organism.push_back(b);
							number_org_vect++;
							cout<<"\nName is "<<organism[number_org_vect-1].name<<". Value is "<<organism[number_org_vect-1].value<<". Env.name is "<<organism[number_org_vect-1].name_of_env<<". Value & points "<<organism[number_org_vect-1].value_env <<" "<< organism[number_org_vect-1].points<<".";
							in >> line;
							
						}
						if(line[0]=='}') break;
					}
					in >> line;
					
					//закончили считывать параметры для данного
				}
			organs.push_back(mass);

			}
			if(line[0]=='/') break;
			
		}
		
	}
	//теперь приступим к моделированию эволюции.
	
	vector <env_now> choosen;
	env_now c;
	//сначала позволяем выбрать какие условия среды.
	cout<<"\n\nChoose parametrs of environment..\n";
	for(i=0;i<number_of_env_par;i++)
	{
		cout<<"For "<<environment[i].name<< "\n";
		strcpy(c.name,environment[i].name);

		for(j=0;j<environment[i].sizee();j++)
			cout<<environment[i].value[j]<<" ";
		cout<<"\n";
		cout<<"What you choose?";
		cin>>c.value;
		choosen.push_back(c);
		cout<<"\n";
	}
	srand(time(NULL));
	int randomm;
	//считали параметры, которые будут в среде
	//есть вектор, в котором хранятся параметры организма. с ним связан массив в выборке - какие значения принимаются. мы проходим и считаем очки. а потом записываем в вектор шагов.
	//в векторе параметров mass_of_org у ная есть все для того, чтобы моделировать. Мы идем от первого к последнему значению и рандомим + записываем очки. Потом отдельно посчитаем очки. А потом пройдем и запишем шаг.
	for(int i=0;i<number_of_steps;i++)
	{//цикл по шагам
		//шаг заключается в том, что мы сначала проходим по параметрам и рандомим.
		for(int t=0; t < (number_of_chooses); t++)
		{//цикл для выборки

			for(int j=0; j < (organs.size());j++)
			{//цикл для параметров - рандом
				//здесь мы берем j-й параметр и рандомим каждый
				randomm = int(organs[j].number_of_par * rand()/(double)RAND_MAX);
				int number_now=0;
				//теперь ищем это Значение
				int parametr_now = organism[organs[j].key].value;
				int k;
				for(k=organs[j].key;k<organism.size();k++)
				{
					if(number_now==randomm) break;
					if(organism[k].value != parametr_now)
					{
						number_now++;
						parametr_now = organism[k].value;
					}
				}
				//теперь в переменной k у нас лежит ключ к данному значению
				//Так же у нас есть значение, которое мы записываем в вектор
				organs[j].value_v[t] = parametr_now;
				//теперь надо посчитать очки.
				//для этого мы ходим по значениям имен среды и как только встречаем нужную, то ищем соответствующее значение и очки, которые приплюсовываем
				organs[j].points_v[t] = 0;
				//сюда еще два вложенных цикла. мы ходим по списку параметров среды, которые задавал пользователь и каждый раз проходим от начала где значение в поиска этого параметра
				//а потом ище значение, которое в векторе, заданным пользователем. Приплюсовываем очки. Если вышли за границу этого параметра, значит число очков 0
				//и так для каждого параметра среды, которые заданы.
				for(int p=0;p<choosen.size();p++)//ходим по массиву параметров среды
				{//цикл по парамтерам среды
					//теперь идем по нашему циклу и ищем нужный паарметр среды и нужное значение
					for(k=k;k<organism.size();k++)
					{//цикл поиска праметра 
						if(strcmp(organism[k].name_of_env,choosen[p].name)) break;
					}//цикл поиска параметра и значения
					for(k=k;k<organism.size();k++)
					{//цикл поиска значения
						if(organism[k].value_env == choosen[p].value)
						{
							organs[j].points_v[t] = organs[j].points_v[t] + organism[k].points;
							break;
						}
					}//цикл поиска значения
				}//цикл по параметрам среды
				//мы посчитали количество очков	

			}//цикл для параметров - рандом
		}//цикл по выборке
		//итак, у нас есть выборка. теперь надо выбрать наилучшую и записать в шаг
		int summ[number_of_chooses];
		int max_summ = 0;
		int coor_max_sum = 0;
		for(int j=0;j<number_of_chooses;j++)
		{//цикл по выбору
			//здесь мы проходим по данному выбору
			summ[j] = 0;
			for(int f=0;f<organs.size();f++)
				summ[j]=summ[j] + organs[f].points_v[j];
			if(summ[j]>max_summ)
			{
				max_summ = summ[j];
				coor_max_sum = j;
			}
		}//цикл по выбору
		for(int j=0;j<organs.size();j++)
		{//цикл заполнения шага
			organs[j].value_s[i] = organs[j].value_v[coor_max_sum];
			organs[j].points_s[i] = organs[j].points_v[coor_max_sum];
		}//цикл заполнения шага
		//мы нашли лучший выбор. теперь запишем его в шаг
		
	}//цикл по шагам

	//даааа, мы сделали это. мы выполнили моделирование эволюции. теперь надо это отобразить. 
	for(int i=0;i<organs.size();i++)
	{
		cout<<"Name: "<<organs[i].name<<"\n";
		cout<<"Values - ";
		for(int j=0;j<number_of_steps;j++)
			cout<<organs[i].value_s[j]<< " ";
		cout<<"\n";
	}
	in.close();
	srand(1);
	getchar();
	getchar();
	return 0;
}

