initial commit
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# coinflipper Project
|
||||||
|
|
||||||
|
This is a C project generated with the setup tool.
|
||||||
BIN
bin/coin_flip_random_number
Executable file
BIN
bin/coin_flip_random_number
Executable file
Binary file not shown.
21
build/Makefile
Normal file
21
build/Makefile
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
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)
|
||||||
7
include/functions.h
Normal file
7
include/functions.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef FUNCTIONS_H
|
||||||
|
#define FUNCTIONS_H
|
||||||
|
|
||||||
|
void flip_coin();
|
||||||
|
void generate_random_number(int lower, int upper);
|
||||||
|
|
||||||
|
#endif // FUNCTIONS_H
|
||||||
BIN
obj/main.o
Normal file
BIN
obj/main.o
Normal file
Binary file not shown.
190
src/main.c
Normal file
190
src/main.c
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <ncurses.h>
|
||||||
|
#include <unistd.h> // For usleep()
|
||||||
|
|
||||||
|
#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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
endwin(); // End ncurses mode
|
||||||
|
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);
|
||||||
|
}
|
||||||
58
src/main.c.bak
Normal file
58
src/main.c.bak
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
31
tags
Normal file
31
tags
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
||||||
|
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
||||||
|
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
|
||||||
|
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
|
||||||
|
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
|
||||||
|
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
|
||||||
|
!_TAG_PROC_CWD /home/klein/codeWS/C/coinflipper/ //
|
||||||
|
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
|
||||||
|
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
|
||||||
|
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
|
||||||
|
!_TAG_PROGRAM_VERSION 5.9.0 //
|
||||||
|
$(OBJDIR)/%.o build/Makefile /^$(OBJDIR)\/%.o: $(SRCDIR)\/%.c$/;" t
|
||||||
|
$(TARGET) build/Makefile /^$(TARGET): $(OBJS)$/;" t
|
||||||
|
BINDIR build/Makefile /^BINDIR = ..\/bin$/;" m
|
||||||
|
CC build/Makefile /^CC = gcc$/;" m
|
||||||
|
CFLAGS build/Makefile /^CFLAGS = -I..\/include$/;" m
|
||||||
|
DELAY src/main.c /^#define DELAY /;" d file:
|
||||||
|
FUNCTIONS_H include/functions.h /^#define FUNCTIONS_H$/;" d
|
||||||
|
OBJDIR build/Makefile /^OBJDIR = ..\/obj$/;" m
|
||||||
|
OBJS build/Makefile /^OBJS = $(OBJDIR)\/main.o$/;" m
|
||||||
|
SRCDIR build/Makefile /^SRCDIR = ..\/src$/;" m
|
||||||
|
TARGET build/Makefile /^TARGET = $(BINDIR)\/coin_flip_random_number$/;" m
|
||||||
|
all build/Makefile /^all: $(TARGET)$/;" t
|
||||||
|
clean build/Makefile /^clean:$/;" t
|
||||||
|
coin_animation src/main.c /^void coin_animation(int result) {$/;" f typeref:typename:void
|
||||||
|
coinflipper Project README.md /^# coinflipper Project$/;" c
|
||||||
|
flip_coin src/main.c /^void flip_coin() {$/;" f typeref:typename:void
|
||||||
|
generate_random_number src/main.c /^void generate_random_number(int lower, int upper) {$/;" f typeref:typename:void
|
||||||
|
handle_exit src/main.c /^void handle_exit() {$/;" f typeref:typename:void
|
||||||
|
main src/main.c /^int main() {$/;" f typeref:typename:int
|
||||||
|
random_number_animation src/main.c /^void random_number_animation(int num) {$/;" f typeref:typename:void
|
||||||
Reference in New Issue
Block a user