gol

Implementation of Conway's Game of Life writen in C
git clone git://git.dimitrijedobrota.com/gol.git
Log | Files | Refs | README |

commit7681e2df2437464549b9e6144beb5d7bd837671b
parent739c0e98a63921da464696df7903e0ef55ceb5b6
authorMateja Marsenic <matejamarsenic@gmail.com>
dateMon, 23 May 2022 11:58:13 +0200

Refactoring Code for connection with main

Diffstat:
Ainclude/logic.h|++++++++++++++
Msrc/logic.c|+++++++++++++++++++++++++++++++++++-----------------------------------------------

2 files changed, 75 insertions(+), 81 deletions(-)


diff --git a/include/logic.h b/include/logic.h

@@ -0,0 +1,14 @@

#ifndef LOGIC_H
#define LOGIC_H
#define cell unsigned char
extern cell **mat;
extern char **evolution_names[];
int logic_init(int w, int h);
int evolution_init(int index);
void do_evolution(int steps);
int logic_free(void);
#endif
\ No newline at end of file

diff --git a/src/logic.c b/src/logic.c

@@ -1,22 +1,24 @@

#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b) ((a > b) ? a : b)
#define MIN(a, b) ((a < b) ? a : b)
#include "logic.h"
#include "utils.h"
#define t mat[i][j]
#define u_char unsigned char
// GLOBALS
cell **mat;
char **evolution_names[] = {"Normal", "CoExsistance", "Predator", "Virus",
"Unknown"};
u_char **mat;
int h, w;
u_char mod;
static void (*evolution_modes[])() = {
evolveNormal, evolveCoExist, evolvePredator, evolveVirus, evolveUnknown};
static void (*evolve)(void);
static int height, width;
static int mod;
void addToECells(int a, int b) {
mod = (mat[a][b] & 3);
mod <<= mod << 1;
for (int i = MAX(a - 1, 0); i <= MIN(a + 1, h); i++)
for (int j = MAX(b - 1, 0); j <= MIN(b + 1, w + 1); j++)
for (int i = MAX(a - 1, 0); i <= MIN(a + 1, height); i++)
for (int j = MAX(b - 1, 0); j <= MIN(b + 1, width + 1); j++)
if (i != a || j != b)
mat[i][j] += mod;
}

@@ -28,42 +30,43 @@ void addToCells(int i, int j) {

if (k != i || l != j)
mat[k][l] += mod;
}
void doAdditions(void) {
for (int j = 1; j <= w; j++) {
mat[0][j] = mat[h][j];
mat[h + 1][j] = mat[1][j];
for (int j = 1; j <= width; j++) {
mat[0][j] = mat[height][j];
mat[height + 1][j] = mat[1][j];
addToECells(0, j);
addToECells(h + 1, j);
addToECells(height + 1, j);
}
for (int i = 1; i < h; i++) {
mat[i][0] = mat[i][w];
mat[i][w + 1] = mat[i][1];
for (int i = 1; i < height; i++) {
mat[i][0] = mat[i][width];
mat[i][width + 1] = mat[i][1];
addToECells(i, 0);
addToECells(i, w + 1);
addToECells(i, width + 1);
}
mat[0][0] = mat[h][w];
mat[0][w + 1] = mat[h][1];
mat[h + 1][0] = mat[1][w];
mat[h + 1][w + 1] = mat[1][1];
mat[0][0] = mat[height][width];
mat[0][width + 1] = mat[height][1];
mat[height + 1][0] = mat[1][width];
mat[height + 1][width + 1] = mat[1][1];
addToECells(0, 0);
addToECells(0, w + 1);
addToECells(h + 1, 0);
addToECells(h + 1, w + 1);
addToECells(0, width + 1);
addToECells(height + 1, 0);
addToECells(height + 1, width + 1);
/* Normal AddToCells */
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++)
for (int i = 1; i <= height; i++)
for (int j = 1; j <= width; j++)
addToCells(i, j);
}
void evolveNormal(void) {
doAdditions();
/* Rules */
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++)
for (int i = 1; i <= height; i++)
for (int j = 1; j <= width; j++)
switch (mat[i][j]) {
case 9:
case 12:

@@ -76,10 +79,10 @@ void evolveNormal(void) {

}
void evolveCoExist(void) {
unsigned char s1, s2;
int s1, s2;
doAdditions();
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++) {
s2 = mat[i][j] >> 5;
s1 = (mat[i][j] & 31) >> 2;
if ((mat[i][j] & 3) == 0) {

@@ -101,10 +104,10 @@ void evolveCoExist(void) {

}
void evolvePredator(void) {
unsigned char s1, s2;
int s1, s2;
doAdditions();
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++) {
s2 = mat[i][j] >> 5;
s1 = (mat[i][j] & 31) >> 2;
mod = mat[i][j] & 3;

@@ -132,10 +135,10 @@ void evolvePredator(void) {

}
void evolveVirus(void) {
unsigned char s1, s2;
int s1, s2;
doAdditions();
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++) {
s2 = mat[i][j] >> 5;
s1 = (mat[i][j] & 31) >> 2;
mod = mat[i][j] & 3;

@@ -164,10 +167,10 @@ void evolveVirus(void) {

void evolveUnknown(void) { // Assumption 3 ones and 3 twos result in 50/50
// chanse of 0 becoming one of them:
unsigned char s1, s2;
int s1, s2;
doAdditions();
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++) {
s2 = mat[i][j] >> 5;
s1 = (mat[i][j] & 31) >> 2;
mod = mat[i][j] & 3;

@@ -205,54 +208,31 @@ void evolveUnknown(void) { // Assumption 3 ones and 3 twos result in 50/50

}
}
void do_evolution(int steps, void (*evolution)(void)) {
void do_evolution(int steps) {
while (steps--) {
evolution();
print_matrix();
usleep(500000);
evolve();
}
}
void print_matrix(void) {
printf("\n");
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
printf("%d ", mat[i][j] & 3);
}
printf("\n");
}
}
int evolve_main(void) {
int mode;
srand(time(NULL));
/* printf("Enter Size (W H): ");
scanf("%d %d", &h, &w);
mat = malloc((h + 2) * sizeof(u_char *));
for (int i = 0; i <= h + 1; i++)
mat[i] = calloc((w + 2), sizeof(u_char));
int logic_init(int w, int h) {
width = w;
height = h;
printf("Enter Matrix:\n");
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++) {
scanf("%d", &mat[i][j]);
}
*/
int steps = 3;
void (*evolution_modes[])() = {evolveNormal, evolveCoExist, evolvePredator,
evolveVirus, evolveUnknown};
mat = malloc((h + 2) * sizeof(cell *));
for (int i = 0; i <= h + 1; i++)
mat[i] = calloc((w + 2), sizeof(cell));
/* print_matrix();
printf("\nEnter Mode: ");
scanf("%d", &mode); */
return 1;
}
do_evolution(steps, evolution_modes[mode]);
int evolution_init(int index) {
evolve = evolution_modes[index];
return 1;
}
for (int i = 0; i <= h + 1; i++)
int logic_free(void) {
for (int i = 0; i <= height + 1; i++)
free(mat[i]);
free(mat);
return 0;
return 1;
}
\ No newline at end of file