diff --git a/Startcode/game.c b/Startcode/game.c index e0236f9..359951c 100644 --- a/Startcode/game.c +++ b/Startcode/game.c @@ -8,30 +8,32 @@ int createWordSalad( // Erstellt das Spielfeld und gibt die Anzahl platzierter Woerter zurueck. char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], // Speichert alle Buchstaben im Spielfeld. - unsigned int gitter_zeilen_spalten_anzahl, // Gibt die tatsaechliche Spielfeldgroesse an. + unsigned int searchFieldLen, // Gibt die tatsaechliche Spielfeldgroesse an. const char words[][MAX_WORD_LEN], // Enthaelt die einzutragenden Woerter. unsigned int wordCount) // Gibt die Anzahl der Woerter an. { - if (gitter_zeilen_spalten_anzahl == 0 || gitter_zeilen_spalten_anzahl > MAX_SEARCH_FIELD_LEN) // Prueft die Spielfeldgroesse. + if (searchFieldLen == 0 || searchFieldLen > MAX_SEARCH_FIELD_LEN) // Prueft die Spielfeldgroesse. { return 0; // Beendet die Funktion bei ungueltiger Groesse. } - for (unsigned int zeile = 0; zeile < gitter_zeilen_spalten_anzahl; zeile++) // Durchlaeuft alle Zeilen. + for (unsigned int row = 0; row < searchFieldLen; row++) // Durchlaeuft alle Zeilen. { - for (unsigned int spalte = 0; spalte < gitter_zeilen_spalten_anzahl; spalte++) // Durchlaeuft alle Spalten. + for (unsigned int col = 0; col < searchFieldLen; col++) // Durchlaeuft alle Spalten. { - salad[zeile][spalte] = EMPTY_CHAR; // Setzt jedes Feld auf leer. + salad[row][col] = EMPTY_CHAR; // Setzt jedes Feld auf leer. } } unsigned int placedWords = 0; // Zaehlt die erfolgreich platzierten Woerter. for (unsigned int w = 0; w < wordCount; w++) // Durchlaeuft alle Woerter aus der Wortliste. + { + unsigned int len = (unsigned int)strlen(words[w]); // Ermittelt die Laenge des aktuellen Wortes. - if (len == 0 || len > gitter_zeilen_spalten_anzahl) // Prueft, ob das Wort in das Spielfeld passt. + if (len == 0 || len > searchFieldLen) // Prueft, ob das Wort in das Spielfeld passt. { continue; // Ueberspringt ein ungueltiges oder zu langes Wort. } @@ -40,54 +42,90 @@ int createWordSalad( // Erstellt das Spielfeld und gibt die Anzahl platzierter W { int direction = rand() % 2; // Waehlt 0 fuer waagerecht oder 1 fuer senkrecht. - unsigned int maxzeile = direction == 0 ? gitter_zeilen_spalten_anzahl : gitter_zeilen_spalten_anzahl - len + 1; // Berechnet die Anzahl moeglicher Startzeilen. - unsigned int maxspalte = direction == 0 ? gitter_zeilen_spalten_anzahl - len + 1 : gitter_zeilen_spalten_anzahl; // Berechnet die Anzahl moeglicher Startspalten. - - unsigned int zeile = (unsigned int)rand() % maxzeile; // Bestimmt die zufaellige Startzeile. - unsigned int spalte = (unsigned int)rand() % maxspalte; // Bestimmt die zufaellige Startspalte. - - int fits = 1; // Merkt sich, ob das Wort an dieser Position Platz hat. - - for (unsigned int i = 0; i < len; i++) // Prueft alle benoetigten Felder. + if(!direction) { - unsigned int r = zeile + (direction == 1 ? i : 0); // Berechnet die Zeile des aktuellen Buchstabens. - unsigned int c = spalte + (direction == 0 ? i : 0); // Berechnet die Spalte des aktuellen Buchstabens. + int Zeile_Rand = rand() % searchFieldLen; + int Spalte_Rand = rand() % searchFieldLen; - if (salad[r][c] != EMPTY_CHAR) // Prueft, ob das Feld bereits belegt ist. + if((searchFieldLen - Spalte_Rand) < len) + /*Wuerde heissen, dass es nicht genug Platz gibt, Wort einzulesen + da wo wir es wollen.*/ { - fits = 0; // Kennzeichnet die Position als ungeeignet. - break; // Bricht die Ueberpruefung dieser Position ab. + continue; + /*Versuche eine neue Position.*/ } + /*navodno tacno.*/ + + int i = 0; + + for(int j = 0; j < len; j ++) + { + if(Salad[Zeile_Rand][Spalte_Rand + j] == EMPTY_CHAR) + i ++; + } + + if(i != len) + { + continue; + } + + /*Wort einlesbar.*/ + strncpy(&salad[Zeile_Rand][Spalte_Rand], words[w], len); + + placedWords ++; + break; } - if (fits == 1) // Fuehrt die Platzierung nur aus, wenn alle Felder frei sind. + if(direction) { - for (unsigned int i = 0; i < len; i++) // Durchlaeuft alle Buchstaben des Wortes. - { - unsigned int r = zeile + (direction == 1 ? i : 0); // Berechnet die Zielzeile. - unsigned int c = spalte + (direction == 0 ? i : 0); // Berechnet die Zielspalte. + int Zeile_Rand = rand() % searchFieldLen; /*Assuming SearchFieldLen is 20*/ + int Spalte_Rand = rand() % searchFieldLen; - salad[r][c] = words[w][i]; // Schreibt den Buchstaben in das Spielfeld. + if((searchFieldLen - Zeile_Rand) < len) + /*Das wuerde heissen, dass es nicht genug Platz gibt, um Worter reinzulesen.*/ + { + continue; + /*Versuche eine neue Position.*/ } - placedWords++; // Erhoeht die Anzahl der platzierten Woerter. - break; // Beendet die Versuche fuer dieses erfolgreich platzierte Wort. + int i = 0; + + for(int j = 0; j < len; j ++) + { + if(Salad[Zeile_Rand + j][Spalte_Rand] == EMPTY_CHAR) + { + i++; + } + } + + if(i != len) + { + continue; + } + + /*Wort einlesbar.*/ + for (int j = 0; j < len; j++) + { + salad[Zeile_Rand + j][Spalte_Rand] = words[w][j]; + } + + placedWords ++; + break; } } } - - for (unsigned int zeile = 0; zeile < gitter_zeilen_spalten_anzahl; zeile++) // Durchlaeuft alle Zeilen des Spielfeldes. + for (unsigned int row = 0; row < searchFieldLen; row++) // Durchlaeuft alle Zeilen des Spielfeldes. { - for (unsigned int spalte = 0; spalte < gitter_zeilen_spalten_anzahl; spalte++) // Durchlaeuft alle Spalten der aktuellen Zeile. + for (unsigned int col = 0; col < searchFieldLen; col++) // Durchlaeuft alle Spalten der aktuellen Zeile. { - if (salad[zeile][spalte] == EMPTY_CHAR) // Prueft, ob das aktuelle Feld noch leer ist. + if (salad[row][col] == EMPTY_CHAR) // Prueft, ob das aktuelle Feld noch leer ist. { - salad[zeile][spalte] = (char)('A' + rand() % 26); // Schreibt einen zufaelligen Grossbuchstaben von A bis Z. + salad[row][col] = (char)('A' + rand() % 26); // Schreibt einen zufaelligen Grossbuchstaben von A bis Z. } } } - return (int)placedWords; // Gibt die Anzahl der erfolgreich platzierten Woerter zurueck. + return (int)placedWords; }