From a5f056237a2e8333a45eaeb590d2074b060b77b9 Mon Sep 17 00:00:00 2001 From: klein panic Date: Fri, 28 Feb 2025 22:00:25 -0500 Subject: [PATCH] Automated update --- Makefile | 23 ++++ README.md | 3 - bin/coin_flip_random_number | Bin 17288 -> 0 bytes build/Makefile | 21 ---- coinfipper | Bin 0 -> 22192 bytes include/functions.h | 7 -- obj/animation.o | Bin 0 -> 7296 bytes obj/coin.o | Bin 0 -> 1544 bytes obj/gui_animation.o | Bin 0 -> 5528 bytes obj/main.o | Bin 7984 -> 2080 bytes src/animation.c | 219 ++++++++++++++++++++++++++++++++++++ src/animation.h | 9 ++ src/animation.o | Bin 0 -> 7296 bytes src/coin.c | 13 +++ src/coin.h | 8 ++ src/coin.o | Bin 0 -> 1544 bytes src/gui_animation.c | 116 +++++++++++++++++++ src/gui_animation.h | 9 ++ src/gui_animation.o | Bin 0 -> 5096 bytes src/main.c | 209 +++++----------------------------- src/main.c.bak | 58 ---------- src/main.o | Bin 0 -> 2080 bytes tags | 31 ----- 23 files changed, 424 insertions(+), 302 deletions(-) create mode 100644 Makefile delete mode 100644 README.md delete mode 100755 bin/coin_flip_random_number delete mode 100644 build/Makefile create mode 100755 coinfipper delete mode 100644 include/functions.h create mode 100644 obj/animation.o create mode 100644 obj/coin.o create mode 100644 obj/gui_animation.o create mode 100644 src/animation.c create mode 100644 src/animation.h create mode 100644 src/animation.o create mode 100644 src/coin.c create mode 100644 src/coin.h create mode 100644 src/coin.o create mode 100644 src/gui_animation.c create mode 100644 src/gui_animation.h create mode 100644 src/gui_animation.o delete mode 100644 src/main.c.bak create mode 100644 src/main.o delete mode 100644 tags diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9baf953 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +CC = gcc +CFLAGS = -Wall -O2 +LIBS = -lX11 -lm + +SRC = src/main.c src/coin.c src/animation.c src/gui_animation.c +OBJDIR = obj +OBJ = $(OBJDIR)/main.o $(OBJDIR)/coin.o $(OBJDIR)/animation.o $(OBJDIR)/gui_animation.o +TARGET = coinfipper + +all: $(TARGET) + +$(TARGET): $(OBJ) + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +$(OBJDIR)/%.o: src/%.c | $(OBJDIR) + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR): + mkdir -p $(OBJDIR) + +clean: + rm -rf $(OBJDIR) $(TARGET) + diff --git a/README.md b/README.md deleted file mode 100644 index e9f0023..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# coinflipper Project - -This is a C project generated with the setup tool. diff --git a/bin/coin_flip_random_number b/bin/coin_flip_random_number deleted file mode 100755 index e7414d4b2d342e5027867f36fa027742078769d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17288 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 UI#71Urhly!M1>TZ1~e`M07yB}_y7O^ diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index f9f5fc4..0000000 --- a/build/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -CC = gcc -CFLAGS = -I../include -OBJDIR = ../obj -SRCDIR = ../src -BINDIR = ../bin -TARGET = $(BINDIR)/coin_flip_random_number - -OBJS = $(OBJDIR)/main.o - -all: $(TARGET) - -$(TARGET): $(OBJS) - @mkdir -p $(BINDIR) - $(CC) $(OBJS) -lncurses -o $(TARGET) - -$(OBJDIR)/%.o: $(SRCDIR)/%.c - @mkdir -p $(OBJDIR) - $(CC) $(CFLAGS) -c $< -o $@ - -clean: - rm -rf $(OBJDIR) $(BINDIR) diff --git a/coinfipper b/coinfipper new file mode 100755 index 0000000000000000000000000000000000000000..176b114f289641f3f035d514675ad7b24c49ee15 GIT binary patch literal 22192 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 a0Z0If(YW9?6gK@kpzfa!)d!={^#cH7a9_&+ literal 0 HcmV?d00001 diff --git a/obj/main.o b/obj/main.o index e383caa744d447dc07fb66732dc4c5baa29fe0ce..37dc75dade1b960775ca53bf98a4c0cfa9d2766f 100644 GIT binary patch literal 2080 zcmb<-^>JfjWMqH=Mg}_u1P><4z_5S?!FB*M9T@l+co}qc6Z0~26H7Al^B8n>(@QhK zatOjP+%e2C)G;J9*rWLkNArJ1{=O3o3=F;Q|9pDOI9v_i8ou@DjX5UpS}BcR-i3j| zv7w&Pu~f;ip`MAMRC+JSDW1*8I6N)ymALqJ+qv>@Q+I6sqg!&_qt_HonUwXtlXpXxNGa%(!kcYC2kOb<|7=22clyg zV;o~0;~e7;^UF7Y%*C)~2gpe-{4OtEru_f^A7LEWl-D~T)J6t(XJ;z~4VToU%)~qe zLnA#SJp)}s6HO?Sfk6ahI0FL%V^t6XV}$^tG!Hw+1V#o19|i^n8K~TM5beY#(9h(= zC(+03#HY~9;>4%X!|KRq(8lJ-XVJ{=!soy=kBiU3na{wHPs52%!HG}8iBG_ZkHdo- zq#Gv&`GSSv<9}=lm>F0xggL+>NQnTZRPF)%O)A(;dA3j+g#I0FNN z074m@C5J;?1BbX74smN7;taWonR$B240=A!1|Y%^EWl7)Qk0xqz>t=cSrDI`pP9!{ zRGJr$NYMqQCB&?`#KNz?-=(km`W zEGj82V9-m>&&^HED`C*f%P&dQbN36?EiOq+&W5T@&4^DcO3Y1#TTVVh8kENv7#Kid zg=`9>3_})yutE6(!h(>BQ2n4dhKN8&V)d&tFff4Pm0bNgQ2UJ_*1}1c{h)jX7lf(> z@nQY|sROam{ht6*#K6D+%a>3tM&1PFCs0}gnFCV;qAj2vx&h)aFff2h8&IhM@+(M4 z0z@z{F!({;WB}#EsBn;@7#J8}=?x|h6^7SA;ZXfBc^F*|QwS4)(&)lDQ2i)rnSp_! z0;(_rst-oN+z;cYGcYh<^S=N{kb!{#=1-9SLHP@&A0`g62HkFu*$+SxptJ#{LFFg5 t@B^6%4Qh}!IDP>&)E6!SVL*+8a2OaE1fk^JfjWMqH=Mg}_u1P><4!0GIULh zL}@yPY*Xh!k6y5^Jvt9{o+s9(1H{>c>Zb$P{e%`SXxt9h@BI5*zc;@y=yd(iQ2V{G zgsq|WyL2fR!l})*ADH=Do-i;lfLZ;|AS}ib?&jJLOeM-MuQD(&pc#wM{qh~AEFwtu zu`n<&><1AD9pISo=yiSL(RmE65-F14Vuv8QLBWgA?a}M{0*6M3!H`4O76)y|_{{Iin9s*#I&O@CS4*rlo_(GoX zQ1c^3%|o4`e?X}Ol3|)_|1gxAK-|^*f*m>ef&9kM{DKK96jOW zVW^W8I&0r_mV$!C+Vw@9C3+xm;0*-0d9UNaKJN~Fp&k0B*NbuH_n+OaZx}Chx+3`; z6b48c1QMV4Lm6%X+`R#vwR_->bp3!}zCbV^Aec80%nQd|&wxT07L448pm#lS-1QHr zTzI(}GyOK#{$VOr?RNdsTfyQ1PC+L;IxoWF=oli2ybfuu{li$o)?E9C8A-#9ZdY6y zl;Ng+z^Mp54j)Wrfy806>mSB$*FV;-XZU+O|NsAwrm)-f48*|?a2nlQyN97vx!d(b zuLn!F>zU>QY%pJ;l#{O&2`WLe8l5TiMk};DdP6Uus{kb} zL|T9(6jU?V@a83ycx|rz!@}Q}^8f$;3DB?v=PyL<>YS0EU!1Ctn5U3mP?DLSr=Sr~ zlv-S@pkAo1kYA*r?pmCzu27P%P*|E-qG`oosHfnTlUbmUsF0kWna5zHr{JENms*rq zlB$rXP?VULlAo)PSDKrYTEt+ir{G$VS;F9&SCU$!P?=v^q>!AEpP8I$r2rKx$w*bm z$uCbWQb@`#%}cRTU{Fm#k}54IK#~GQD+2?AXI@!iPG$@1@oYchPRE3hFN`=Jq z#LPTB29MOllww7Oki^WKVnw+6qQt!PR7C|JgmntJrNt!*NvR4sApe$RfP$b%A+@kH zF$d&fB-`~Ef{=Y?rJ$O^prD`-4*?1a3S0^bH3|?=1K~lW;z2x!!{O>d%D5C1^g*;j z3^vU%5Y74u3S0~zd%zZfl!LT^^`UA5S{>_W&o8L zs5(IPtq_uWaM&;~Fo23j0aT@6o)7~A12%DxAFzol;83rQLtGDsxH%4SI~?M!IK+K$ zh=<}3kHaCJ%D}(?3b$HzaIiq)je&uo5GoD}M{s&#U|>+fVNNv;@kXdQmq2M1mhKoB z7(nR=TR4N#4L0%lP;;6&o!6k;FlH7bdQPB+kjezyK2m92{JG+FflMNa3iUAf{KIG z^B{?PLdDV5gYpeX3SB%8B#6cQDjedIafr``ii6w(DwAODKLiyA*$c`dF!2jeagcgY zn8U=sL&ah0wV`}gP(ca}e`NLAP;r=gE2w%as5rX$iBNHv`Y@>ae5g3O`e{&cn0in- z1JbetDvqvxHB=m=9yz`?L&ZVr`H|vl7gQWw{UNA0NIfW@!@}n&lDHs}If5Vqu*9Pz zR2*aua=a)biG%72nECopaS(;n0ikTgMoqJ2UHwgJ-CC16wcmI z_0pim7BpQUo38{F2Ps1i2Q8>L$b95*u!o9+)Pvmb3t})ZFnHk*PeK!qgsLxsii6At z^%r6Js{<+yQU)?V4a5NT1EAvQ>Q_L;LCQeti$Dy}I1p4EUHv|&I7k_CdVYW;jvNjz zpyD8NkmKPWG@JV*dS~JBB1FIBo6Bz#-NGA z`g=8K;;{bP95iuQe{2t$IILgFpjTX(TauW>pjTW{1fervtfJJMM7@&KiV_CBl*E!m z2EC->Vg|jUdX_k>o71dfXpOUzai9qP}%^Q2g5M? z8_^^{cEQwuXiKPm0}uxZ2ZB7zz`y_sUnF6$UqO7BKS2FH7#k!G!-Y`&Fg}b%R~rts zAI+Hz6;S=Kei=+Zy8DBmWdwTs{Qxz_7#J8PKsADl1L*}}kPs~XK<+`e8zk=mjrSK& zNe~y5PSEv(`poEY2hwi +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Internal function declarations +static void run_terminal_animation(const char* final_result); +static void run_framebuffer_animation(const char* final_result); +static int is_framebuffer_available(); +static void draw_ascii_coin(int width, int height, const char* face); +static void draw_fb_detailed_coin(char* fbp, struct fb_var_screeninfo vinfo, + struct fb_fix_screeninfo finfo, int centerX, + int centerY, int radius, const char* face); + +void run_animation(const char* final_result) { + if (is_framebuffer_available()) { + run_framebuffer_animation(final_result); + } else { + run_terminal_animation(final_result); + } +} + +// Try opening /dev/fb0 to see if a framebuffer is available. +static int is_framebuffer_available() { + int fb = open("/dev/fb0", O_RDWR); + if (fb < 0) { + return 0; // Not available. + } + close(fb); + return 1; +} + +// Draw an ASCII coin with “engraved” border and pattern. +// If face is nonempty, the coin’s center will show the final coin flip result. +static void draw_ascii_coin(int width, int height, const char* face) { + for (int y = -height; y <= height; y++) { + for (int x = -width; x <= width; x++) { + float dx = (float)x / width; + float dy = (float)y / height; + if (dx*dx + dy*dy <= 1.0f) { + // Near the edge, print a border engraving. + float dist = dx*dx + dy*dy; + if (dist > 0.85f) + printf("#"); + else { + // Alternate pattern to simulate fine engraving detail. + if (((x + y) % 2) == 0) + printf("."); + else + printf(" "); + } + } else { + printf(" "); + } + } + printf("\n"); + } + // If space allows, center the coin flip result as if engraved. + if (strlen(face) > 0) { + int totalWidth = width * 2 + 1; + int textLen = strlen(face); + int padding = (totalWidth - textLen) / 2; + for (int i = 0; i < padding; i++) printf(" "); + printf("[%s]\n", face); + } else { + printf("\n"); + } +} + +// Terminal animation: simulates a coin flip by scaling the coin’s horizontal radius. +static void run_terminal_animation(const char* final_result) { + int total_frames = 60; + int base_width = 12; + int base_height = 6; + + for (int frame = 0; frame < total_frames; frame++) { + float factor = fabs(sin(frame * M_PI / total_frames)); + int current_width = (int)(base_width * factor); + if (current_width < 1) current_width = 1; + // Clear the terminal screen. + printf("\033[H\033[J"); + draw_ascii_coin(current_width, base_height, ""); + usleep(30000); + } + // Final engraved coin. + printf("\033[H\033[J"); + draw_ascii_coin(base_width, base_height, final_result); + printf("\nFinal Result: %s\n", final_result); + sleep(2); +} + +// Helper to set a pixel in the framebuffer (supports 32bpp and 16bpp). +static void set_pixel(char* fbp, struct fb_var_screeninfo vinfo, long x, long y, unsigned int color) { + if (x < 0 || y < 0 || x >= vinfo.xres || y >= vinfo.yres) return; + long location = (x + y * vinfo.xres) * (vinfo.bits_per_pixel / 8); + if (vinfo.bits_per_pixel == 32) { + *((unsigned int*)(fbp + location)) = color; + } else if (vinfo.bits_per_pixel == 16) { + unsigned short col = (unsigned short)color; + *((unsigned short*)(fbp + location)) = col; + } +} + +// Draw a detailed coin on the framebuffer with simulated engravings. +// The coin is drawn as a circle with a dark border, inner engraving line, and a subtle pattern. +// If face is nonempty, extra marks (simulating a portrait or reverse) are drawn. +static void draw_fb_detailed_coin(char* fbp, struct fb_var_screeninfo vinfo, + struct fb_fix_screeninfo finfo, int centerX, + int centerY, int radius, const char* face) { + // Define colors (in 0xRRGGBB format – conversion may be needed on some systems). + unsigned int gold = 0xFFD700; // Base gold fill. + unsigned int darkGold = 0xB8860B; // Border and detail. + unsigned int engravingColor = 0x8B7500; // For fine engraving lines. + + for (int y = -radius; y <= radius; y++) { + for (int x = -radius; x <= radius; x++) { + float dx = (float)x / radius; + float dy = (float)y / radius; + if (dx*dx + dy*dy <= 1.0f) { + int px = centerX + x; + int py = centerY + y; + float dist = sqrt(dx*dx + dy*dy); + if (dist > 0.9f) { + set_pixel(fbp, vinfo, px, py, darkGold); + } else if (fabs(dist - 0.5f) < 0.05f) { + set_pixel(fbp, vinfo, px, py, engravingColor); + } else { + set_pixel(fbp, vinfo, px, py, gold); + } + } + } + } + + // Overlay additional detail based on coin face. + if (strlen(face) > 0) { + if (strcmp(face, "Heads") == 0) { + // Simulate a simplified portrait engraving. + for (int y = -radius/4; y <= radius/4; y++) { + for (int x = -radius/4; x <= radius/4; x++) { + if ((x + y) % 3 == 0) { + set_pixel(fbp, vinfo, centerX + x, centerY + y, darkGold); + } + } + } + } else { + // Simulate reverse-side engraving. + for (int y = -radius/4; y <= radius/4; y++) { + for (int x = -radius/4; x <= radius/4; x++) { + if ((x - y) % 3 == 0) { + set_pixel(fbp, vinfo, centerX + x, centerY + y, darkGold); + } + } + } + } + } +} + +// Framebuffer animation: flips the coin with a scaling effect and then renders the final engraved coin. +static void run_framebuffer_animation(const char* final_result) { + int fb_fd = open("/dev/fb0", O_RDWR); + if (fb_fd < 0) { + perror("Error opening /dev/fb0"); + return; + } + + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; + + if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo)) { + perror("Error reading fixed information"); + close(fb_fd); + return; + } + if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo)) { + perror("Error reading variable information"); + close(fb_fd); + return; + } + + long screensize = vinfo.yres_virtual * finfo.line_length; + char *fbp = (char *) mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0); + if (fbp == MAP_FAILED) { + perror("Error: failed to map framebuffer device to memory"); + close(fb_fd); + return; + } + + int centerX = vinfo.xres / 2; + int centerY = vinfo.yres / 2; + int radius = (vinfo.yres < vinfo.xres ? vinfo.yres : vinfo.xres) / 8; + int total_frames = 60; + + for (int f = 0; f < total_frames; f++) { + float factor = fabs(sin(f * M_PI / total_frames)); + int currentRadius = (int)(radius * factor); + if (currentRadius < 1) currentRadius = 1; + // Clear the framebuffer (black). + memset(fbp, 0, screensize); + draw_fb_detailed_coin(fbp, vinfo, finfo, centerX, centerY, currentRadius, ""); + usleep(50000); + } + + // Final coin engraving showing the actual flip result. + memset(fbp, 0, screensize); + draw_fb_detailed_coin(fbp, vinfo, finfo, centerX, centerY, radius, final_result); + usleep(2000000); + + munmap(fbp, screensize); + close(fb_fd); +} + diff --git a/src/animation.h b/src/animation.h new file mode 100644 index 0000000..c4b524d --- /dev/null +++ b/src/animation.h @@ -0,0 +1,9 @@ +#ifndef ANIMATION_H +#define ANIMATION_H + +// Runs the coin flipping animation for the terminal or framebuffer. +// The final_result ("Heads" or "Tails") is used to choose the engraved design. +void run_animation(const char* final_result); + +#endif + diff --git a/src/animation.o b/src/animation.o new file mode 100644 index 0000000000000000000000000000000000000000..df75a6b6bc58ff4189796cafb6eeaa19be92a258 GIT binary patch literal 7296 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 vpgIXuo}udpB@?I;kTwK{Mi6Ms4 +#include + +const char* flip_coin() { + // Seed random number generator (for a simple example; in a larger program, you might do this once in main) + srand(time(NULL)); + if (rand() % 2 == 0) + return "Heads"; + else + return "Tails"; +} + diff --git a/src/coin.h b/src/coin.h new file mode 100644 index 0000000..b6bbe04 --- /dev/null +++ b/src/coin.h @@ -0,0 +1,8 @@ +#ifndef COIN_H +#define COIN_H + +// Returns "Heads" or "Tails" +const char* flip_coin(); + +#endif + diff --git a/src/coin.o b/src/coin.o new file mode 100644 index 0000000000000000000000000000000000000000..3c754043b1fa9db6f182ca0794b1d9b32fa0650e GIT binary patch literal 1544 zcmb<-^>JfjWMqH=Mg}_u1P><4z;J>I!FB*M9T<2Sco;mI-*6cIe*qHdJPxM7gh#I^ zNN5G4M=vXg;lb~6$fNlP$6=4u#FS!&ki^WKVg?3xXJ;z~4VToU%)~qeLnA#SJp)}s z6HO=+q>n)aOfoPqRs}IIRtPXk^RRPFU}OM`%RuD}K(q^=KsFx-h=mn{{KUfW@jo_6 zW-LC2m;`n^iWXilkClN9Od|*(1_lNpBy+%SVqjnZxlsV249-$yU|_%|u7pFJAvr%Y zPcNB4&&SySL>Mxpb6(#1T!mT5h0dhYmjiARXB&{0qGcYiK!ULurrtSjBPzDBu z3a9`V0|PjffWjIiBmp8A7#P%`;-IjG3W2EtFo{V(jfG3-FfcHH%p_O8A=G{&xQP%3 z%zhpS7f!agckUN +#include +#include +#include +#include +#include +#include + +#ifndef M_PI +#define M_PI 3.14159 +#endif + +// Draw a detailed coin in the X11 window using drawing primitives. +static void draw_gui_detailed_coin(Display *d, Window win, GC gc, int win_width, int win_height, int radius, const char* face) { + // Define colors. + unsigned long gold = 0xFFD700; + unsigned long darkGold = 0xB8860B; + unsigned long engravingColor = 0x8B7500; + + int coin_diameter = radius * 2; + int x = (win_width - coin_diameter) / 2; + int y = (win_height - coin_diameter) / 2; + + // Fill coin circle with gold. + XSetForeground(d, gc, gold); + XFillArc(d, win, gc, x, y, coin_diameter, coin_diameter, 0, 360*64); + + // Draw outer border. + XSetForeground(d, gc, darkGold); + XDrawArc(d, win, gc, x, y, coin_diameter, coin_diameter, 0, 360*64); + + // Draw an inner engraving circle. + int inner_diameter = coin_diameter * 0.7; + int inner_x = (win_width - inner_diameter) / 2; + int inner_y = (win_height - inner_diameter) / 2; + XSetForeground(d, gc, engravingColor); + XDrawArc(d, win, gc, inner_x, inner_y, inner_diameter, inner_diameter, 0, 360*64); + + // Overlay text to simulate the coin’s face engraving. + char text[50]; + if (strcmp(face, "Heads") == 0) + snprintf(text, sizeof(text), "LIBERTY"); + else + snprintf(text, sizeof(text), "E PLURIBUS UNUM"); + + /* Instead of using DefaultFont (which is undefined), we load the "fixed" font */ + XFontStruct *font = XLoadQueryFont(d, "fixed"); + if (!font) { + fprintf(stderr, "Failed to load font 'fixed'\n"); + return; + } + XSetFont(d, gc, font->fid); + int text_width = XTextWidth(font, text, strlen(text)); + int text_x = (win_width - text_width) / 2; + int text_y = win_height / 2; + XSetForeground(d, gc, darkGold); + XDrawString(d, win, gc, text_x, text_y, text, strlen(text)); + + XFreeFont(d, font); +} + +// GUI animation: uses X11 to animate a coin flip with a scaling (flipping) effect +// and then renders the final detailed coin with engravings. +void run_gui_animation(const char* final_result) { + char *display_name = getenv("DISPLAY"); + if (!display_name) { + fprintf(stderr, "No DISPLAY environment variable set. Cannot run GUI animation.\n"); + return; + } + + Display *d = XOpenDisplay(NULL); + if (d == NULL) { + fprintf(stderr, "Unable to open X display.\n"); + return; + } + int screen = DefaultScreen(d); + int win_width = 500, win_height = 500; + Window win = XCreateSimpleWindow(d, RootWindow(d, screen), 100, 100, win_width, win_height, 1, + BlackPixel(d, screen), WhitePixel(d, screen)); + XSelectInput(d, win, ExposureMask | KeyPressMask); + XMapWindow(d, win); + + // Wait for an expose event. + XEvent e; + while (1) { + XNextEvent(d, &e); + if (e.type == Expose) + break; + } + + GC gc = XCreateGC(d, win, 0, 0); + + int total_frames = 60; + int coin_radius = 100; + + for (int frame = 0; frame < total_frames; frame++) { + XClearWindow(d, win); + float factor = fabs(sin(frame * M_PI / total_frames)); + int current_radius = (int)(coin_radius * factor); + if (current_radius < 1) current_radius = 1; + draw_gui_detailed_coin(d, win, gc, win_width, win_height, current_radius, ""); + XFlush(d); + usleep(50000); + } + + // Final engraved coin. + XClearWindow(d, win); + draw_gui_detailed_coin(d, win, gc, win_width, win_height, coin_radius, final_result); + XFlush(d); + + sleep(3); + XCloseDisplay(d); +} + diff --git a/src/gui_animation.h b/src/gui_animation.h new file mode 100644 index 0000000..c393b81 --- /dev/null +++ b/src/gui_animation.h @@ -0,0 +1,9 @@ +#ifndef GUI_ANIMATION_H +#define GUI_ANIMATION_H + +// Runs the GUI-based coin flip animation in an X11 window. +// The final_result ("Heads" or "Tails") determines the engraved design. +void run_gui_animation(const char* final_result); + +#endif + diff --git a/src/gui_animation.o b/src/gui_animation.o new file mode 100644 index 0000000000000000000000000000000000000000..b6e8578662ff67da7306400f833ac4307e6526de GIT binary patch literal 5096 zcmb<-^>JfjWMqH=Mg}_u1P><4z_5ZJ!FB*M9T)@|1Q;B{9ru4>WMFU%^X)w580y*i z)iK1SSA{dwqx0%6hU@+G(Rtss^QUX) zgDeJ@&W9eIuN=dn%8n>_^qPW<_38W$7HU1f-`dB(z~HgN$J5C*C?t}>qmxC&v-62h z=X0c_jY;^E^7=f&B>beCIK+5KI@?(Y~DzeLCN{Xnq2P z8%WWPUknTkofiWRzLaOY=+XJ=;!m(9kLDv0(Xoy(j-28@PX9@!YgX2z606Xpgk-IlqD8rf^`!RXC5fzg|92BRzA z0!B~12F4IHF_5}SBry-DI;IM~4n`lo35>yf7LI%dj(i$Ud9*qPJA3Ld<`Hc zR4_0wY=FAyAxHr1CLfTSoIq}J0=dZ%;h)N z2um=7m4OXRBM3V%la)aeOd|+qFcV!h1A_-xoRxtOOd|+iFq0ijA`?Mi4hNV-Cc?oS zb_R5r7^t`am_`tZU?v9xx_BB`oD)nU6FCeF7-~WC)i}gKB`~_#AoaaC)K9@7J{yPl zavb8DaER|?U|ikHjI)kY1V@k0?l!8B&T8%i}?UDXArinK`K`@yYp_ zd3wqDdBr6KMfnAK1`K*W&W0eu7(`fr2on%t3L?O=Mj)0Mh%g5cmLS5=fFU9{wZtvI zC^fw(zcep}A;K*)C&#fUnIXcZD6t&GC@v{V&MjalE-A`M&0}y$O-n4zDRIlsD`AKT zNv$Xe&rB)FfT#{GDay=CXDBMo1G^RO0fzL{lGMC1h6w+H)I1kR9m5deT$Gwvk{XR2}6W$VgXFtFSVk?wJa56Cq$dOGed-PPHJKiR7G)S z9z%p%PHAxlLuqkNYH9&UI=?s-W?OMdN@`INLt1%JW=Sf8F(`8}Ffgz%Fff3cvVZiOV9XZ$T25LlW!IQx3RDln)Ncm~fa_8Q1|B5! zd!XW=a8N)JzX25oQJ@AP%$x@x0jN2kx)CP+6DkfeM-j;!W>Aw8>P{sjabYBJWcM2) zi6fh1jU=v&WR5eExC)YZ3{)KCEL9}&TqJQ&Ee>;k7m_%#`q@b0pgJ6;z8NYG@~;|_ z`JgZaWhIckAPi!I@D>mO4L6WDtiEH=E3V8fNlaqUD=sO5&>1jRQEE=2UP)?234>lr zVo4%{UQ%%}gI-ZShyzk?sAq`EwSaSzi%U>AhGxi8CJcJX`MID5HiKSXeo3mHyI-ho zaYr5M2N)%7E0;gb3&`Fo4@` z=*o%JZ^!^K(+FZ5oP_Duf{Q>HAh&{8FdF1<5F1^;04Pux7#KkEAoVZ|^FK%rNX#E< zKd9^m@nJXssvj0kFmafE7!7Ktg3LnKUjWq)ieH#s5Dkkz7@dW~{s~b1Pzt0KjA48j zT@KZ60G34%Q=kga?FYFPqzXoZI`J?zNF0W@K=s4;FdAL$RH*%+JPT6;qIW>`YoKX> zg&Rl>2!r~CAf@Q>bOV%N85kH~{sM79 +#include +#include "coin.h" +#include "animation.h" +#include "gui_animation.h" #include -#include -#include -#include // For usleep() +#include -#define DELAY 300000 // 300 ms delay for animation - -// Function prototypes -void flip_coin(); -void generate_random_number(int lower, int upper); -void coin_animation(int result); -void random_number_animation(int num); -void handle_exit(); - -int main() { - int choice, lower, upper; - - srand(time(NULL)); // Seed the random number generator - - // Initialize ncurses - initscr(); - noecho(); - cbreak(); - curs_set(0); - keypad(stdscr, TRUE); // Enable arrow keys and special keys - - int term_height, term_width; - getmaxyx(stdscr, term_height, term_width); // Get terminal size - - while (1) { - clear(); - mvprintw(term_height / 2 - 3, (term_width - 35) / 2, "Choose an option (Press 'q' or 'Esc' to quit):"); - mvprintw(term_height / 2 - 1, (term_width - 20) / 2, "1. Flip a coin"); - mvprintw(term_height / 2, (term_width - 20) / 2, "2. Generate a random number"); - mvprintw(term_height / 2 + 1, (term_width - 20) / 2, "3. Exit"); - mvprintw(term_height / 2 + 3, (term_width - 20) / 2, "Enter your choice: "); - refresh(); - - char input = getch(); - choice = input - '0'; - - if (input == 'q' || input == 27) { // 'q' or 'Esc' - handle_exit(); - } - - switch (choice) { - case 1: - clear(); - flip_coin(); - break; - case 2: - clear(); - mvprintw(4, 4, "Enter the lower bound: "); - echo(); - scanw("%d", &lower); - mvprintw(5, 4, "Enter the upper bound: "); - scanw("%d", &upper); - noecho(); - clear(); - generate_random_number(lower, upper); - break; - case 3: - handle_exit(); - break; - default: - mvprintw(10, 4, "Invalid choice, please try again."); - refresh(); - usleep(1000000); // Pause for 1 second before clearing +int main(int argc, char **argv) { + int animate_flag = 0; + int gui_flag = 0; + + // Parse command-line arguments + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-A") == 0 || strcmp(argv[i], "--animation") == 0) { + animate_flag = 1; + } else if (strcmp(argv[i], "-G") == 0 || strcmp(argv[i], "--gui") == 0) { + gui_flag = 1; } } - - endwin(); // End ncurses mode + + // Determine coin flip result once. + const char *result = flip_coin(); + + if (gui_flag) { + run_gui_animation(result); + } else if (animate_flag) { + run_animation(result); + } else { + printf("%s\n", result); + } + return 0; } -void flip_coin() { - int result = rand() % 2; - coin_animation(result); - if (result == 0) - mvprintw(LINES - 2, (COLS - 7) / 2, "Heads!"); // Align below the animation - else - mvprintw(LINES - 2, (COLS - 7) / 2, "Tails!"); - refresh(); - usleep(2000000); // Display result for 2 seconds -} - -void generate_random_number(int lower, int upper) { - if (lower > upper) { - mvprintw(8, 4, "Invalid range! Lower bound must be less than or equal to upper bound."); - refresh(); - usleep(2000000); // Pause for 2 seconds - return; - } - int num = (rand() % (upper - lower + 1)) + lower; - random_number_animation(num); - mvprintw(10, 4, "Random number: %d", num); - refresh(); - usleep(2000000); // Display result for 2 seconds -} - -void coin_animation(int result) { - const char *flat_coin = - " _______ \n" - " | | \n" - " |_______| \n"; - - const char *first_circle_coin = - " ______ \n" - " / \\ \n" - " | | \n" - " \\______/ \n"; - - const char *second_circle_coin = - " ____ \n" - " // \\ \n" - " | | \n" - " \\____// \n"; - - const char *side_coin_vertical = - " |=| \n" - " |=| \n" - " |=| \n" - " |=| \n"; - - const char *side_coin_horizontal = - " _______ \n" - " ||||||| \n" - " ¯¯¯¯¯¯¯ \n"; - - int height = 5; // Height the coin will "move" up - - // Center coin horizontally - int x_center = (COLS - 11) / 2; - - // Animating the coin going up and down with better alignment - for (int i = 0; i < height; i++) { - clear(); - if (i == 2) { - mvprintw(4 + i, x_center, "%s", first_circle_coin); // Coin facing the user at the peak - } else if (i == 1 || i == 3) { - mvprintw(4 + i, x_center, "%s", side_coin_vertical); // Vertical side coin - } else { - mvprintw(4 + i, x_center, "%s", flat_coin); // Flat coin at start and end - } - refresh(); - usleep(DELAY); - } - - // Display the final result as heads or tails, with proper alignment - clear(); - mvprintw(4 + height, x_center, "%s", second_circle_coin); // Show circle coin - if (result == 0) { - mvprintw(6 + height, x_center + 4, "O"); // Center the "O" inside the coin - } else { - mvprintw(6 + height, x_center + 4, "X"); // Center the "X" inside the coin - } - refresh(); -} - -void random_number_animation(int num) { - char *box_top = "+--------+\n"; - char *box_bottom = "+--------+\n"; - char number_display[20]; - - // Handle different number lengths - if (num < 10) { - sprintf(number_display, "| %d |\n", num); - } else if (num < 100) { - sprintf(number_display, "| %d |\n", num); - } else { - sprintf(number_display, "| %d |\n", num); - } - - int x_center = (COLS - 10) / 2; - - for (int i = 0; i < 5; i++) { - clear(); - mvprintw(4, x_center, "%s", box_top); - mvprintw(5, x_center, "%s", number_display); - mvprintw(6, x_center, "%s", box_bottom); - refresh(); - usleep(DELAY); - } -} - -void handle_exit() { - endwin(); // End ncurses mode - exit(0); -} diff --git a/src/main.c.bak b/src/main.c.bak deleted file mode 100644 index aea365a..0000000 --- a/src/main.c.bak +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include - -// Function prototypes -void flip_coin(); -void generate_random_number(int lower, int upper); - -int main() { - int choice, lower, upper; - - srand(time(NULL)); // Seed the random number generator - - while (1) { - printf("\nChoose an option:\n"); - printf("1. Flip a coin\n"); - printf("2. Generate a random number\n"); - printf("3. Exit\n"); - printf("Enter your choice: "); - scanf("%d", &choice); - - switch (choice) { - case 1: - flip_coin(); - break; - case 2: - printf("Enter the lower bound: "); - scanf("%d", &lower); - printf("Enter the upper bound: "); - scanf("%d", &upper); - generate_random_number(lower, upper); - break; - case 3: - exit(0); - default: - printf("Invalid choice, please try again.\n"); - } - } - - return 0; -} - -void flip_coin() { - int result = rand() % 2; - if (result == 0) - printf("Heads!\n"); - else - printf("Tails!\n"); -} - -void generate_random_number(int lower, int upper) { - if (lower > upper) { - printf("Invalid range! Lower bound must be less than or equal to upper bound.\n"); - return; - } - int num = (rand() % (upper - lower + 1)) + lower; - printf("Random number: %d\n", num); -} diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..37dc75dade1b960775ca53bf98a4c0cfa9d2766f GIT binary patch literal 2080 zcmb<-^>JfjWMqH=Mg}_u1P><4z_5S?!FB*M9T@l+co}qc6Z0~26H7Al^B8n>(@QhK zatOjP+%e2C)G;J9*rWLkNArJ1{=O3o3=F;Q|9pDOI9v_i8ou@DjX5UpS}BcR-i3j| zv7w&Pu~f;ip`MAMRC+JSDW1*8I6N)ymALqJ+qv>@Q+I6sqg!&_qt_HonUwXtlXpXxNGa%(!kcYC2kOb<|7=22clyg zV;o~0;~e7;^UF7Y%*C)~2gpe-{4OtEru_f^A7LEWl-D~T)J6t(XJ;z~4VToU%)~qe zLnA#SJp)}s6HO?Sfk6ahI0FL%V^t6XV}$^tG!Hw+1V#o19|i^n8K~TM5beY#(9h(= zC(+03#HY~9;>4%X!|KRq(8lJ-XVJ{=!soy=kBiU3na{wHPs52%!HG}8iBG_ZkHdo- zq#Gv&`GSSv<9}=lm>F0xggL+>NQnTZRPF)%O)A(;dA3j+g#I0FNN z074m@C5J;?1BbX74smN7;taWonR$B240=A!1|Y%^EWl7)Qk0xqz>t=cSrDI`pP9!{ zRGJr$NYMqQCB&?`#KNz?-=(km`W zEGj82V9-m>&&^HED`C*f%P&dQbN36?EiOq+&W5T@&4^DcO3Y1#TTVVh8kENv7#Kid zg=`9>3_})yutE6(!h(>BQ2n4dhKN8&V)d&tFff4Pm0bNgQ2UJ_*1}1c{h)jX7lf(> z@nQY|sROam{ht6*#K6D+%a>3tM&1PFCs0}gnFCV;qAj2vx&h)aFff2h8&IhM@+(M4 z0z@z{F!({;WB}#EsBn;@7#J8}=?x|h6^7SA;ZXfBc^F*|QwS4)(&)lDQ2i)rnSp_! z0;(_rst-oN+z;cYGcYh<^S=N{kb!{#=1-9SLHP@&A0`g62HkFu*$+SxptJ#{LFFg5 t@B^6%4Qh}!IDP>&)E6!SVL*+8a2OaE1fk^