fork(34) download
  1. //Создать класс живущих с местоположением. Определить наследуемые классы
  2. //- лиса, кролик и трава. Лиса ест кролика. Кролик ест траву.
  3. //Лиса может умереть - определен возраст. Кролик тоже может умереть.
  4. //Кроме этого определен класс - отсутствие жизни.
  5. //Если в окрестности имеется больше травы, чем кроликов,
  6. //то трава остается, иначе трава съедена.
  7. //Если лис слишком старый он может умереть.
  8. //Если лис слишком много (больше 5 в окрестности),
  9. //лисы больше не появляются. Если кроликов меньше лис, то лис ест кролика.
  10.  
  11. #include <iostream>
  12. using namespace std;
  13.  
  14. #include "conio.h"
  15. // моделирование хищник - жертва с использованием
  16. // иерархии классов
  17. const int N=6, // размер квадратной площади (мира)
  18. STATES=4, // количество видов жизни
  19. DRAB=5,DFOX=5, // количество циклов жизни кролика и лиса
  20. CYCLES=10; // общее число циклов моделирования мира
  21. enum state{EMPTY,GRASS,RABBIT,FOX};
  22. class living; // forvard объявление
  23. typedef living *world[N][N]; // world- модель мира
  24. void init(world);
  25. void gener(world);
  26. void update(world,world);
  27. void dele(world);
  28.  
  29.  
  30.  
  31. class living
  32. {
  33. protected:
  34. int row,col; // местоположение в модели
  35. void sums(world w,int sm[]); //
  36. public:
  37. living(int r,int c):row(r),col(c){}
  38. virtual state who() = 0; // идентификация состояний
  39. virtual living *next(world w)=0; // расчет next
  40. virtual void print()=0; // вывод содержимого поля модели
  41.  
  42. };
  43.  
  44. void living::sums(world w,int sm[])
  45. {
  46. int i,j;
  47. sm[EMPTY]=sm[GRASS]=sm[RABBIT]=sm[FOX]=0;
  48. int i1=-1,i2=1,j1=-1,j2=1;
  49. if(row==0) // 0=0 +
  50. i1=0; // координаты внешних клеток модели
  51. if(row==N-1) // 0=5 -
  52. i2=0;
  53. if(col==0) //0=0+
  54. j1=0;
  55. if(col==N-1) // 0=5 -
  56. j2=0;
  57. for(i=i1;i<=i2;++i)
  58. for(j=j1;j<=j2;++j)
  59. sm[w[row+i][col+j]->who()]++;
  60. }
  61.  
  62. class fox:public living
  63. {
  64. protected:
  65. int age; // используется для принятия решения о смерти лиса
  66. public:
  67. fox(int r,int c,int a=0):living(r,c),age(a){}//
  68. state who() {return FOX;} // отложенный метод для foxes
  69. living *next(world w); // отложенный метод для foxes
  70. void print(){cout << " ли ";}
  71. };
  72.  
  73. class rabbit:public living
  74. {
  75. protected:
  76. int age; // используется для принятия решения о смерти кролика
  77. public:
  78. rabbit(int r,int c,int a=0):living(r,c),age(a){}
  79. state who() {return RABBIT;} // отложенный метод для rabbit
  80. living *next(world w); // отложенный метод для rabbit
  81. void print(){cout << " кр ";}
  82. };
  83. class grass:public living
  84. {
  85. public:
  86. grass(int r,int c):living(r,c){}
  87. state who() {return GRASS;} // отложенный метод для grass
  88. living *next(world w); // отложенный метод для grass
  89. void print(){cout << " тр ";}
  90. };
  91.  
  92.  
  93.  
  94. class empty : public living// жизнь отсутствует
  95. {
  96. public:
  97. empty(int r,int c):living(r,c){}
  98. state who() {return EMPTY;} // отложенный метод для empty
  99. living *next(world w); // отложенный метод для empty
  100. void print(){cout << " ";}
  101. };
  102.  
  103. living *grass::next(world w)
  104. {
  105. int sum[STATES];
  106. sums(w,sum);
  107. if(sum[GRASS]>sum[RABBIT]) // кролик ест траву
  108. return (new grass(row,col));
  109. else
  110. return (new empty(row,col));
  111. }
  112.  
  113. living *rabbit::next(world w)
  114. {
  115. int sum[STATES];
  116. sums(w,sum);
  117. if(sum[FOX]>=sum[RABBIT]) // лис ест кролика
  118. return (new empty(row,col));
  119. else if(age>DRAB) // кролик слишком старый
  120. return(new empty(row,col));
  121. else
  122. return(new rabbit(row,col,age+1)); // кролик постарел
  123.  
  124. }
  125. living *fox::next(world w)
  126. {
  127. int sum[STATES];
  128. sums(w,sum);
  129. if(sum[FOX]>5) // слишком много лис
  130. return (new empty(row,col));
  131. else if(age>DFOX) // лис слишком старый
  132. return(new empty(row,col));
  133. else
  134. return(new fox(row,col,age+1)); // лис постарел
  135. }
  136.  
  137. // заполнение пустой площади
  138.  
  139. living *empty::next(world w)
  140.  
  141. {
  142. int sum[STATES];
  143. sums(w,sum);
  144. if(sum[FOX]>1) // если лис больше
  145. return (new fox(row,col)); // добавляем Лис
  146. else if(sum[RABBIT]>1) // если Кроликов больше
  147. return (new rabbit(row,col));//добавляются кролики
  148. else if(sum[GRASS])
  149. return (new grass(row,col));// третьими добавляются растения
  150. else
  151. return (new empty(row,col));// иначе пусто
  152. }
  153.  
  154. void init(world w)
  155. {
  156. int i,j;
  157. for(i=0;i<N;++i)
  158. for(j=0;j<N;++j)
  159. w[i][j]=new empty(i,j);
  160. }
  161.  
  162. // генерация исходной модели мира
  163.  
  164. void gener(world w)
  165. {
  166. int i,j;
  167. for(i=0;i<N;++i)
  168. for(j=0;j<N;++j)
  169. {
  170. if(i%2==0 && j%3==0)
  171. w[i][j]=new fox(i,j);
  172. else if(i%3==0 && j%2==0)
  173. w[i][j]=new rabbit(i,j);
  174. else
  175. if(i%5==0)
  176. w[i][j]=new grass(i,j);
  177. else w[i][j]=new empty(i,j);
  178.  
  179. }
  180.  
  181. }
  182.  
  183. void pr_state(world w)
  184. {
  185. int i,j;
  186. for(i=0;i<N;++i)
  187. {
  188. cout<<endl;
  189. for(j=0;j<N;++j)
  190. w[i][j]->print();
  191. }
  192. cout << endl;
  193. }
  194.  
  195. // новый world w_new рассчитывается из старого world w_old
  196.  
  197. void update(world w_new, world w_old)
  198. {
  199. int i,j;
  200. for(i=0;i<N;++i)
  201. for(j=0;j<N;++j)
  202. w_new[i][j]=w_old[i][j]->next(w_old);
  203. }
  204.  
  205. // очистка мира
  206.  
  207. void dele(world w)
  208. {
  209. int i,j;
  210. for(i=1;i<N-1;++i)
  211. for(j=1;j<N-1;++j) delete(w[i][j]);
  212. }
  213.  
  214.  
  215. int main()
  216. {
  217. world odd,even;
  218. int i;
  219. init(odd);
  220. init(even);
  221. gener(even); // генерация начального мира
  222. cout<<"1 цикл жизни модели"<<endl;
  223. pr_state(even); // вывод сгенерированной модели
  224. for(i=0;i<CYCLES-1;++i) //цикл моделирования
  225. {
  226. getch();
  227. cout<<i+2<<" цикл жизни модели"<<endl;
  228. if(i%2)
  229. {
  230. update(even,odd); // создание even модели из odd модели
  231. pr_state(even); // вывод сгенерированной модели even
  232. dele(odd); // удаление модели odd
  233. }
  234. else
  235. {
  236. update(odd,even); // создание odd модели из even модели
  237. pr_state(odd); // вывод сгенерированной модели odd
  238. dele(even); // удаление модели even
  239. }
  240. }
  241. return 1;
  242. }
  243.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:14:19: fatal error: conio.h: No such file or directory
 #include "conio.h"
                   ^
compilation terminated.
stdout
Standard output is empty