#include #include #include // // // // /* This function draws the disks. It stops when it has drawn all the disks * or before getting to a minimum y, which represents the height of the băț * after that it picks a random color from an array of predefined colors and * draws the disks before calling itself recusively. */ void draw_disks(FILE * file, int disks, int peg, int width, int y) { if ( !disks ) { return; } // no more disks to draw if ( y < 120) { return; } // keeps the peg from overflowing; char *colors[] = { "#7fffd4", "#ec8484", "#149dca", "#e4d93c", "#222d24", "#ef8a48", "#ee6517", "#bbe200", "#ba1d1e", "#ffc4c4"}; int random_color = rand() % 10; int x = 70 + ((peg - 1) * 100); fprintf(file, "\r\n", x - width / 2 + 10, y, width, colors[random_color]); draw_disks(file, disks - 1, peg, width - width / 4, y - 21); } /* * This functions draws the bețe by using recursion, it stops when pegs is 0 * and it places them at 100px distance between them. (i think) */ void draw_pegs(FILE * file, int pegs, int width) { if ( !pegs ) { return; } // exit function fprintf(file, "\r\n", width); draw_pegs(file, pegs - 1, width + 100); } /* * This function draws the whole thing. * First it sets up the secene, it calls the function that draws "bețe", * and after it calls the function that draws the disks. */ void draw_peg_scene(FILE * file, int pegs, int disks) { int scene_width = pegs * 100; fprintf(file, "\r\n"); // start // draw scene fprintf(file, "\r\n", scene_width); draw_pegs(file, pegs, 70); // draw pegs draw_disks(file, disks, rand() % pegs + 1, 80, 230); fprintf(file, ""); // end } int main(int argc, char *argv[]) { srand(time(NULL)); // seed random num generator to make colors unique each time FILE * file; if ( !(file = fopen("test.svg", "w")) ) { perror("Can't open file!"); return -1; } if ( argc < 3 ) { printf("Invalid ussage. Correct usage: %s pegs disks\n", argv[0]); return -1; } draw_peg_scene(file, atoi(argv[1]), atoi(argv[2])); if ( fclose(file) ) { perror("Can't close file!"); } return 0; }