1 | #include "allegro5/allegro.h"
|
2 | #include "GmOfFchsUndHs.h"
|
3 |
|
4 | //#define Nur1Hase
|
5 | //#define KeinGras
|
6 |
|
7 | FILE *Weltdaten;
|
8 | ALLEGRO_DISPLAY *display; //Pointer aufs Display
|
9 | sFeld SF[SpielfeldgroesseX][SpielfeldgroesseY]; //Das Spielfeld mit der Größe x*Y
|
10 | sHase HList[SpielfeldgroesseX*SpielfeldgroesseY*2]; //Eine Liste für die Hasen
|
11 | sFuchs FList[SpielfeldgroesseX*SpielfeldgroesseY*2]; //Eine Liste für die Füchse
|
12 | unsigned HCnt = 0; //Ein Zähler für die Hasen
|
13 | unsigned FCnt = 0; //Ein Zähler für die Füchse
|
14 | unsigned Tick = 0;
|
15 |
|
16 |
|
17 | int main()
|
18 | {
|
19 | Weltdaten = fopen("Weltdaten.CSV", "w");
|
20 | if (Weltdaten == NULL)
|
21 | {
|
22 | printf("Fehler beim Oeffnen der Datei.");
|
23 | return 1;
|
24 | }
|
25 |
|
26 | if(!al_init())
|
27 | {
|
28 | printf("Nich genuch Speicher");
|
29 | return EXIT_FAILURE;
|
30 | }
|
31 |
|
32 | srand(time(NULL)); //Zufallsgenerator initialisieren
|
33 |
|
34 | display = al_create_display(BildgroesseX, BildgroesseY);
|
35 |
|
36 | WeltInit();
|
37 | WeltMalen();
|
38 |
|
39 | while(HCnt >= 1 || FCnt >= 1)
|
40 | {
|
41 | WeltAendern();
|
42 | HasenAendern();
|
43 | FuchsAendern();
|
44 | //WeltMalen();
|
45 | printf("%u, %u, %u,\n", HCnt, FCnt, Tick);
|
46 | fprintf(Weltdaten, "%u, %u, %u,\n", HCnt, FCnt, Tick);
|
47 | Tick++;
|
48 | }
|
49 | fclose(Weltdaten);
|
50 | al_rest(1);
|
51 |
|
52 |
|
53 |
|
54 | return 0;
|
55 | }
|
56 |
|
57 |
|
58 | void killFuchs(unsigned FNr)
|
59 | {
|
60 | while(FNr < FCnt)
|
61 | {
|
62 | FList[FNr] = FList[FNr+1];
|
63 | FNr++;
|
64 | }
|
65 | FCnt--;
|
66 | }
|
67 |
|
68 | void killHase(unsigned HNr)
|
69 | {
|
70 | while(HNr < HCnt)
|
71 | {
|
72 | HList[HNr] = HList[HNr+1];
|
73 | HNr++;
|
74 | }
|
75 | HCnt--;
|
76 | }
|
77 |
|
78 | void WeltAendern()
|
79 | {
|
80 | unsigned x = 0;
|
81 | unsigned y = 0;
|
82 |
|
83 | while(x < SpielfeldgroesseX)
|
84 | {
|
85 | while(y < SpielfeldgroesseY)
|
86 | {
|
87 | if(SF[x][y].ZSA>9 && SF[x][y].ZSA%Graswuchsrythmus == 0)
|
88 | {
|
89 | SF[x][y].GH++;
|
90 | if(SF[x][y].GH >= 10)
|
91 | {
|
92 | SF[x][y].GH = 10;
|
93 | }
|
94 | }
|
95 | SF[x][y].ZSA++;
|
96 | y++;
|
97 | }
|
98 | y = 0;
|
99 | x++;
|
100 | }
|
101 | x = 0;
|
102 | }
|
103 |
|
104 | void FuchsAendern()
|
105 | {
|
106 | unsigned i = 0;
|
107 | unsigned j = 0;
|
108 |
|
109 | while(i < FCnt)
|
110 | {
|
111 | FList[i].Alter++;
|
112 |
|
113 | if(FList[i].Alter >= FMaxAlter)
|
114 | {
|
115 | killFuchs(i);
|
116 | }
|
117 | if(FList[i].Staerke == 0)
|
118 | {
|
119 | killFuchs(i);
|
120 | }
|
121 | else
|
122 | {
|
123 | if(FList[i].Geschlecht == 0 && FList[i].Staerke >= 4 && FList[i].Hunger <= 6) //Nach Paarungspartner umsehen,
|
124 | {
|
125 | while(j < FCnt)
|
126 | {
|
127 | if(FList[j].Geschlecht == 1 && FList[j].schwanger == 0 && sqrt( ( (FList[j].PosX - FList[i].PosX)*(FList[j].PosX - FList[i].PosX) )+( (FList[j].PosY - FList[i].PosY)*(FList[j].PosY - FList[i].PosY) ) ) <= PaarungsweiteFuchs)
|
128 | {
|
129 | FList[i].PosX = FList[j].PosX;
|
130 | FList[i].PosY = FList[j].PosX;
|
131 | FList[j].schwanger = Tick;
|
132 | }
|
133 | j++;
|
134 | }
|
135 | j = 0;
|
136 | }
|
137 |
|
138 | if(Tick - FList[i].schwanger >= TragzeitF && FList[i].schwanger != 0) //Nach100Ticks kommt der Nachwuchs
|
139 | {
|
140 | FList[i].schwanger = 0;
|
141 | FCnt++;
|
142 | FList[FCnt].Alter = 0;
|
143 | FList[FCnt].Geschlecht = rand()%2;
|
144 | FList[FCnt].Hunger = rand()%10;
|
145 | FList[FCnt].Mut = rand()%10;
|
146 | FList[FCnt].PosX = HList[i].PosX;
|
147 | FList[FCnt].PosY = HList[i].PosY;
|
148 | FList[FCnt].schwanger = 0;
|
149 | FList[FCnt].Staerke = rand()%10;
|
150 | FList[FCnt].ZoF = 0;
|
151 | }
|
152 |
|
153 |
|
154 | if(FList[i].Hunger >= 8)
|
155 | {
|
156 | while(j < HCnt)
|
157 | {
|
158 | if(sqrt( ( (HList[j].PosX - FList[i].PosX)*(HList[j].PosX - FList[i].PosX) ) + ( (HList[j].PosY - FList[i].PosY)*(HList[j].PosY - FList[i].PosY) ) ) <= SichtweiteFuchs)
|
159 | { //Falls Hasenposition - Fuchsposition innerhalb des Jagdradius (Pythagoras)
|
160 | FList[i].PosX = HList[j].PosX;
|
161 | FList[i].PosY = HList[j].PosY;
|
162 | if(rand()%100 <= Jagdglueck)
|
163 | {
|
164 | FList[i].Staerke += HList[j].Staerke;
|
165 | FList[i].Hunger = 0;
|
166 | killHase(j);
|
167 | }
|
168 | else
|
169 | {
|
170 | HList[j].PosX = rand()%SpielfeldgroesseX;
|
171 | HList[j].PosY = rand()%SpielfeldgroesseY;
|
172 | }
|
173 | j = HCnt;
|
174 | }
|
175 | j++;
|
176 | }
|
177 | j = 0;
|
178 | }
|
179 |
|
180 |
|
181 | FList[i].Hunger++;
|
182 |
|
183 | if(FList[i].Hunger >= 10)
|
184 | {
|
185 | FList[i].Hunger = 10;
|
186 | FList[i].PosX = ( FList[i].PosX + ( (unsigned)(rand()%10 - 5) ) )%SpielfeldgroesseX;
|
187 | FList[i].PosY = ( FList[i].PosY + ( (unsigned)(rand()%10 - 5) ) )%SpielfeldgroesseY;
|
188 | FList[i].Staerke--;
|
189 | }
|
190 | }
|
191 | i++;
|
192 | }
|
193 | }
|
194 |
|
195 | void FPPS(sFuchs *Fuchs)
|
196 | {
|
197 | unsigned j = 0;
|
198 |
|
199 | if(Fuchs->Geschlecht == 0 && Fuchs->Staerke >= 6 && Fuchs->Hunger <= 6) //Nach Paarungspartner umsehen,
|
200 | {
|
201 | while(j < FCnt)
|
202 | {
|
203 | if(FList[j].Geschlecht == 1 && FList[j].schwanger == 0 && sqrt( ( (FList[j].PosX - Fuchs->PosX)*(FList[j].PosX - Fuchs->PosX) )+( (FList[j].PosY - Fuchs->PosY)*(FList[j].PosY - Fuchs->PosY) ) ) <= PaarungsweiteFuchs)
|
204 | {
|
205 | Fuchs->PosX = FList[j].PosX;
|
206 | Fuchs->PosY = FList[j].PosX;
|
207 | FList[j].schwanger = Tick;
|
208 | }
|
209 | j++;
|
210 | }
|
211 | j = 0;
|
212 | }
|
213 | }
|
214 |
|
215 |
|
216 | void HasenAendern()
|
217 | {
|
218 | signed xShift = -SichtweiteHase;
|
219 | signed yShift = -SichtweiteHase;
|
220 | signed subx = 0;
|
221 | signed suby = 0;
|
222 | unsigned i = 0;
|
223 | unsigned j = 0;
|
224 | unsigned x = 0;
|
225 | unsigned y = 0;
|
226 | unsigned BestFeld[3] = {0, 0, 0};
|
227 |
|
228 | while(i < HCnt)
|
229 | {
|
230 | x = HList[i].PosX;
|
231 | y = HList[i].PosY;
|
232 | HList[i].Alter++;
|
233 |
|
234 | if(HList[i].Alter >= HMaxAlter)
|
235 | {
|
236 | killHase(i);
|
237 | }
|
238 | if(HList[i].Staerke == 0)
|
239 | {
|
240 | killHase(i);
|
241 | }
|
242 | else
|
243 | {
|
244 | if(HList[i].Geschlecht == 0)
|
245 | {
|
246 | if(HList[i].Staerke == 10 && HList[i].Hunger <= 3) //Nach Paarungspartner umsehen
|
247 | {
|
248 | while(j < HCnt)
|
249 | {
|
250 | if(HList[j].Geschlecht == 1 && HList[j].schwanger == 0 && sqrt( ( (HList[j].PosX - HList[i].PosX)*(HList[j].PosX - HList[i].PosX) )+( (HList[j].PosY - HList[i].PosY)*(HList[j].PosY - HList[i].PosY) ) ) <= PaarungsweiteHase)
|
251 | {
|
252 | HList[j].schwanger = Tick;
|
253 | }
|
254 | j++;
|
255 | }
|
256 | j = 0;
|
257 | }
|
258 | }
|
259 |
|
260 | if(Tick - HList[i].schwanger == TragzeitH && HList[i].schwanger != 0) //Nach100Ticks kommt der Nachwuchs
|
261 | {
|
262 | HList[i].schwanger = 0;
|
263 | HCnt++;
|
264 | HList[HCnt].Alter = 0;
|
265 | HList[HCnt].Geschlecht = rand()%2;
|
266 | HList[HCnt].Hunger = rand()%10;
|
267 | HList[HCnt].Mut = rand()%10;
|
268 | HList[HCnt].PosX = HList[i].PosX;
|
269 | HList[HCnt].PosY = HList[i].PosY;
|
270 | HList[HCnt].schwanger = 0;
|
271 | HList[HCnt].Staerke = rand()%10;
|
272 | HList[HCnt].ZoF = 0;
|
273 | }
|
274 |
|
275 |
|
276 | if(SF[x][y].GH > 0) //Wenn Gras da ist, fressen,
|
277 | {
|
278 | SF[x][y].GH--;
|
279 | SF[x][y].ZSA = 0;
|
280 | if(HList[i].Hunger > 0)
|
281 | {
|
282 | HList[i].Hunger--;
|
283 | }
|
284 | HList[i].ZoF = 0;
|
285 |
|
286 | if(HList[i].Hunger == 0) //Wenn kein Hunger mehr, Stärke erhöhen
|
287 | {
|
288 | HList[i].Staerke++;
|
289 | if(HList[i].Staerke >= 10)
|
290 | {
|
291 | HList[i].Staerke = 10;
|
292 | }
|
293 | }
|
294 | }
|
295 | else
|
296 | {
|
297 | if(HList[i].Staerke >= 1) //Solange nicht verhungert
|
298 | {
|
299 |
|
300 | HList[i].ZoF++;
|
301 | if(HList[i].ZoF >= 10)
|
302 | {
|
303 | HList[i].Hunger++;
|
304 | if(HList[i].Hunger >= 10)
|
305 | {
|
306 | HList[i].Hunger = 10;
|
307 | HList[i].Staerke--;
|
308 | }
|
309 | }
|
310 | //HList[i].PosX = rand()%SpielfeldgroesseX;
|
311 | //HList[i].PosY = rand()%SpielfeldgroesseY;
|
312 |
|
313 | while(xShift < SichtweiteHase) //Nach besserem Feld umsehen
|
314 | {
|
315 | while(yShift < SichtweiteHase)
|
316 | {
|
317 | subx = (x + xShift)%SpielfeldgroesseX;
|
318 | suby = (y + yShift)%SpielfeldgroesseY;
|
319 | if(SF[subx][suby].GH > BestFeld[2])
|
320 | {
|
321 | BestFeld[0] = subx;
|
322 | BestFeld[1] = suby;
|
323 | BestFeld[2] = SF[subx][suby].GH;
|
324 | }
|
325 | yShift++;
|
326 | }
|
327 | yShift = 0;
|
328 | xShift++;
|
329 | }
|
330 | xShift = 0;
|
331 | if(BestFeld[2] >= 1) //Wenn Feld mit mehr Gras im Sichtradius gefunden, hingehen
|
332 | {
|
333 | HList[i].PosX = BestFeld[0];
|
334 | HList[i].PosY = BestFeld[1];
|
335 | }
|
336 | else
|
337 | {
|
338 | HList[i].PosX = rand()%SpielfeldgroesseX; //wenn nicht, auf zufälliges Feld gehen
|
339 | HList[i].PosY = rand()%SpielfeldgroesseY;
|
340 | }
|
341 | BestFeld[0] = 0;
|
342 | BestFeld[1] = 0;
|
343 | BestFeld[2] = 0;
|
344 | }
|
345 | }
|
346 | }
|
347 | i++;
|
348 | }
|
349 | i = 0;
|
350 | x = 0;
|
351 | y = 0;
|
352 | }
|
353 |
|
354 |
|
355 | void WeltMalen()
|
356 | {
|
357 | unsigned i = 0;
|
358 | unsigned x = 0;
|
359 | unsigned y = 0;
|
360 | unsigned subx = 0;
|
361 | unsigned suby = 0;
|
362 |
|
363 | while(x < SpielfeldgroesseX)
|
364 | {
|
365 | while(y < SpielfeldgroesseY)
|
366 | {
|
367 | while(subx < FeldgroesseX)
|
368 | {
|
369 | while(suby < FeldgroesseY)
|
370 | {
|
371 | al_draw_pixel( (x*FeldgroesseX)+subx, (y*FeldgroesseY)+suby, al_map_rgb(0, SF[x][y].GH*25, 0));
|
372 | suby++;
|
373 | }
|
374 | suby = 0;
|
375 | subx++;
|
376 | }
|
377 | subx = 0;
|
378 | y++;
|
379 | }
|
380 | y = 0;
|
381 | x++;
|
382 | }
|
383 | x = 0;
|
384 |
|
385 | while(i < HCnt)
|
386 | {
|
387 | while(subx < FeldgroesseX/2)
|
388 | {
|
389 | while(suby < FeldgroesseY/2)
|
390 | {
|
391 | al_draw_pixel( (HList[i].PosX*FeldgroesseX)+subx, (HList[i].PosY*FeldgroesseY)+suby, al_map_rgb(0, 0, (HList[i].Staerke*25)));
|
392 | suby++;
|
393 | }
|
394 | suby = 0;
|
395 | subx++;
|
396 | }
|
397 | subx = 0;
|
398 | i++;
|
399 | }
|
400 | i = 0;
|
401 |
|
402 | while(i < FCnt)
|
403 | {
|
404 | while(subx < FeldgroesseX/2)
|
405 | {
|
406 | while(suby < FeldgroesseY/2)
|
407 | {
|
408 | al_draw_pixel( (FList[i].PosX*FeldgroesseX)+(FeldgroesseX/2)+subx, (FList[i].PosY*FeldgroesseY)+(FeldgroesseY/2)+suby, al_map_rgb((FList[i].Staerke*25), 0, 0));
|
409 | suby++;
|
410 | }
|
411 | suby = 0;
|
412 | subx++;
|
413 | }
|
414 | subx = 0;
|
415 | i++;
|
416 | }
|
417 | i = 0;
|
418 |
|
419 |
|
420 | while(x < SpielfeldgroesseX)
|
421 | {
|
422 | while(y < BildgroesseY)
|
423 | {
|
424 | al_draw_pixel((x*FeldgroesseX), y, al_map_rgb(127, 127, 127));
|
425 | y++;
|
426 | }
|
427 | y = 0;
|
428 | x++;
|
429 | }
|
430 | x = 0;
|
431 |
|
432 |
|
433 | while(y < SpielfeldgroesseY)
|
434 | {
|
435 | while(x < BildgroesseX)
|
436 | {
|
437 | al_draw_pixel(x, (y*FeldgroesseY), al_map_rgb(127, 127, 127));
|
438 | x++;
|
439 | }
|
440 | x = 0;
|
441 | y++;
|
442 | }
|
443 | y = 0;
|
444 |
|
445 |
|
446 | al_flip_display();
|
447 | }
|
448 |
|
449 |
|
450 | void WeltInit()
|
451 | {
|
452 | unsigned x = 0;
|
453 | unsigned y = 0;
|
454 | unsigned i = 0;
|
455 |
|
456 | while(x < SpielfeldgroesseX)
|
457 | {
|
458 | while(y < SpielfeldgroesseY)
|
459 | {
|
460 | #ifdef KeinGras
|
461 | SF[x][y].GH = 0;
|
462 | SF[x][y].ZSA = 0;
|
463 | #endif // KeinGras
|
464 |
|
465 | #ifndef KeinGras
|
466 | SF[x][y].GH = rand()%10; //Grashöhe zufällig zwischen 0 und 9 setzen
|
467 | if(SF[x][y].GH == 0) //Falls kein Gras gewachsen,
|
468 | {
|
469 | SF[x][y].ZSA = rand()%10; //bestimmen, wie lange das Feld schon ohne Gras ist
|
470 | }
|
471 | #endif // KeinGras
|
472 |
|
473 |
|
474 | #ifdef Nur1Hase
|
475 | if(HCnt < HLim)
|
476 | {
|
477 | #endif // Nur1Hase
|
478 | if(rand()%100 < 9) //1%Chance auf einen Hasen auf dem Feld
|
479 | {
|
480 | HList[HCnt].Geschlecht = rand()%2;
|
481 | if(HList[HCnt].Geschlecht == 1) //Falls Weibchen eine 1Promille-Chance würfeln, ob trächtig
|
482 | {
|
483 | if(rand()%1000 < 1)
|
484 | {
|
485 | HList[HCnt].schwanger = Tick; //Zeitpunkt merken, wann trächtig geworden
|
486 | }
|
487 | }
|
488 |
|
489 | HList[HCnt].Hunger = rand()%10; //Hunger bestimmt Risikobereitschaft vom Hasen
|
490 |
|
491 | HList[HCnt].Mut = rand()%10; //Wird vom Hunger beeinflusst,
|
492 |
|
493 | HList[HCnt].PosX = x;
|
494 | HList[HCnt].PosY = y;
|
495 |
|
496 | HList[HCnt].Staerke = rand()%10;
|
497 |
|
498 | HList[HCnt].Alter = rand()%HMaxAlter;
|
499 |
|
500 | HCnt++;
|
501 | }
|
502 | #ifdef Nur1Hase
|
503 | }
|
504 | #endif // Nur1Hase
|
505 |
|
506 | if(rand()%1000 < 5) //1%Chance auf einen Fuchs auf dem Feld
|
507 | {
|
508 | FList[FCnt].Geschlecht = rand()%2;
|
509 | if(FList[FCnt].Geschlecht == 1) //Falls Weibchen eine 1Promille-Chance würfeln, ob trächtig
|
510 | {
|
511 | if(rand()%1000 < 1)
|
512 | {
|
513 | FList[FCnt].schwanger = Tick; //Zeitpunkt merken, wann trächtig geworden
|
514 | }
|
515 | }
|
516 |
|
517 | FList[FCnt].Hunger = rand()%10; //Hunger bestimmt Risikobereitschaft vom Fuchs
|
518 |
|
519 | FList[FCnt].Mut = rand()%10; //Wird vom Hunger beeinflusst,
|
520 |
|
521 | FList[FCnt].PosX = x;
|
522 | FList[FCnt].PosY = y;
|
523 |
|
524 | FList[FCnt].Staerke = rand()%10;
|
525 |
|
526 | FList[FCnt].Alter = rand()%FMaxAlter;
|
527 |
|
528 | FCnt++;
|
529 | }
|
530 |
|
531 |
|
532 |
|
533 | y++;
|
534 | }
|
535 | y = 0;
|
536 | x++;
|
537 | }
|
538 |
|
539 |
|
540 | while(i < HCnt)
|
541 | {
|
542 | printf("Hase Nr:%u ist ", i);
|
543 | if(HList[i].Geschlecht == 1)
|
544 | {
|
545 | printf("weiblich ");
|
546 | }
|
547 | else
|
548 | {
|
549 | printf("männlich ");
|
550 | }
|
551 | printf("und auf Feld X: %u Y: %u\n\n", HList[i].PosX, HList[i].PosY);
|
552 | i++;
|
553 | }
|
554 | i = 0;
|
555 |
|
556 | while(i < FCnt)
|
557 | {
|
558 | printf("Fuchs Nr:%u ist ", i);
|
559 | if(FList[i].Geschlecht == 1)
|
560 | {
|
561 | printf("weiblich ");
|
562 | }
|
563 | else
|
564 | {
|
565 | printf("männlich ");
|
566 | }
|
567 | printf("und auf Feld X: %u Y: %u\n\n", FList[i].PosX, FList[i].PosY);
|
568 | i++;
|
569 | }
|
570 | i = 0;
|
571 | }
|