This commit is contained in:
Xnoe 2022-08-06 23:20:09 +01:00
parent 1ca313d046
commit 1e3a80766b
Signed by: xnoe
GPG Key ID: 45AC398F44F0DAFE
3 changed files with 175 additions and 1 deletions

40
src/dynarray.c Normal file
View File

@ -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);
}
}

21
src/dynarray.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef DYNARRAY_H
#define DYNARRAY_H
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
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

View File

@ -1,5 +1,118 @@
#include <stdio.h>
#include <unistd.h>
#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<correct_word.index; i++) {
if (correct_word.buffer[i] != 32) {
char cn = correct_word.buffer[i] & ~32;
if (cn < 0x41 || cn > 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<correct_word.index; i++)
printf(correct_word.buffer[i]==32?(correct++, " / "):(letters_guessed[correct_word.buffer[i]-0x41]?(correct++, " %c "):" _ "), correct_word.buffer[i]);
if (correct == correct_word.index)
break;
printf("\n");
printf(hangman_stages[stage]);
char c;
int cn;
while (1) {
printf("Guess a letter: ");
do c = getchar(); while (c == '\n');
c &= ~32;
if (c < 0x41 || c > 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<correct_word.index; i++)
if (correct_word.buffer[i] == c)
found = 1;
if (!found) {
stage++;
}
}
if (stage == 5) {
printf(hangman_stages[stage]);
printf("You lost!\nThe correct word was: %s\n", correct_word.buffer);
} else
printf("You win!\n");
}