From 1e3a80766b8a85958f127fba24745fc99d39e9de Mon Sep 17 00:00:00 2001 From: Xnoe Date: Sat, 6 Aug 2022 23:20:09 +0100 Subject: [PATCH] Hangman --- src/dynarray.c | 40 +++++++++++++++++ src/dynarray.h | 21 +++++++++ src/main.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 src/dynarray.c create mode 100644 src/dynarray.h diff --git a/src/dynarray.c b/src/dynarray.c new file mode 100644 index 0000000..fdb55f8 --- /dev/null +++ b/src/dynarray.c @@ -0,0 +1,40 @@ +#include "dynarray.h" + +struct dynarray create_dynarray() { + struct dynarray d; + d.index = 0; + d.capacity = 128; + d.buffer = malloc(d.capacity); + memset(d.buffer, 0, d.capacity); + return d; +} + +void append(struct dynarray* d, char c) { + d->buffer[d->index++] = c; + if (d->index == d->capacity) { + d->buffer = realloc(d->buffer, d->capacity *= 2); + // Clear the rest of the buffer + memset(&d->buffer[d->index], 0, d->capacity - d->index); + } +} + +void pop(struct dynarray* d) { + if (!d->index) + return; + + d->buffer[--d->index] = 0; +} + +void read_line(struct dynarray* d) { + char c; + while (1) { + read(0, &c, 1); + if (c == '\n') + break; + else if (c == '\b') { + pop(d); + write(1, &c, 1); + } else + append(d, c); + } +} \ No newline at end of file diff --git a/src/dynarray.h b/src/dynarray.h new file mode 100644 index 0000000..7393262 --- /dev/null +++ b/src/dynarray.h @@ -0,0 +1,21 @@ +#ifndef DYNARRAY_H +#define DYNARRAY_H + +#include +#include +#include +#include + +struct dynarray { + char* buffer; + int index; + int capacity; +}; + +struct dynarray create_dynarray(); +void append(struct dynarray* d, char c); +void pop(struct dynarray* d); + +void read_line(struct dynarray* d); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 27dfc7a..2f743ee 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,118 @@ #include +#include + +#include "dynarray.h" + +char* hangman_stages[6] = { + " /-----\\ \n" + " | | \n" + " | \n" + " | \n" + " | \n" + " | \n" + "============\n", + " /-----\\ \n" + " | | \n" + " O | \n" + " | \n" + " | \n" + " | \n" + "============\n", + " /-----\\ \n" + " | | \n" + " O | \n" + " + | \n" + " | \n" + " | \n" + "============\n", + " /-----\\ \n" + " | | \n" + " O | \n" + " /+ | \n" + " | \n" + " | \n" + "============\n", + " /-----\\ \n" + " | | \n" + " O | \n" + " /+\\ | \n" + " | \n" + " | \n" + "============\n", + " /-----\\ \n" + " | | \n" + " O | \n" + " /+\\ | \n" + " ^ | \n" + " | \n" + "============\n", +}; int main(int argc, char** argv) { - printf("Hello, World!\n"); + int letters_guessed[26] = {0}; + struct dynarray correct_word = create_dynarray(); + + printf("Please enter the word(s) that should be guessed: "); + fflush(stdout); + read_line(&correct_word); + + for (int i=0; i 0x5a) { + printf("Invalid character `%c` in input!\n", correct_word.buffer[i]); + return -1; + } + } + } + + int stage = 0; + while (stage != 5) { + printf("Guesses: "); + for (int i=0; i<26; i++) + printf(letters_guessed[i]?" %c ":"", 0x41+i); + printf("\n"); + int correct = 0; + for (int i=0; i 0x5a) { + printf("\nPlease enter a valid letter!\n"); + continue; + } + cn = c - 0x41; + if (!letters_guessed[cn]) { + letters_guessed[cn] = 1; + break; + } + printf("\nLetter already guessed!\n"); + } + + // Determine if the letter is in the string + + int found = 0; + for (int i=0; i