GameOfLife.c


1
#include "GameOfLife.h"
2
#include "main.h"
3
#include "stm32f7xx_hal.h"
4
#include "stm32f7xx_hal_rng.h"
5
6
7
uint8_t Layerswitch = 0;
8
9
void GameOfLife (void)
10
{
11
  const uint16_t Spielfeldgroesse_x = 90;
12
  const uint16_t Spielfeldgroesse_y = 50;
13
14
  uint8_t Wahrscheinlichkeit = 20;
15
16
  uint8_t Spielfeld[Spielfeldgroesse_x][Spielfeldgroesse_y];      // 0bXXXXXXX0   Bit0 = Lebend/tot 1/0;
17
  uint8_t Spielfeldschatten[Spielfeldgroesse_x][Spielfeldgroesse_y];
18
  uint8_t *SpielfeldPt = &Spielfeld[0][0];
19
  uint8_t *SpielfeldschattenPt = &Spielfeldschatten[0][0];
20
21
22
23
  uint32_t x = 0;
24
  uint32_t y = 0;
25
26
27
28
  GameOfLife_Spielfeldinit_Random(Wahrscheinlichkeit, Spielfeldgroesse_x, Spielfeldgroesse_y, SpielfeldPt, SpielfeldschattenPt);
29
  while(1)
30
  {
31
    GameOfLife_Spielfeldzeichnen(Spielfeldgroesse_x, Spielfeldgroesse_y, SpielfeldPt);
32
    GameOfLife_Zug(Spielfeldgroesse_x, Spielfeldgroesse_y, SpielfeldPt, SpielfeldschattenPt);
33
34
    while(y < Spielfeldgroesse_y)
35
    {
36
      while(x < Spielfeldgroesse_x)
37
      {
38
        *(SpielfeldPt + (Spielfeldgroesse_x*y) + x ) = *(SpielfeldschattenPt + (Spielfeldgroesse_x*y) + x );
39
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*y) + x ) = 0;
40
        x++;
41
      }
42
      x = 0;
43
      y++;
44
    }
45
  }
