Files
info2Praktikum-Wortsalat/Startcode/game.c
T
2026-10-15 17:30:25 +02:00

108 lines
3.3 KiB
C

#include "game.h"
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RAND_TRIES_PER_WORD 10
#define EMPTY_CHAR 0
// TODO: Spiellogik implementieren:
/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren
* restliche Felder mit zufälligen Buchstaben füllen */
int tryPlaceVertical(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y);
int tryPlaceHorizontal(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y);
// Creates the word salad by placing words randomly and filling empty spaces
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount)
{
// initialise with '\0'
for (int x = MAX_SEARCH_FIELD_LEN - 1; x >= 0; --x) {
for (int y = MAX_SEARCH_FIELD_LEN - 1; y >= 0; --y) {
salad[x][y] = '\0';
}
}
// place words randomly
int placedWords = 0;
srand((unsigned int)time(NULL));
for (int word = 0; word < wordCount; word++)
{
// test length:
// (re-)try randomly
int retries = searchFieldLen * 2;
int placed = 0;
if(strlen(words[word]) >= searchFieldLen) break;
// int vertical = rand() / (RAND_MAX / 2);
int vertical = 1;
while (!placed && retries > 0)
{
unsigned int x = 0;
unsigned int y = 0;
if (vertical) {
int max_x = searchFieldLen - 1;
int max_y = searchFieldLen - 1 - strlen(words[word]);
x = rand() / (RAND_MAX / max_x);
y = rand() / (RAND_MAX / max_y);
} else {
int max_x = searchFieldLen - 1 - strlen(words[word]);
int max_y = searchFieldLen - 1;
x = rand() / (RAND_MAX / max_x);
y = rand() / (RAND_MAX / max_y);
}
// printf("Placing %s at %d,%d\n", words[word], x, y);
placed = tryPlaceVertical(salad, searchFieldLen, words[word], x, y);
// if (placed) printf("Placed %s at %d,%d!\n", words[word], x, y);
if (--retries < 1)
break;
};
if (!placed)
break;
else
placedWords++;
}
// fill empty spaces
for (int x = searchFieldLen - 1; x >= 0; --x) {
for (int y = searchFieldLen - 1; y >= 0; --y) {
if (salad[x][y] == '\0') {
salad[x][y] = 'A' + (rand() / (RAND_MAX / 26));
}
}
}
return placedWords;
}
int tryPlaceVertical(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y)
{
// search fields for letters
int wordLen = strlen(word);
for (int testY = y; testY < (y + wordLen); testY++)
{
if (salad[testY][x] != '\0') {
// printf("Besetzt!\n");
return 0;
}
}
// if ok then put my word in
for (int placeChar = 0; placeChar < wordLen; placeChar++)
{
salad[placeChar + y][x] = word[placeChar];
}
return 1;
}
int tryPlaceHorizontal(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char word[], unsigned int x, unsigned int y)
{
// TODO;
return 1;
}