void collapse (int x, int y) { assert (cboard[x*ydim+y] > 3); TRACEINW("(x=%d, y=%d)", x, y); add_grains_on_square (x,y,-4); add_grains_on_square (x+1,y,1); add_grains_on_square (x-1,y,1); add_grains_on_square (x,y+1,1); add_grains_on_square (x,y-1,1); if (nbsteps == ULLONG_MAX) { cantcontinue("ERROR: Max number of steps UINTMAX = %llu reached. I must stop.\n", ULLONG_MAX); } nbsteps++; TRACEOUT; }
void init_board (int some_dim) { TRACEIN; assert (cboard == NULL); assert (some_dim <= MAX_ALLOWED_DIM); if (board_inited != false) { cantcontinue ("ERROR: %s: board was already inited?!\n", __func__); } init_waitlist (); realloc_memmatrix (some_dim, some_dim, 0, 0, UNUSEDSQ); /* set board vars properly. No copy made since board was not inited */ xdim = ydim = some_dim; xdepl = ydepl = some_dim / 2; xmin = xmax = 0; ymin = ymax = 0; diam = 1; cboard = memmatrix(xdepl,ydepl); mass = 0; nbsteps = 0; count1 = count2 = count3 = 0; area = count0 = 0; /* init count0 */ add_grains_on_square(0,0,0); /* set orig as "used" */ if (from_snapshot_mode) { init_board_contents_from_snapshot (snapshot_source_file_arg, false); #ifdef TRACE display_the_board (stdout, true); #endif /* TRACE */ } if (anim_level > 0) display_initial_board (); TRACESIGNEDMESS ("xdim=%d ydim=%d", xdim, ydim); TRACEOUT; }
void add_grain_on_random_square (int radius, int seed) { TRACEINW("(radius=%d seed=%d)", radius, seed); srandom(seed); int random_x = random_number_in_range(-radius, radius); int random_y = random_number_in_range(-radius, radius); TRACEMESS("Add 1 grain on (%d,%d)", random_x, random_y); add_grains_on_square(random_x, random_y, 1); TRACEOUT; }
void add_grains_on_origin (int delta) { assert ((delta < 0) || (mass <= INT_MAX - delta)); add_grains_on_square (0, 0, delta); }