46
}
47
48
void GameOfLife_Spielfeldinit_Random(uint8_t Wahrscheinlichkeit, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt)
49
{
50
  uint16_t X = 0;
51
  uint16_t Y = 0;
52
53
  while (Y < Spielfeldgroesse_y)
54
  {
55
    while (X < Spielfeldgroesse_x)
56
    {
57
      *( SpielfeldPt +((Y * Spielfeldgroesse_x) + (X)) ) = Zufall(Wahrscheinlichkeit)%2;
58
      *( SpielfeldschattenPt +((Y * Spielfeldgroesse_x) + (X)) ) = *( SpielfeldPt +((Y * Spielfeldgroesse_x) + (X)) );
59
60
      X++;
61
    }
62
    X = 0;
63
    Y++;
64
  }
65
}
66
67
void GameOfLife_Spielfeldinit_0(uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt)
68
{
69
  uint16_t X = 0;
70
  uint16_t Y = 0;
71
72
  while (Y < Spielfeldgroesse_y)
73
  {
74
    while (X < Spielfeldgroesse_x)
75
    {
76
      *( SpielfeldPt +((Y * Spielfeldgroesse_x) + (X)) ) = 0;
77
      *( SpielfeldschattenPt +((Y * Spielfeldgroesse_x) + (X)) ) = 0;
78
79
      X++;
80
    }
81
    X = 0;
82
    Y++;
83
  }
84
}
85
86
void GameOfLife_Spielfeldinit_1(uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt)
87
{
88
  uint16_t X = 0;
89
  uint16_t Y = 0;
90
91
  while (Y < Spielfeldgroesse_y)
92
  {
93
    while (X < Spielfeldgroesse_x)
94
    {
95
      *( SpielfeldPt +((Y * Spielfeldgroesse_x) + (X)) ) = 1;
96
      *( SpielfeldschattenPt +((Y * Spielfeldgroesse_x) + (X)) ) = 1;
97
98
      X++;
99
    }
100
    X = 0;
101
    Y++;
102
  }
103
}
104
105
void GameOfLife_Spielfeldzeichnen(uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y, uint8_t *SpielfeldPt)
106
{
107
  uint32_t X = 0;
108
  uint32_t Y = 0;
109
110
  uint8_t i = 0;
111
  uint8_t j = 0;
112
113
  uint8_t Textarray[] = "Conways Game of Life";
114
  uint8_t *TextPt = &Textarray[0];
115
116
117
  /*
118
  Layerswitch ^= 1;
119
120
  if(Layerswitch)
121
  {
122
    Layer1_schreiben__Layer2_zeigen();
123
  }
124
  else
125
    {
126
      Layer2_schreiben__Layer1_zeigen();
127
    }
128
129
  */
130
131
132
  while (Y < Spielfeldgroesse_y)
133
  {
134
    while (X < Spielfeldgroesse_x)
135
    {
136
      if(  *( SpielfeldPt +((Y * Spielfeldgroesse_x) + (X)) )  )
137
      {
138
        while(i <= 5)
139
        {
140
          while(j <= 5)
141
          {
142
            DrawPixel( ((X*5)+j), ((Y*5)+i), 0xFFFF0000);
143
            j++;
144
          }
145
          j = 0;
146
          i++;
147
        }
148
        i = 0;
149
      }
150
151
      X++;
152
    }
153
    X = 0;
154
    Y++;
155
  }
156
  Y = 0;
157
158
  while ( Y <= (5*Spielfeldgroesse_y) )
159
  {
160
    DrawLine(0, Y, 5*Spielfeldgroesse_x, Y);
161
    Y += 5;
162
  }
163
  Y = 0;
164
165
  while ( X <= (5*Spielfeldgroesse_x) )
166
  {
167
    DrawLine(X, 0, X, 5*Spielfeldgroesse_y);
168
    X += 5;
169
  }
170
  X = 0;
171
172
  DrawString(10, 252, TextPt);
173
174
175
  /*
176
  if(Layerswitch)
177
  {
178
    Layer2_schreiben__Layer1_zeigen();
179
  }
180
  else
181
    {
182
      Layer1_schreiben__Layer2_zeigen();
183
    }
184
  */
185
186
}
187
188
void GameOfLife_Zug (uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt)
189
{
190
  uint8_t Spielregeln[3] = {1, 4, 3};
191
  /*
192
   * Wenn eine lebende Zelle den ersten Arraywert oder weniger lebende Nachbarn hat, stirbt sie an Vereinsamung.
193
   * Wenn eine lebende Zelle den zweiten Arraywert oder mehr lebende Nachbarn hat, stirbt sie an Überbevölkerung.
194
   * Wenn eine tote Zelle genau den dritten Arraywert an lebenden Nachbarn hat, wird sie lebendig.
195
   */
196
  uint8_t *RegelPt = &Spielregeln[0];
197
198
199
  LinksObenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
200
  RechtsObenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
201
  LinksUntenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
202
  RechtsUntenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
203
  RandObenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
204
  RandUntenCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
205
  RandLinksCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
206
  RandRechtsCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
207
  FeldCheck(RegelPt, SpielfeldPt, SpielfeldschattenPt, Spielfeldgroesse_x, Spielfeldgroesse_y);
208
}
209
210
void LinksObenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
211
{
212
  uint8_t Nachbarschaft = 0;
213
  /*
214
   * hier wird die obere linke Eckezelle auf lebende Nachbarn überprüft. Die "Nachbarn" liegen aber auch über die Ecken,
215
   * daher würde der Zahlindex unterlaufen (0 --> 65535) da dass Spielfeld nicht 16bit groß ist. Um die in der Nachbarschaftsabfrage
216
   * für die Zellen im Feld und nicht am Rand sonst nötige If-Abfrage zu sparen, werden die Ecken und Ränder einzeln abgehandelt.
217
   */
218
  if( *SpielfeldPt )                    //Prüfen ob Zelle(0,0) lebt. Zelle(0,0) ist die in der linken oberen Ecke
219
  {                          //Falls sie lebt
220
    if( *( SpielfeldPt + 1) )            //prüfen ob die Zelle(1,0) rechts daneben lebt
221
    {
222
      Nachbarschaft++;
223
    }
224
225
    if( *(SpielfeldPt + Spielfeldgroesse_x) )     //prüfen ob die Zelle(0,1) darunter lebt (SpielfeldPt + Spielfeldgroesse_x) ist die erste Zelle der 2ten Reihe
226
    {
227
      Nachbarschaft++;
228
    }
229
230
    if( *(SpielfeldPt + Spielfeldgroesse_x + 1) )     //prüfen ob die Zelle(1,1) darunter rechts lebt (SpielfeldPt + Spielfeldgroesse_x + 1) ist  die zweite Zelle der 2ten Reihe
231
    {
232
      Nachbarschaft++;
233
    }
234
235
    if( *(SpielfeldPt + Spielfeldgroesse_x - 1) )     //(SpielfeldPt + Spielfeldgroesse_x - 1) ist  die letzte Zelle der 1ten Reihe
236
    {
237
      Nachbarschaft++;
238
    }
239
240
    if( *(SpielfeldPt + (Spielfeldgroesse_x*2) - 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*2) - 1) ist  die letze Zelle der 2ten Reihe
241
    {
242
      Nachbarschaft++;
243
    }
244
245
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) ist  die erste Zelle der letzten Reihe
246
    {
247
      Nachbarschaft++;
248
    }
249
250
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) + 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) +1) ) ist  die zweite Zelle der letzten Reihe
251
    {
252
      Nachbarschaft++;
253
    }
254
255
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) ist  die letzte Zelle der letzten Reihe
256
    {
257
      Nachbarschaft++;
258
    }
