Compare commits

..
2 Commits
Author SHA1 Message Date
herzogfl100239 39addfa981 die beste Version 2025-11-12 12:08:22 +01:00
herzogfl100239 948e51e928 Beste Version 2025-11-07 11:28:33 +01:00
13 changed files with 131 additions and 286 deletions

No files matched your search

+63 -193
View File
@@ -1,223 +1,93 @@
#include "game.h" #include "game.h"
#include <time.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR '.' // Leeres Kästchen
#define EMPTY_CHAR '.'
typedef enum { HORIZONTAL, VERTICAL } Direction;
// TODO: Spiellogik implementieren: // 1. Funktion – Array initialisieren
/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren static void initializeArray(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int size)
* restliche Felder mit zufälligen Buchstaben füllen */
static void initializeArray(char salad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) //Array initialisieren & mit Filler füllen
{ {
for (unsigned int y = 0; y < size; y++)
for (int i = 0; i < searchFieldLen; i++) for (unsigned int x = 0; x < size; x++)
{ salad[y][x] = EMPTY_CHAR;
for (int j = 0; j < searchFieldLen; j++)
{
salad[i][j] = EMPTY_CHAR;
}
}
} }
// 2. Funktion – prüfen, ob Wort passt
static void col_row (unsigned int searchFieldLen, int *x, int *y) //Zufällige x/y Koordinate für Anfang von Wort static int canPlace(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
unsigned int size, unsigned int x, unsigned int y,
const char *word, Direction dir)
{ {
*x = rand() % searchFieldLen; unsigned int len = strlen(word);
if ((dir == HORIZONTAL && x + len > size) || (dir == VERTICAL && y + len > size))
return 0;
*y = rand() % searchFieldLen; for (unsigned int i = 0; i < len; i++) {
if ((dir == HORIZONTAL && salad[y][x + i] != EMPTY_CHAR) ||
(dir == VERTICAL && salad[y + i][x] != EMPTY_CHAR))
return 0;
}
return 1;
} }
// 3. Funktion – Wort eintragen
static int place(char salad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], int searchFieldLen, int len [],const char words [] [MAX_WORD_LEN], unsigned int wordCount) //Prüfen ob plazierbar und plazieren static void placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
unsigned int x, unsigned int y, const char *word, Direction dir)
{ {
int x, y; for (unsigned int i = 0; i < strlen(word); i++) {
int placedWords = 0; //Counter plazierte Wörter if (dir == HORIZONTAL)
salad[y][x + i] = word[i];
for(int i = 0; i < wordCount; i++)
{
int placed = 0;
for(int tries = 0; tries < MAX_RAND_TRIES_PER_WORD && !placed; tries++)
{
len[i] = (int)strlen(words[i]);
col_row(searchFieldLen, &x, &y);
int orient = rand() % 2;
if(orient == 0) //wir prüfen und füllen horizontal (in x-Richtung)
{
int works = 1;
if(((x + len[i]) > searchFieldLen))
{
works = 0;
}
else else
salad[y + i][x] = word[i];
}
}
// 4. Funktion – leere Felder mit Zufallsbuchstaben füllen
static void fillRandomLetters(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int size)
{ {
for (unsigned int y = 0; y < size; y++)
for(int j = x; j < (x + len[i]); j++) for (unsigned int x = 0; x < size; x++)
{ if (salad[y][x] == EMPTY_CHAR)
salad[y][x] = 'A' + (rand() % 26);
if(salad[y][j] != EMPTY_CHAR)
{
works = 0;
break;
}
}
} }
// ab hier platzieren wir // Hauptfunktion – Wortsalat erzeugen
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
if(works) unsigned int size, const char words[][MAX_WORD_LEN],
{ unsigned int wordCount)
for (int k = 0; k < len[i]; k++)
{
salad[y][x + k] = words[i][k];
}
placed = 1;
placedWords++;
}
}
else //wir prüfen und füllen vertikal (in y-Richtung)
{
int works = 1;
if(((y + len[i]) > searchFieldLen))
{
works = 0;
}
else
{
for(int j = y; j < (y + len[i]); j++)
{
if(salad[j][x] != EMPTY_CHAR)
{
works = 0;
break;
}
}
}
// ab hier platzieren wir
if(works)
{
for (int k = 0; k < len[i]; k++)
{
salad[y + k][x] = words[i][k];
}
placed = 1;
placedWords++;
}
}
}
}
return placedWords;
}
static void fillLetters(char salad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen) //Übrige freie Felder mit Buchstaben füllen
{
for (int i = 0; i < searchFieldLen; i++)
{
for (int j = 0; j < searchFieldLen; j++)
{
if (salad[i][j] == EMPTY_CHAR)
{
char random_letter = 'A' + (rand() % 26);
salad[i][j] = random_letter;
}
}
}
}
//Erstellt Wortsalat, plaziert Wörter zufällig & füllt die Lücken
int createWordSalad(char salad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words [] [MAX_WORD_LEN], unsigned int wordCount)
{ {
srand(time(NULL)); srand(time(NULL));
initializeArray(salad, size);
initializeArray(salad, searchFieldLen); int placed = 0;
for (unsigned int i = 0; i < wordCount; i++) {
int len [wordCount]; int success = 0;
int count = 0; for (int tries = 0; tries < 1000 && !success; tries++) {
unsigned int x = rand() % size;
for(int i = 0; i < wordCount; i++) unsigned int y = rand() % size;
{ Direction dir = rand() % 2 ? HORIZONTAL : VERTICAL;
if(words [i] [0] != '\0')
count++;
if (canPlace(salad, size, x, y, words[i], dir)) {
placeWord(salad, x, y, words[i], dir);
success = 1;
placed++;
}
}
} }
int placeWords = place(salad, searchFieldLen, len, words, count); fillRandomLetters(salad, size);
return placed;
fillLetters(salad, searchFieldLen);
return placeWords;
} }
// Ausgabe von Wortsalat auf Konsole // Ausgabe-Funktion
void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int size)
void showWordSalad(const char salad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen)
{ {
for (unsigned int y = 0; y < size; y++) {
for (int i = 0; i < searchFieldLen; i++) for (unsigned int x = 0; x < size; x++)
{ printf("%c ", salad[y][x]);
for (int j = 0; j < searchFieldLen; j++)
{
printf("%c ", salad [i][j]);
}
printf("\n"); printf("\n");
} }
} }
BIN
View File
Binary file not shown.
Binary file not shown.
+14 -15
View File
@@ -1,39 +1,38 @@
#include "input.h" #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include "input.h"
// TODO: // TODO:
// eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest und als C-String zurückgibt. // eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest und als C-String zurückgibt.
// Read words from file and store in 'words' array
int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount) int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount)
{ {
unsigned int count = 0; unsigned int count = 0; // wie viele Wörter bisher gespeichert wurden
char line[MAX_LINE_LEN]; char line[MAX_LINE_LEN]; // Puffer für EINE gelesene Textzeile
while(fgets(line, sizeof(line), file)!= NULL && count < maxWordCount) while(fgets(line, sizeof(line), file)!= NULL && count < maxWordCount) //fgets liest eine komplette Zeile wenn es noch eine Zeile gibt und noch Platz für mehr Wörter ist
{ {
const char *delims = "\t\n\r ,;"; const char *delims = "\t\n\r ,;"; //Liste der Trenner (z.B. Komma)
char *token = strtok(line, delims); char *token = strtok(line, delims); //strok sucht in line das erste Wort, indem es an Trennzeichen teilt. Wenn kein Wort gefunden, wird NULL zurück gegeben
while (token != NULL && count < maxWordCount) while (token != NULL && count < maxWordCount) //Solange es noch ein Wort (token) gibt und noch Platz in words ist
{ {
for(unsigned int i = 0; token[i] != '\0'; i++) for(unsigned int i = 0; token[i] != '\0'; i++)
{ {
token[i] = toupper((unsigned char)token[i]); token[i] = toupper((unsigned char)token[i]); //toupper macht jeden Buchstaben groß.
} }
strncpy(words[count], token, MAX_WORD_LEN -1); strncpy(words[count], token, MAX_WORD_LEN -1); //Kopiert das Wort in den nächsten freien Slot words[count].
words[count][MAX_WORD_LEN -1] = '\0'; words[count][MAX_WORD_LEN -1] = '\0';
count++; count++; //Wir habenein Wort abgespeichert count + 1
token = strtok(NULL, delims); //hier token = strtok(NULL, delims); //hier
} }
} }
return count; return count;
} }
BIN
View File
Binary file not shown.
+22 -62
View File
@@ -10,84 +10,44 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{
{
int exitCode = EXIT_SUCCESS; int exitCode = EXIT_SUCCESS;
if (argc != 2) //wenn keine zwei argumente gefunde -> alarm
// Check if the correct number of arguments is provided
if(argc != 2)
{ {
fprintf(stderr, "Benutzung: %s <Pfad zur Wörterdatei>\n", argv[0]);
fprintf(stderr, "Usage: %s <path to file with search words>\n", argv[0]); return EXIT_FAILURE;
exitCode = EXIT_FAILURE;
} }
else char words[MAX_NUMBER_OF_WORDS][MAX_WORD_LEN]; //array mit eingelesenen wörtern
{
char words[MAX_NUMBER_OF_WORDS][MAX_WORD_LEN]; // Array to hold the words to be used in the game
unsigned int wordCount = 0; unsigned int wordCount = 0;
FILE *file = fopen(argv[1], "r"); FILE *file = fopen(argv[1], "r"); //schaut in die words.txt datei
if (!file) //wenn keine datei -> alarm
if(file != NULL)
{ {
fprintf(stderr, "Konnte Datei %s nicht öffnen.\n", argv[1]);
return EXIT_FAILURE;
}
unsigned int placedWords = 0; unsigned int placedWords = 0;
char wordSalad [MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; // 2D array to store the word salad char wordSalad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN];
wordCount = readWords(file, words, MAX_NUMBER_OF_WORDS); //holt sich aus readwords funktion die wortanzahl
// Read words from file and store in 'words' array
wordCount = readWords(file, words, MAX_NUMBER_OF_WORDS);
fclose(file); fclose(file);
placedWords = createWordSalad(wordSalad, SALAD_SIZE, words, wordCount); //holt sich anzahl der platzierten wörter von createwordsalad funktion
// Create the word salad by placing words into grid printf("\nWortsalat-Initialisierung\n"); //ganz viel printen
printf("-------------------------\n");
printf("Gelesene Woerter: %u\n", wordCount);
printf("Platzierte Woerter: %u\n", placedWords);
placedWords = createWordSalad(wordSalad, SALAD_SIZE, words, MAX_NUMBER_OF_WORDS); if (placedWords < wordCount) //macht checker, ob alle wörter salatiert wurden
printf("Hinweis: %u Woerter konnten nicht platziert werden.\n", wordCount - placedWords);
// TODO:
// Check if all words were successfully placed
if(placedWords == wordCount)
{
printf("Alle %u Wörter wurden erfolgreich platziert.", placedWords);
// Start the game if successful
startGame(wordSalad, SALAD_SIZE, words, wordCount, 800);
}
// error message if some words couldn't be placed
else
{
printf("Es konnten nicht alle Wörter ausgegeben werden. Nur %u von %u Wörtern wurde platziert.\n", placedWords, wordCount);
}
}
else
{
// Print error message if file couldn't be opened
fprintf(stderr, "Could not open file %s for reading ...\n", argv[1]);
exitCode = EXIT_FAILURE;
}
}
printf("\nSpielfeld (%dx%d):\n\n", SALAD_SIZE, SALAD_SIZE);
showWordSalad(wordSalad, SALAD_SIZE);
printf("\nInitialisierung abgeschlossen.\n");
return exitCode; return exitCode;
} }
BIN
View File
Binary file not shown.
Binary file not shown.
+7 -16
View File
@@ -1,16 +1,7 @@
YETI Yeti,Nessie Werwolf; Vampir
NESSIE Monster
WERWOLF Hydra;Frankenstein; fortnite
VAMPIR Dracula;KingKong;Gremlin;Kobold,Hexe;Poltergeist
MONSTER Gespenst, Oger
HYDRA tomasschwester, lababage, eckesbokesseresekes
FRANKENSTEIN Doener, Kebab, nacho, alejandrogarnacho, megafon, Telefon, gianluigibuffon, mehrweorter,
DRACULA
KINGKONG
GREMLIN
KOBOLD
HEXE
POLTERGEIST
GESPENST
OGER
APFEL
BIN
View File
Binary file not shown.
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.wordsalad</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
@@ -0,0 +1,5 @@
---
triple: 'arm64-apple-darwin'
binary-path: wordsalad
relocations: []
...