]> git.friedersdorff.com Git - max/gol.git/blob - gol.c
ebdbba0cb680f24a1e2cbf9628b3a54a2edee443
[max/gol.git] / gol.c
1 #include <SDL2/SDL.h>
2 #include <stdio.h>
3 #include "array.h"
4 #include "tick.h"
5
6 void quit(int e_st)
7 {
8         SDL_Quit();
9         exit(e_st);
10 }
11
12 void simulate(struct gol_board *state, SDL_Surface *screen, SDL_Window *window);
13
14 int redraw_screen(struct gol_board *state, SDL_Surface *screen, int ppc,
15         int origin_x, int origin_y);
16
17 int main(int argc, char* args[])
18 {
19         struct gol_board state = {
20                 .live_cells = NULL,
21                 .n = 0,
22                 .size = 0,
23                 .max_x = 0,
24                 .min_x = 0,
25                 .max_y = 0,
26                 .min_y = 0
27         };
28         SDL_Window *window = NULL;
29         SDL_Surface *screen = NULL;
30
31         char finished = 0;
32         char redraw = 1;
33
34         // The coordinates of the cell to draw in the bottom left corner of the
35         // canvas
36         int origin_x = 0;
37         int origin_y = 0;
38
39         int ppc = 10;
40
41         SDL_Event e;
42
43         //state.live_cells = malloc(10 * sizeof(typeof(*state.live_cells)));
44         //if (!state.live_cells) {
45         //      return 1;
46         //}
47         
48         if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
49                 quit(1);
50         }
51
52         window = SDL_CreateWindow("SDL Tutorial",
53                                   SDL_WINDOWPOS_UNDEFINED,
54                                   SDL_WINDOWPOS_UNDEFINED,
55                                   640,
56                                   320,
57                                   SDL_WINDOW_SHOWN);
58         if (!window) {
59                 quit(1);
60         }
61
62         screen = SDL_GetWindowSurface(window);
63         if (!screen) {
64                 quit(1);
65         }
66         SDL_UpdateWindowSurface(window);
67
68         while (!finished) {
69                 while (SDL_PollEvent(&e) != 0) {
70                         if (e.type == SDL_QUIT) {
71                                 finished = 1;
72                         } else if (e.type == SDL_KEYDOWN) {
73                                 switch (e.key.keysym.sym) {
74                                 case SDLK_q:
75                                 case SDLK_x:
76                                         finished = 1;
77                                         break;
78                                 case SDLK_PLUS:
79                                 case SDLK_EQUALS:
80                                         ppc *= 1.2;
81                                         redraw = 1;
82                                         break;
83                                 case SDLK_MINUS:
84                                 case SDLK_UNDERSCORE:
85                                         ppc /= 1.2;
86                                         redraw = 1;
87                                         break;
88                                 default:
89                                         break;
90                                 }
91                         }
92                 }
93                 if (redraw) {
94                         redraw_screen(&state, screen, ppc, origin_x, origin_y);
95                 }
96         }
97
98         // Main loop
99         // simulate(&state, screen, window);
100         
101
102         SDL_DestroyWindow(window);
103         quit(0);
104 }
105
106
107 void simulate(struct gol_board *state, SDL_Surface *screen, SDL_Window *window)
108 {
109         SDL_Rect cell;
110         double ppc_x;
111         double ppc_y;
112         for (unsigned int i = 0; i < 1000; ++i) {
113                 printf("Generation %d\n", i);
114                 ppc_x = SCREEN_WIDTH/(state->max_x - state->min_x);
115                 ppc_y = SCREEN_HEIGHT/(state->max_y - state->min_y);
116                 for (unsigned int j = 0; j < state->n; j += 2) {
117                         printf("(%d, %d)\n", state->live_cells[j],
118                                 state->live_cells[j + 1]);
119                         
120                 }
121                 printf("\n");
122                 if (!gol_tick(state)) {
123                         return;
124                 }
125                 SDL_UpdateWindowSurface(window);
126         }
127 }
128
129 int redraw_screen(struct gol_board *state, SDL_Surface *screen,
130         int ppc, int origin_x, int origin_y)
131 {
132         SDL_Rect rect;
133         int i, j;
134
135         SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF));
136         for (i = origin_x; i < (screen->w/ppc) + origin_x; ++i) {
137                 for (j = origin_y; j < (screen->h/ppc) + origin_y; ++j) {
138                         if (gol_is_live(state, i, j)) {
139                                 rect = (SDL_Rect) {
140                                         ((i - origin_x) * ppc),
141                                         ((j - origin_y) * ppc),
142                                         ppc,
143                                         ppc
144                                 };
145                                 SDL_FillRect(screen, &rect,
146                                         SDL_MapRGB(screen->format, 0, 0, 0));
147                         }
148                 }
149         }
150 }