259
260
    /*
261
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
262
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
263
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
264
     * verfälschten sie die Werte für die weitere Überprüfung.
265
     */
266
    if ( (Nachbarschaft <= *(RegelPt + LuG)) )
267
    {
268
      *SpielfeldschattenPt = TOT;
269
    }
270
    else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
271
      {
272
        *SpielfeldschattenPt = TOT;
273
      }
274
      else
275
        {
276
          *SpielfeldschattenPt = LEBENDIG;
277
        }
278
    Nachbarschaft = 0;
279
280
  }
281
  else  //Falls die Zelle tot ist:
282
  {
283
    if( *( SpielfeldPt + 1) )            //prüfen ob die Zelle(1,0) rechts daneben lebt
284
    {
285
      Nachbarschaft++;
286
    }
287
288
    if( *(SpielfeldPt + Spielfeldgroesse_x) )     //prüfen ob die Zelle(0,1) darunter lebt (SpielfeldPt + Spielfeldgroesse_x) ist die erste Zelle der 2ten Reihe
289
    {
290
      Nachbarschaft++;
291
    }
292
293
    if( *(SpielfeldPt + Spielfeldgroesse_x + 1) )     //prüfen ob die Zelle(1,1) darunter rechts lebt (SpielfeldPt + Spielfeldgroesse_x + 1) ist  die zweite Zelle der 2ten Reihe
294
    {
295
      Nachbarschaft++;
296
    }
297
298
    if( *(SpielfeldPt + Spielfeldgroesse_x - 1) )     //(SpielfeldPt + Spielfeldgroesse_x - 1) ist  die letzte Zelle der 1ten Reihe
299
    {
300
      Nachbarschaft++;
301
    }
302
303
    if( *(SpielfeldPt + (Spielfeldgroesse_x*2) - 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*2) - 1) ist  die letze Zelle der 2ten Reihe
304
    {
305
      Nachbarschaft++;
306
    }
307
308
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) ist  die erste Zelle der letzten Reihe
309
    {
310
      Nachbarschaft++;
311
    }
312
313
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) + 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) +1) ) ist  die zweite Zelle der letzten Reihe
314
    {
315
      Nachbarschaft++;
316
    }
317
318
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) )     //(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) ist  die letzte Zelle der letzten Reihe
319
    {
320
      Nachbarschaft++;
321
    }
322
323
    /*
324
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
325
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
326
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
327
     * verfälschten sie die Werte für die weitere Überprüfung.
328
     */
329
    if ( (Nachbarschaft == *(RegelPt + TwL)) )
330
    {
331
      *SpielfeldschattenPt = LEBENDIG;
332
    }
333
    else
334
      {
335
        *SpielfeldschattenPt = TOT;
336
      }
337
    Nachbarschaft = 0;
338
  }
339
}
340
341
void RechtsObenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
342
{
343
  uint8_t Nachbarschaft = 0;
344
  /*
345
   * hier wird die obere linke Eckezelle auf lebende Nachbarn überprüft. Die "Nachbarn" liegen aber auch über die Ecken,
346
   * daher würde der Zahlindex unterlaufen (0 --> 65535) da dass Spielfeld nicht 16bit groß ist. Um die in der Nachbarschaftsabfrage
347
   * für die Zellen im Feld und nicht am Rand sonst nötige If-Abfrage zu sparen, werden die Ecken und Ränder einzeln abgehandelt.
348
   */
349
  if( *(SpielfeldPt + (Spielfeldgroesse_x-1)) )        //Prüfen ob Zelle rechts oben lebt. Spielfeldgroesse_x-1 zeigt auf die letzte Zelle der ersten Reihe
350
  {                          //Falls sie lebt
351
    if( *( SpielfeldPt) )              //prüfen ob die Zelle(0,0) "rechts" daneben lebt
352
    {
353
      Nachbarschaft++;
354
    }
355
356
    if( *(SpielfeldPt + Spielfeldgroesse_x) )     //prüfen ob die Zelle(0,1) darunter "rechts" lebt (SpielfeldPt + Spielfeldgroesse_x) ist die erste Zelle der 2ten Reihe
357
    {
358
      Nachbarschaft++;
359
    }
360
361
    if( *(SpielfeldPt + Spielfeldgroesse_x - 2) )     //prüfen ob die Zelle links daneben lebt. (SpielfeldPt + Spielfeldgroesse_x - 2) ist die vorletzte Zelle der 1ten Reihe
362
    {
363
      Nachbarschaft++;
364
    }
365
366
    if(  *(SpielfeldPt + ((Spielfeldgroesse_x*2) - 1) )   )
367
    {
368
      Nachbarschaft++;
369
    }
370
371
    if( *(SpielfeldPt + ((Spielfeldgroesse_x*2) - 2) )   )
372
    {
373
      Nachbarschaft++;
374
    }
375
376
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) )
377
    {
378
      Nachbarschaft++;
379
    }
380
381
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) )
382
    {
383
      Nachbarschaft++;
384
    }
