genunit.pas 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. unit genunit;
  2. interface
  3. CONST
  4. XCount = 30; {Размер поля}
  5. YCount = 20;
  6. FieldSize = XCount * YCount div 8; {Объем информации, требуемой для ее хранения}
  7. LifeTimeAdd : array [0..9] of longint = (50,30,20,10,10,10,10,5,5,5);
  8. type
  9. {Самый примитивный, всего одна хромосома - Х}
  10. EChromos = (CR_X); {Переч. хромосом}
  11. CONST
  12. CFirstChromo : EChromos = CR_X;
  13. CLastChromo : EChromos = CR_X;
  14. TYPE
  15. {Пол (0-м), 2 бита цвета, ост 2 бита цвета,размер,Сила,Ум,
  16. Возраст,-//-2}
  17. EGenesX = (GEN_X_GENDER,GEN_X_COL_RG,GEN_X_COL_BA, {Перечень генов в X-хромосоме}
  18. GEN_X_SIZE,GEN_X_STRENGTH,GEN_X_MIND,GEN_X_AGE1,GEN_X_AGE2);
  19. CONST
  20. CFirstGeneX : EGenesX = GEN_X_GENDER;
  21. CLastGeneX : EGenesX = GEN_X_AGE2;
  22. TYPE
  23. EColors = (COL_Black,COL_Blue,COL_Green,COL_Cyan,COL_Red,COL_Magenta,
  24. COL_Brown,COL_LightGray,COL_DarkGray,COL_LightBlue,
  25. COL_LightGreen,COL_LightCyan,COL_LightRed,COL_LightMagenta,
  26. COL_Yellow,COL_White);
  27. EAStages = (AGE_CHILD,AGE_YOUTH,AGE_NORMAL,AGE_OLDMAN,AGE_DEAD);
  28. {Стадии возраста клеток}
  29. TChromo = array [EGenesX] of byte; {Хромосома, как набор генов}
  30. TChromos = array [EChromos] of TChromo;
  31. {Одиночный хромосомный набор (гаплоидный)}
  32. Tvec = record x,y:real; end;
  33. PCreature = ^Creature;
  34. {CReature}
  35. Creature = object
  36. private
  37. Genos : array [1..2] of TChromos;
  38. {Генотип (диплоидный набор)}
  39. Age : longint; {Возраст}
  40. AgeStage : EAStages; {Стадии возраста}
  41. MaxAge : longint; {Возраст смерти}
  42. Children : longint;
  43. CrMom, CrDad : pcreature;{Родители}
  44. Public
  45. Gender : char; {Пол (W/M)}
  46. Color : EColors; {Цвет}
  47. Size : byte; {Размер}
  48. Pos : Tvec; {Положение на поле}
  49. Constructor Init(apos : tvec; aC1,aC2 : TChromos;aMom,aDad : pcreature);
  50. Procedure SetGamete(var aG : TChromos);
  51. Procedure AddChild;
  52. Function GetRandomGene(aJ : EGenesX):Byte;
  53. end;
  54. {/CReature}
  55. PCList = ^TCList;
  56. TCList = record {Список существ}
  57. Cr : pcreature;
  58. Next,Prev : PCList;
  59. end;
  60. TCreatureEnumProc = procedure(pC : PCreature);
  61. {CWorld}
  62. CWorld = object {Объект - мир}
  63. Field : array [1..FieldSize] of byte; {Битовое поле существ}
  64. Creatures : PCList; {Сами существа}
  65. CreatureCount : longint; {Их кол-во}
  66. Constructor Init;
  67. Function CreateChild(aPos:TVec; aMom,aDad : PCreature):PCreature;
  68. procedure SetFieldPos(x,y : word); {Установка бита в поле}
  69. Function GetFieldPos(x,y:word) : boolean; {..}
  70. Procedure ForEachCreature(aProc : TCreatureEnumProc);
  71. procedure UnSetFieldPos(x,y : word); {Снятие бита поля}
  72. Function AddNewCreature(aPos : tvec; aC1,aC2 : TChromos;aMom,aDad : pcreature):pCreature;
  73. {Добавление существа в мир}
  74. Destructor Done;
  75. end;
  76. {CWorld}
  77. Implementation
  78. Constructor Creature.Init;
  79. begin
  80. Randomize;
  81. Children := 0;
  82. pos := aPos;
  83. Age := 0;
  84. AgeStage := AGE_CHILD;
  85. move(aC1,Genos[1],Sizeof(aC1));
  86. move(aC2,Genos[2],Sizeof(aC2));
  87. if Genos[1][CR_X][GEN_X_GENDER] = Genos[2][CR_X][GEN_X_GENDER] then Gender := 'W'
  88. else Gender := 'M';
  89. MaxAge := random(LifeTimeAdd[random(10)]);
  90. MaxAge := Integer(random(2)*2-1)*MaxAge;
  91. MaxAge := MaxAge + Genos[1][CR_X][GEN_X_AGE1] + Genos[2][CR_X][GEN_X_AGE1]+
  92. Genos[1][CR_X][GEN_X_AGE2] + Genos[2][CR_X][GEN_X_AGE2]+LongInt(51);
  93. Color := EColors(Genos[1][CR_X][GEN_X_COL_RG] and 1 +
  94. Genos[2][CR_X][GEN_X_COL_RG] and 2 +
  95. Genos[1][CR_X][GEN_X_COL_BA] and 4 +
  96. Genos[2][CR_X][GEN_X_COL_BA] and 8
  97. );
  98. if (Genos[1][CR_X][GEN_X_SIZE] <> 0) or (Genos[2][CR_X][GEN_X_SIZE] <> 0) then
  99. Size := 10
  100. else
  101. Size := 5;
  102. CrMom := aMom;
  103. CrDad := aDad;
  104. end;{Creature.Init}
  105. {------------------------------}
  106. Function Creature.GetRandomGene(aJ : EGenesX):Byte;
  107. begin
  108. GetRandomGene := Genos[random(2)+1][CR_X][aJ]
  109. end;{Creature.GetRandomGene}
  110. {------------------------------}
  111. Procedure Creature.SetGamete;
  112. var
  113. j : EGenesX;
  114. begin
  115. randomize;
  116. for j := CFirstGeneX to CLastGeneX do aG[CR_X][j] := GetRandomGene(j);
  117. end;{Creature.SetGamete}
  118. {------------------------------}
  119. Procedure Creature.AddChild;
  120. begin
  121. inc(Children);
  122. end;{Creature.AddChild}
  123. {/Creature}
  124. {/////////////////////////////////////////////////////////}
  125. {CWorld}
  126. Constructor CWorld.Init;
  127. begin
  128. Creatures := nil;
  129. CreatureCount :=0;
  130. FillChar(Field,FieldSize,0);
  131. end;{CWorld.Init}
  132. {----------------------------------------------}
  133. Function CWorld.AddNewCreature;
  134. var
  135. NNN : PCList;
  136. NC : PCreature;
  137. begin
  138. New(NC);
  139. NC^.Init(aPos,aC1,aC2,aMom,aDad);
  140. SetFieldPos(Round(aPos.X),Round(aPos.Y));
  141. Inc(CreatureCount);
  142. NNN := New(PClist);
  143. NNN^.Cr := NC;
  144. NNN^.Prev := Creatures;
  145. NNN^.Next := nil;
  146. if Creatures <> nil then Creatures^.Next := NNN;
  147. Creatures := NNN;
  148. AddNewCreature := NC;
  149. End;{CWorld.AddNewCreature}
  150. {-----------------------------------------------}
  151. Function CWorld.CreateChild;
  152. var
  153. cr1,cr2 : TChromos;
  154. begin
  155. aMom^.SetGamete(cr1);
  156. aDad^.SetGamete(cr2);
  157. aMom^.AddChild;
  158. aDad^.AddChild;
  159. CreateChild:=AddNewCreature(aPos,cr1,cr2,aMom,aDad);
  160. end;{CWorld.CreateChild}
  161. {-----------------------------------------------}
  162. procedure CWorld.SetFieldPos(x,y : word);
  163. var
  164. Cbyte : longint;
  165. Cbit : byte;
  166. Mask : byte;
  167. begin
  168. CByte := (y*YCount + X) div 8;
  169. CBit := (y*YCount + X) mod 8;
  170. Mask := 1 shl (7-CBit);
  171. Field[Cbyte] := Field[Cbyte] or Mask;
  172. end;{CWorld.SetFieldPos}
  173. {--------------------------}
  174. procedure CWorld.UnSetFieldPos(x,y : word);
  175. var
  176. Cbyte : longint;
  177. Cbit : byte;
  178. Mask : byte;
  179. begin
  180. CByte := (y*YCount + X) div 8;
  181. CBit := (y*YCount + X) mod 8;
  182. Mask := 255 xor (1 shl (7-CBit));
  183. Field[Cbyte] := Field[Cbyte] and Mask;
  184. end;{CWorld.UnSetFieldPos}
  185. {------------------------------------------}
  186. Function CWorld.GetFieldPos(x,y:word) : boolean;
  187. var
  188. Cbyte : longint;
  189. Cbit : byte;
  190. Mask : byte;
  191. begin
  192. CByte := (y*YCount + X) div 8;
  193. CBit := (y*YCount + X) mod 8;
  194. Mask := Field[Cbyte] shr (7-Cbit);
  195. if Mask and 1 = 1 then GetFieldPos := true
  196. else GetFieldPos := false;
  197. end; {CWorld.GetFieldPos}
  198. {-----------------------------------------------}
  199. Procedure CWorld.ForEachCreature;
  200. var
  201. C : PCList;
  202. begin
  203. C := Creatures;
  204. while C <> nil do begin aProc(C^.Cr); c:=c^.prev; end;
  205. end;{CWorld.ForEachCreature}
  206. {-----------------------------------------------}
  207. Destructor CWorld.Done;
  208. var
  209. C : PCList;
  210. begin
  211. while Creatures <> nil do
  212. begin
  213. C:=Creatures;
  214. Creatures:=Creatures^.Prev;
  215. Dispose(C);
  216. end;
  217. end;{CWorld.Done}
  218. {/CWorld}
  219. {////////////////////////////////////////////////////}
  220. end.