GmOfFchsUndHs.c


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
}