385
386
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 2) )
387
    {
388
      Nachbarschaft++;
389
    }
390
391
    /*
392
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
393
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
394
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
395
     * verfälschten sie die Werte für die weitere Überprüfung.
396
     */
397
    if ( (Nachbarschaft <= *(RegelPt + LuG)) )
398
    {
399
      *( SpielfeldschattenPt + (Spielfeldgroesse_x-1) ) = TOT;
400
    }
401
    else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
402
      {
403
        *( SpielfeldschattenPt + (Spielfeldgroesse_x-1) ) = TOT;
404
      }
405
      else
406
        {
407
          *( SpielfeldschattenPt + (Spielfeldgroesse_x-1) ) = LEBENDIG;
408
        }
409
    Nachbarschaft = 0;
410
411
  }
412
  else  //Falls die Zelle tot ist:
413
    {
414
    if( *( SpielfeldPt) )              //prüfen ob die Zelle(0,0) "rechts" daneben lebt
415
    {
416
      Nachbarschaft++;
417
    }
418
419
    if( *(SpielfeldPt + Spielfeldgroesse_x) )     //prüfen ob die Zelle(0,1) darunter "rechts" lebt (SpielfeldPt + Spielfeldgroesse_x) ist die erste Zelle der 2ten Reihe
420
    {
421
      Nachbarschaft++;
422
    }
423
424
    if( *(SpielfeldPt + Spielfeldgroesse_x - 2) )     //prüfen ob die Zelle links daneben lebt. (SpielfeldPt + Spielfeldgroesse_x - 2) ist die vorletzte Zelle der 1ten Reihe
425
    {
426
      Nachbarschaft++;
427
    }
428
429
    if(  *(SpielfeldPt + ((Spielfeldgroesse_x*2) - 1) )   )
430
    {
431
      Nachbarschaft++;
432
    }
433
434
    if( *(SpielfeldPt + ((Spielfeldgroesse_x*2) - 2) )   )
435
    {
436
      Nachbarschaft++;
437
    }
438
439
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1))) )
440
    {
441
      Nachbarschaft++;
442
    }
443
444
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 1) )
445
    {
446
      Nachbarschaft++;
447
    }
448
449
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y)) - 2) )
450
    {
451
      Nachbarschaft++;
452
    }
453
454
    /*
455
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
456
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
457
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
458
     * verfälschten sie die Werte für die weitere Überprüfung.
459
     */
460
    if ( (Nachbarschaft == *(RegelPt + TwL)) )
461
    {
462
      *( SpielfeldschattenPt + (Spielfeldgroesse_x-1) ) = LEBENDIG;
463
    }
464
    else
465
      {
466
      *( SpielfeldschattenPt + (Spielfeldgroesse_x-1) ) = TOT;
467
      }
468
    Nachbarschaft = 0;
469
  }
470
}
471
472
void LinksUntenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
473
{
474
  uint8_t Nachbarschaft = 0;
475
476
  if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1))) )
477
  {
478
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) + 1 ) )
479
    {
480
      Nachbarschaft++;
481
    }
482
483
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) ) + 1 ) )
484
    {
485
      Nachbarschaft++;
486
    }
487
488
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) )  ) )
489
    {
490
      Nachbarschaft++;
491
    }
492
493
    if(  *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) -1 )   )
494
    {
495
      Nachbarschaft++;
496
    }
497
498
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y) ) - 1 )   )
499
    {
500
      Nachbarschaft++;
501
    }
502
503
    if( *SpielfeldPt )
504
    {
505
      Nachbarschaft++;
506
    }
507
508
    if( *(SpielfeldPt + 1) )
509
    {
510
      Nachbarschaft++;
511
    }
512
513
    if( *(SpielfeldPt + (Spielfeldgroesse_x - 1)) )
514
    {
515
      Nachbarschaft++;
516
    }
517
518
    /*
519
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
520
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
521
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
522
     * verfälschten sie die Werte für die weitere Überprüfung.
523
     */
524
    if ( (Nachbarschaft <= *(RegelPt + LuG)) )
525
    {
526
      *(SpielfeldschattenPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
527
    }
528
    else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
529
      {
530
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
531
      }
532
      else
533
        {
534
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = LEBENDIG;
535
        }
536
    Nachbarschaft = 0;
537
538
  }
539
  else
540
  {//Falls die Zelle tot ist:
541
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) + 1 ) )
542
    {
543
      Nachbarschaft++;
544
    }
545
546
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) ) + 1 ) )
547
    {
548
      Nachbarschaft++;
549
    }
550
551
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) )  ) )
552
    {
553
      Nachbarschaft++;
554
    }
555
556
    if(  *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) -1 )   )
557
    {
558
      Nachbarschaft++;
559
    }
560
561
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y) ) - 1 )   )
562
    {
563
      Nachbarschaft++;
564
    }
565
566
    if( *SpielfeldPt )
