Files
game-of-life/main.c
2026-02-05 01:04:52 -06:00

178 lines
4.4 KiB
C
Executable File

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
int startw=1900;
int starth=1100;
void iterate_game(int **grid, int** nextgrid, int cols, int rows){
for (int i=0; i<cols; i++){
for(int j=0;j<rows; j++){
int state=grid[i][j];
int sum=0;
for (int k=-1; k<2; k++){
for (int l=-1; l<2; l++){
int col = (i + k + cols) % cols;
int row = (j + l + rows) % rows;
sum = sum + grid[col][row];
}
}
sum -= grid[i][j];
if(state==0&sum==3){
nextgrid[i][j]=1;
} else if((state==1) & (sum<2 | sum>3)){
nextgrid[i][j]=0;
} else {
nextgrid[i][j]=state;
}
}
}
for (int i=0; i<cols; i++){
for(int j=0;j<rows; j++){
grid[i][j]=nextgrid[i][j];
}
}
}
void draw(SDL_Renderer* renderer,SDL_Window* window,int cols, int rows, float mX, float mY, int boxsize, int **grid, int **nextgrid, int width, int height, SDL_Rect *box_rect){
SDL_SetRenderDrawColor(renderer,0,0,0,255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer,150,50,255,255);
for (int i=0; i<cols; i++){
for(int j=0;j<rows; j++){
if(grid[i][j]==1){
box_rect->x=i*boxsize;
box_rect->y=j*boxsize;
SDL_RenderFillRect(renderer,box_rect);
}
}
}
iterate_game(grid,nextgrid,cols,rows);
SDL_RenderPresent(renderer);
SDL_UpdateWindowSurface(window);
}
void mousePressed(int **grid,int x,int y,int size,int cols, int rows, double hue){
}
int main(int argc, char *argv[])
{
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
SDL_Log("SDL fails to initialize! %s\n", SDL_GetError());
SDL_Window *window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, startw, starth, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
if (!window) {
printf("Failed to create window: %s\n", SDL_GetError());
}
SDL_Renderer *renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_SOFTWARE);
if (!renderer) {
printf("Failed to create renderer: %s\n", SDL_GetError());
}
int w, h;
SDL_GetWindowSize(window, &w, &h);
printf("Window dimensions: %dx%d\n", w, h);
int boxsize=8;
int cols=w/boxsize;
int rows=h/boxsize;
SDL_Log("cols %d rows %d\n\n\n\n",cols,rows);
int **grid = (int **)malloc(cols * sizeof(int *));
for (int i=0; i<cols; i++){
grid[i]=(int *)malloc(rows * sizeof(int *));
}
int **nextgrid = (int **)malloc(cols * sizeof(int *));
for (int i=0; i<cols; i++){
nextgrid[i]=(int *)malloc(rows * sizeof(int *));
}
srand(time(NULL));
for (int i=0; i<cols; i++){
for(int j=0;j<rows; j++){
grid[i][j]=rand()%2;
nextgrid[i][j]=rand()%2;
}
}
SDL_Rect box_rect;
box_rect.w = box_rect.h = boxsize-1;
draw(renderer,window,cols,rows,0,0,boxsize,grid,nextgrid,w,h,&box_rect);
bool quit = false;
SDL_Event e;
bool mousedown=false;
int gmouseX=0;
int gmouseY=0;
bool ctrl=false;
while (!quit) {
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
quit = true;
}
else if(e.type == SDL_MOUSEBUTTONDOWN){
if(e.button.button==SDL_BUTTON_LEFT){
mousedown=true;
} else if(e.button.button==SDL_BUTTON_RIGHT){
}
} else if(e.type==SDL_MOUSEBUTTONUP){
mousedown=false;
}
//SDL_Log("%d\n",e.key.keysym.sym);
if(e.type==SDL_KEYDOWN&e.key.keysym.sym==1073742048){
ctrl=true;
}else if(e.type==SDL_KEYUP&e.key.keysym.sym==1073742048){
ctrl=false;
}else if(e.type==SDL_KEYDOWN&e.key.keysym.sym==114&ctrl==true){
srand(time(NULL));
for (int i=0; i<cols; i++){
for(int j=0;j<rows; j++){
grid[i][j]=rand()%2;
}
}
}
gmouseX=e.button.x;
gmouseY=e.button.y;
}
float mouseoutX=gmouseX;
float mouseoutY=gmouseY;
draw(renderer,window,cols,rows,mouseoutX,mouseoutY,boxsize,grid,nextgrid,w,h,&box_rect);
//SDL_Delay(10);
}
SDL_DestroyWindow(window);
//free window and windowSurface
SDL_Quit();
for (int i=0; i<cols; i++){
free(grid[i]);
free(nextgrid[i]);
}
free(grid);
free(nextgrid);
return 0;
}