#include "game.h" #include #include #include #include //große Funktion (Gitter bauen, Wörter legen, Zufallsbuchstaben) int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], //Gitter unsigned int size, const char words[][MAX_WORD_LEN], //größe Quadrat,liste von Wörtern unsigned int wordCount) { //anzahl an Wörtern in der Liste #define EMPTY_CHAR '.' // leeres kästchen = "." typedef enum { HORIZONTAL, VERTICAL } Direction; //neuer typ: waagrecht oder senkrecht //1.kleine Funktion(setzt jedes Kästchen auf ".") void initializeArray() { for (unsigned int y = 0; y < size; y++) //Zeilen durchlaufen for (unsigned int x = 0; x < size; x++) //Spalten durchlaufen salad[y][x] = EMPTY_CHAR; //punkt schreiben } //2.kleine Funktion (prüfen ob Wort passt) int canPlace(unsigned int x, unsigned int y, const char *word, Direction dir) { //Startposition, das Wort, Richtung unsigned int len = strlen(word); //länge des Wortes if ((dir == HORIZONTAL && x + len > size) || (dir == VERTICAL && y + len > size)) //prüfen ob Wort über rechten bzw. unteren Rand geht return 0; //passt das wort nicht -> 0 for (unsigned int i = 0; i < len; i++) { //jedes zeichen nacheinander prüfen if ((dir == HORIZONTAL && salad[y][x + i] != EMPTY_CHAR) || //prüfen ob nach rechts schon ein wort kommt (dir == VERTICAL && salad[y + i][x] != EMPTY_CHAR)) //prüfen ob nach unten ein Wort kommt return 0; //ist dort bereits ein wort -> 0 } return 1; //passt das Wort -> 1 } //3.kleine Funktion (Wort ins Gitter schreiben) void placeWord(unsigned int x, unsigned int y, const char *word, Direction dir) { //Startposition, das Wort, Richtung for (unsigned int i = 0; i < strlen(word); i++) { //Buchstabe für Buchstabe if (dir == HORIZONTAL) //i-ten Buchstaben an y,x+i schreiben bei waagrecht salad[y][x + i] = word[i]; else //i-ten Buchstaben an y+i,x schreiben bei senkrecht salad[y + i][x] = word[i]; } } //4.kleine Funktion (alle leeren Kästchen bekommen Zufallsbuchstaben) void fillRandomLetters() { //geht wieder über alle Zeilen und Spalten oh man for (unsigned int y = 0; y < size; y++) { for (unsigned int x = 0; x < size; x++) { if (salad[y][x] == EMPTY_CHAR) //wenns leer ist Zufallsbuchstabe salad[y][x] = 'A' + (rand() % 26); } } } //Hauptschleife(Wörter zufällig platzieren) srand(time(NULL)); //durch aktuelle Sekundenzeit wirkklich zufällig initializeArray(); //1.kleine Funktion int placed = 0; //wie viele Wörter wurden gelegt? for (unsigned int i = 0; i < wordCount; i++) { //jedes Wort durchgehen int success = 0; //für dieses Wort schon Platz gefunden? for (int tries = 0; tries < 1000 && !success; tries++) { //1000 verschiedene Stellen und Richtungen probieren unsigned int x = rand() % size; //zufällige Position Spalte unsigned int y = rand() % size; //zufällige Postion Zeile Direction dir = rand() % 2 ? HORIZONTAL : VERTICAL; //zufällige richtung 1-> Horizontal 0-> Vertical if (canPlace(x, y, words[i], dir)) { //2. kleine Funktion placeWord(x, y, words[i], dir); //3. kleine Funktion success = 1; //Wort erfolgreich platziert placed++; //Zähler der gelegten Wörter erhöhen } } } fillRandomLetters(); //4. kleine Funktion return placed; //Rückgabe wie viele Wörter plaziert wurden } //Anzeige-Funktion void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int size) { //funktion printet das wortsalatfeld for (unsigned int y = 0; y < size; y++) { for (unsigned int x = 0; x < size; x++) { printf("%c ", salad[y][x]); } printf("\n"); } }