567
    {
568
      Nachbarschaft++;
569
    }
570
571
    if( *(SpielfeldPt + 1) )
572
    {
573
      Nachbarschaft++;
574
    }
575
576
    if( *(SpielfeldPt + (Spielfeldgroesse_x - 1)) )
577
    {
578
      Nachbarschaft++;
579
    }
580
581
    /*
582
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
583
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
584
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
585
     * verfälschten sie die Werte für die weitere Überprüfung.
586
     */
587
    if ( (Nachbarschaft == *(RegelPt + TwL)) )
588
    {
589
      *(SpielfeldschattenPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = LEBENDIG;
590
    }
591
    else
592
      {
593
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
594
      }
595
    Nachbarschaft = 0;
596
  }
597
}
598
599
void RechtsUntenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
600
{
601
  uint8_t Nachbarschaft = 0;
602
603
  if( *(SpielfeldPt + (Spielfeldgroesse_x * Spielfeldgroesse_y)-1) )
604
  {
605
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) - 1 ) )
606
    {
607
      Nachbarschaft++;
608
    }
609
610
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) - 2 ) )
611
    {
612
      Nachbarschaft++;
613
    }
614
615
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y) ) - 2 ) )
616
    {
617
      Nachbarschaft++;
618
    }
619
620
    if(  *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) )  )   )
621
    {
622
      Nachbarschaft++;
623
    }
624
625
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) )  )   )
626
    {
627
      Nachbarschaft++;
628
    }
629
630
    if( *(SpielfeldPt + Spielfeldgroesse_x - 1) )
631
    {
632
      Nachbarschaft++;
633
    }
634
635
    if( *(SpielfeldPt + Spielfeldgroesse_x -2) )
636
    {
637
      Nachbarschaft++;
638
    }
639
640
    if( *SpielfeldPt )
641
    {
642
      Nachbarschaft++;
643
    }
644
645
    /*
646
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
647
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
648
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
649
     * verfälschten sie die Werte für die weitere Überprüfung.
650
     */
651
    if ( (Nachbarschaft <= *(RegelPt + LuG)) )
652
    {
653
      *(SpielfeldschattenPt + (Spielfeldgroesse_x*Spielfeldgroesse_y) -1) = TOT;
654
    }
655
    else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
656
      {
657
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*Spielfeldgroesse_y) -1) = TOT;
658
      }
659
      else
660
        {
661
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*Spielfeldgroesse_y) -1) = LEBENDIG;
662
        }
663
    Nachbarschaft = 0;
664
665
  }
666
  else  //Falls die Zelle tot ist:
667
  {
668
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) - 1 ) )
669
    {
670
      Nachbarschaft++;
671
    }
672
673
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) ) - 2 ) )
674
    {
675
      Nachbarschaft++;
676
    }
677
678
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y) ) - 2 ) )
679
    {
680
      Nachbarschaft++;
681
    }
682
683
    if(  *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 1) )  )   )
684
    {
685
      Nachbarschaft++;
686
    }
687
688
    if( *( SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y - 2) )  )   )
689
    {
690
      Nachbarschaft++;
691
    }
692
693
    if( *(SpielfeldPt + Spielfeldgroesse_x - 1) )
694
    {
695
      Nachbarschaft++;
696
    }
697
698
    if( *(SpielfeldPt + Spielfeldgroesse_x -2) )
699
    {
700
      Nachbarschaft++;
701
    }
702
703
    if( *SpielfeldPt )
704
    {
705
      Nachbarschaft++;
706
    }
707
708
    /*
709
     * Nach Überprüfung der Anzahl an lebendigen Nachbarn, wird die Zelle in Abhängikeit der Regeln als TOT oder LEBENDIG
710
     * auf dem Schattenspielfeld abgelegt. Das Schattenspielfeld dient dazu, die neuen Leben/Tot Verhältnisse bis zur
711
     * vollständigen Überprüfung des Spielfeldes aufbewahrt. Läge man die Werte direkt auf dem Spielfeld ab,
712
     * verfälschten sie die Werte für die weitere Überprüfung.
713
     */
714
    if ( (Nachbarschaft == *(RegelPt + TwL)) )
715
    {
716
      *(SpielfeldschattenPt + (Spielfeldgroesse_x*Spielfeldgroesse_y) -1) = LEBENDIG;
717
    }
718
    else
719
      {
720
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*Spielfeldgroesse_y) -1) = TOT;
721
      }
722
    Nachbarschaft = 0;
723
  }
724
}
725
726
void RandObenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
727
{
728
  uint8_t Nachbarschaft = 0;
729
  uint8_t X = 1;
730
731
  while( X < (Spielfeldgroesse_x - 1) )
732
  {
733
    if( *(SpielfeldPt + X) )
734
    {
735
      if( *(SpielfeldPt + (X-1)) )
736
      {
737
        Nachbarschaft++;
738
      }
739
740
      if( *(SpielfeldPt + (X+1)) )
741
      {
742
        Nachbarschaft++;
743
      }
744
745
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X - 1)) )
746
      {
747
        Nachbarschaft++;
748
      }
749
750
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X)) )
751
      {
752
        Nachbarschaft++;
753
      }
754
755
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X + 1)) )
756
      {
757
        Nachbarschaft++;
758
      }
759
760
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X-1)) )
761
      {
762
        Nachbarschaft++;
763
      }
764
765
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X)) )
766
      {
767
        Nachbarschaft++;
768
      }
769
770
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X+1)) )
771
      {
772
        Nachbarschaft++;
773
      }
774
775
      if ( (Nachbarschaft <= *(RegelPt + LuG)) )
776
      {
777
        *(SpielfeldschattenPt + X) = TOT;
778
      }
779
      else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
780
        {
781
          *(SpielfeldschattenPt + X) = TOT;
782
        }
783
        else
784
          {
785
            *(SpielfeldschattenPt + X) = LEBENDIG;
786
          }
787
      Nachbarschaft = 0;
788
    }
789
    else
790
    {
791
      if( *(SpielfeldPt + (X-1)) )
792
      {
793
        Nachbarschaft++;
794
      }
795
796
      if( *(SpielfeldPt + (X+1)) )
797
      {
798
        Nachbarschaft++;
799
      }
800
801
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X - 1)) )
802
      {
803
        Nachbarschaft++;
804
      }
805
806
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X)) )
807
      {
808
        Nachbarschaft++;
809
      }
810
811
      if( *(SpielfeldPt + (Spielfeldgroesse_x + X + 1)) )
812
      {
813
        Nachbarschaft++;
814
      }
815
816
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X-1)) )
817
      {
818
        Nachbarschaft++;
819
      }
820
821
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X)) )
822
      {
823
        Nachbarschaft++;
824
      }
825
826
      if( *(SpielfeldPt + ((Spielfeldgroesse_x *(Spielfeldgroesse_y-1)) + X+1)) )
827
      {
828
        Nachbarschaft++;
829
      }
830
831
      if ( (Nachbarschaft == *(RegelPt + TwL)) )
832
          {
833
            *(SpielfeldschattenPt + X) = LEBENDIG;
834
          }
835
          else
836
            {
837
              *(SpielfeldschattenPt + X) = TOT;
838
            }
839
          Nachbarschaft = 0;
840
    }
841
    X++;
842
  }
843
}
844
845
void RandUntenCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
846
{
847
  uint8_t Nachbarschaft = 0;
848
  uint8_t X = 1;
849
850
  while( X < (Spielfeldgroesse_x - 1) )
851
  {
852
    if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-1)) + X) )
853
    {
854
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-1)) + (X-1)) )
855
      {
856
        Nachbarschaft++;
857
      }
858
859
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-1)) + (X+1)) )
860
      {
861
        Nachbarschaft++;
862
      }
863
864
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + (X-1)) )
865
      {
866
        Nachbarschaft++;
867
      }
868
869
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + X) )
870
      {
871
        Nachbarschaft++;
872
      }
873
874
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + (X+1)) )
875
      {
876
        Nachbarschaft++;
877
      }
878
879
      if( *(SpielfeldPt + X-1) )
880
      {
881
        Nachbarschaft++;
882
      }
883
884
      if( *(SpielfeldPt + X) )
885
      {
886
        Nachbarschaft++;
887
      }
888
889
      if( *(SpielfeldPt + X+1) )
890
      {
891
        Nachbarschaft++;
892
      }
893
894
      if ( (Nachbarschaft <= *(RegelPt + LuG)) )
895
      {
896
        *(SpielfeldschattenPt + X + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
897
      }
898
      else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
899
        {
900
          *(SpielfeldschattenPt + X + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
901
        }
902
        else
903
          {
904
            *(SpielfeldschattenPt + X + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = LEBENDIG;
905
          }
906
      Nachbarschaft = 0;
907
    }
908
    else
909
    {
910
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-1)) + (X-1)) )
911
      {
912
        Nachbarschaft++;
913
      }
914
915
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-1)) + (X+1)) )
916
      {
917
        Nachbarschaft++;
918
      }
919
920
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + (X-1)) )
921
      {
922
        Nachbarschaft++;
923
      }
924
925
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + X) )
926
      {
927
        Nachbarschaft++;
928
      }
929
930
      if( *(SpielfeldPt + (Spielfeldgroesse_x * (Spielfeldgroesse_y-2)) + (X+1)) )
931
      {
932
        Nachbarschaft++;
933
      }
934
935
      if( *(SpielfeldPt + X-1) )
936
      {
937
        Nachbarschaft++;
938
      }
939
940
      if( *(SpielfeldPt + X) )
941
      {
942
        Nachbarschaft++;
943
      }
944
945
      if( *(SpielfeldPt + X+1) )
946
      {
947
        Nachbarschaft++;
948
      }
949
950
      if ( (Nachbarschaft == *(RegelPt + TwL)) )
951
          {
952
            *(SpielfeldschattenPt + X + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = LEBENDIG;
953
          }
954
          else
955
            {
956
              *(SpielfeldschattenPt + X + (Spielfeldgroesse_x*(Spielfeldgroesse_y-1)) ) = TOT;
957
            }
958
          Nachbarschaft = 0;
959
    }
960
    X++;
961
  }
962
}
963
964
void RandLinksCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
965
{
966
  uint8_t Nachbarschaft = 0;
967
  uint8_t Y = 1;
968
969
  while( Y < (Spielfeldgroesse_y-1) )
970
  {
971
    if( *(SpielfeldPt + (Spielfeldgroesse_x*Y)) )
972
    {
973
      if(  *( SpielfeldPt + (Spielfeldgroesse_x*Y) -1 )  )
974
      {
975
        Nachbarschaft++;
976
      }
977
978
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) ) )
979
      {
980
        Nachbarschaft++;
981
      }
982
983
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) +1 ) )
984
      {
985
        Nachbarschaft++;
986
      }
987
988
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -1 ) )
989
      {
990
        Nachbarschaft++;
991
      }
992
993
      if( *( SpielfeldPt + (Spielfeldgroesse_x*Y) +1 ) )
994
      {
995
        Nachbarschaft++;
996
      }
997
998
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -1 ) )
999
      {
1000
        Nachbarschaft++;
1001
      }
1002
1003
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) ) )
1004
      {
1005
        Nachbarschaft++;
1006
      }
1007
1008
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1))+1 ) )
1009
      {
1010
        Nachbarschaft++;
1011
      }
1012
1013
      if ( (Nachbarschaft <= *(RegelPt + LuG)) )
1014
      {
1015
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) ) = TOT;
1016
      }
1017
      else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
1018
        {
1019
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) ) = TOT;
1020
        }
1021
        else
1022
          {
1023
            *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) ) = LEBENDIG;
1024
          }
1025
      Nachbarschaft = 0;
1026
    }
1027
    else
1028
      {
1029
      if(  *( SpielfeldPt + (Spielfeldgroesse_x*Y) -1 )  )
1030
      {
1031
        Nachbarschaft++;
1032
      }
1033
1034
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) ) )
1035
      {
1036
        Nachbarschaft++;
1037
      }
1038
1039
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) +1 ) )
1040
      {
1041
        Nachbarschaft++;
1042
      }
1043
1044
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -1 ) )
1045
      {
1046
        Nachbarschaft++;
1047
      }
1048
1049
      if( *( SpielfeldPt + (Spielfeldgroesse_x*Y) +1 ) )
1050
      {
1051
        Nachbarschaft++;
1052
      }
1053
1054
      if( *( SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -1 ) )
1055
      {
1056
        Nachbarschaft++;
1057
      }
1058
1059
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) ) )
1060
      {
1061
        Nachbarschaft++;
1062
      }
1063
1064
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) +1 ) )
1065
      {
1066
        Nachbarschaft++;
1067
      }
1068
1069
        if ( (Nachbarschaft == *(RegelPt + TwL)) )
1070
            {
1071
              *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) ) = LEBENDIG;
1072
            }
1073
            else
1074
              {
1075
                *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) ) = TOT;
1076
              }
1077
            Nachbarschaft = 0;
1078
      }
1079
    Y++;
1080
  }
1081
}
1082
1083
void RandRechtsCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
1084
{
1085
  uint8_t Nachbarschaft = 0;
1086
  uint8_t Y = 1;
1087
1088
  while( Y < (Spielfeldgroesse_y-1) )
1089
  {
1090
    if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) - 1) )
1091
    {
1092
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) -2 ) )
1093
      {
1094
        Nachbarschaft++;
1095
      }
1096
1097
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) -1 ) )
1098
      {
1099
        Nachbarschaft++;
1100
      }
1101
1102
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) ) )
1103
      {
1104
        Nachbarschaft++;
1105
      }
1106
1107
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) -2  ) )
1108
      {
1109
        Nachbarschaft++;
1110
      }
1111
1112
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) ) )
1113
      {
1114
        Nachbarschaft++;
1115
      }
1116
1117
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -2 ) )
1118
      {
1119
        Nachbarschaft++;
1120
      }
1121
1122
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+2))-1 ) )
1123
      {
1124
        Nachbarschaft++;
1125
      }
1126
1127
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) ) )
1128
      {
1129
        Nachbarschaft++;
1130
      }
1131
1132
      if ( (Nachbarschaft <= *(RegelPt + LuG)) )
1133
      {
1134
        *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y)-1 ) = TOT;
1135
      }
1136
      else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
1137
        {
1138
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y)-1 ) = TOT;
1139
        }
1140
        else
1141
          {
1142
            *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y)-1 ) = LEBENDIG;
1143
          }
1144
      Nachbarschaft = 0;
1145
    }
1146
    else
1147
      {
1148
1149
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) -2 ) )
1150
      {
1151
        Nachbarschaft++;
1152
      }
1153
1154
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) -1 ) )
1155
      {
1156
        Nachbarschaft++;
1157
      }
1158
1159
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y-1)) ) )
1160
      {
1161
        Nachbarschaft++;
1162
      }
1163
1164
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) -2  ) )
1165
      {
1166
        Nachbarschaft++;
1167
      }
1168
1169
      if( *(SpielfeldPt + (Spielfeldgroesse_x*Y) ) )
1170
      {
1171
        Nachbarschaft++;
1172
      }
1173
1174
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+2)) -2 ) )
1175
      {
1176
        Nachbarschaft++;
1177
      }
1178
1179
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+2))-1 ) )
1180
      {
1181
        Nachbarschaft++;
1182
      }
1183
1184
      if( *(SpielfeldPt + (Spielfeldgroesse_x*(Y+1)) ) )
1185
      {
1186
        Nachbarschaft++;
1187
      }
1188
1189
      if ( (Nachbarschaft == *(RegelPt + TwL)) )
1190
          {
1191
            *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y)-1 ) = LEBENDIG;
1192
          }
1193
          else
1194
            {
1195
              *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y)-1 ) = TOT;
1196
            }
1197
          Nachbarschaft = 0;
1198
      }
1199
    Y++;
1200
  }
1201
}
1202
1203
void FeldCheck(uint8_t *RegelPt, uint8_t *SpielfeldPt, uint8_t *SpielfeldschattenPt, uint16_t Spielfeldgroesse_x, uint16_t Spielfeldgroesse_y)
1204
{
1205
  uint8_t Nachbarschaft = 0;
1206
  uint8_t X = 1;
1207
  uint8_t Y = 1;
1208
1209
  while( Y < (Spielfeldgroesse_y - 1) )
1210
  {
1211
    while( X < (Spielfeldgroesse_x - 1) )
1212
    {
1213
      if( *(SpielfeldPt + (Spielfeldgroesse_x * Y) + (X) ) )
1214
      {
1215
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X-1) ) )
1216
        {
1217
          Nachbarschaft++;
1218
        }
1219
1220
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X) ) )
1221
        {
1222
          Nachbarschaft++;
1223
        }
1224
1225
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X+1) ) )
1226
        {
1227
          Nachbarschaft++;
1228
        }
1229
1230
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y)) + (X-1) ) )
1231
        {
1232
          Nachbarschaft++;
1233
        }
1234
1235
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y)) + (X+1) ) )
1236
        {
1237
          Nachbarschaft++;
1238
        }
1239
1240
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X-1) ) )
1241
        {
1242
          Nachbarschaft++;
1243
        }
1244
1245
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X) ) )
1246
        {
1247
          Nachbarschaft++;
1248
        }
1249
1250
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X+1) ) )
1251
        {
1252
          Nachbarschaft++;
1253
        }
1254
1255
        if ( (Nachbarschaft <= *(RegelPt + LuG)) )
1256
        {
1257
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) + X ) = TOT;
1258
        }
1259
        else if ( (Nachbarschaft >= *(RegelPt + LoG)) )
1260
          {
1261
            *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) + X ) = TOT;
1262
          }
1263
          else
1264
            {
1265
              *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) + X ) = LEBENDIG;
1266
            }
1267
        Nachbarschaft = 0;
1268
      }
1269
      else
1270
      {
1271
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X-1) ) )
1272
        {
1273
          Nachbarschaft++;
1274
        }
1275
1276
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X) ) )
1277
        {
1278
          Nachbarschaft++;
1279
        }
1280
1281
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y-1)) + (X+1) ) )
1282
        {
1283
          Nachbarschaft++;
1284
        }
1285
1286
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y)) + (X-1) ) )
1287
        {
1288
          Nachbarschaft++;
1289
        }
1290
1291
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y)) + (X+1) ) )
1292
        {
1293
          Nachbarschaft++;
1294
        }
1295
1296
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X-1) ) )
1297
        {
1298
          Nachbarschaft++;
1299
        }
1300
1301
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X) ) )
1302
        {
1303
          Nachbarschaft++;
1304
        }
1305
1306
        if( *(SpielfeldPt + (Spielfeldgroesse_x * (Y+1)) + (X+1) ) )
1307
        {
1308
          Nachbarschaft++;
1309
        }
1310
1311
        if ( (Nachbarschaft == *(RegelPt + TwL)) )
1312
        {
1313
          *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) + X ) = LEBENDIG;
1314
        }
1315
        else
1316
          {
1317
            *(SpielfeldschattenPt + (Spielfeldgroesse_x*Y) + X ) = TOT;
1318
          }
1319
        Nachbarschaft = 0;
1320
      }
1321
1322
      X++;
1323
    }
1324
    X = 0;
1325
    Y++;
1326
  }
1327
}