forked from freudenreichan/info2Praktikum-Wortsalat
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
#include "game.h"
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
|
|
#define MAX_RAND_TRIES_PER_WORD 10
|
|
#define EMPTY_CHAR 0
|
|
#define MAX_ATTEMPTS 42 //Die Antwort auf das Leben, das Universum, alles
|
|
#define FEHLER_LAENGE_WORT -1
|
|
#define FEHLER_SETZEN -2
|
|
#define ERFOLG 1
|
|
|
|
//TODO: Spiellogik implementieren:
|
|
/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren
|
|
* restliche Felder mit zufälligen Buchstaben füllen */
|
|
|
|
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount)
|
|
{
|
|
//befüllen des Arrays mit '\0'
|
|
for(unsigned int i = 0; i < searchFieldLen; i++)
|
|
{
|
|
for(unsigned int j = 0; j < searchFieldLen; i++)
|
|
{
|
|
salad[i][j] = '\0';
|
|
}
|
|
}
|
|
|
|
//erstellen von Richtungsvektoren
|
|
int dx[] = {1, 0};
|
|
int dy[] = {0, 1};
|
|
//befüllen mit den Wörtern
|
|
for(unsigned int w = 0; w < wordCount; w++)
|
|
{
|
|
int laenge = strlen(words[w]);
|
|
//test ob Wort theoretisch reinpasst; was machen wir aber wenn ein Wort fast genauso lang ist wie das Feld? Wenn am Ende noch ein riesiges Wort eingesetzt werden soll, wird es nie reinpassen
|
|
if(laenge > searchFieldLen)
|
|
{
|
|
return FEHLER_LAENGE_WORT;
|
|
}
|
|
|
|
int placed = 0;
|
|
int attempts = 0;
|
|
|
|
while(!placed && attempts < MAX_ATTEMPTS)
|
|
{
|
|
attempts =+ 1;
|
|
int dir = rand() % 2; //Richtung: 0 = vertikal; 1 = horizontal
|
|
int zeile = rand() % searchFieldLen;
|
|
int spalte = rand() % searchFieldLen;
|
|
|
|
if(dir == 0 && (zeile + laenge > searchFieldLen))
|
|
if(dir == 1 && (spalte + laenge > searchFieldLen))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int kollision = 0;
|
|
for(int i = 0; i < laenge; i++) //Kollision mit anderen Wörtern vermeiden
|
|
{
|
|
int z = zeile + dy[dir] * i;
|
|
int s = spalte + dx[dir] * i;
|
|
if(salad[z][s] != '\0' && salad[z][s] != words[w][i])
|
|
{
|
|
kollision = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!kollision) // keine kollision, also setzten der buchstaben
|
|
{
|
|
for(int i = 0; i < laenge; i++)
|
|
{
|
|
int z = zeile + dy[dir] * i;
|
|
int s = spalte + dx[dir] * i;
|
|
salad[z][s] = words[w][i];
|
|
}
|
|
placed = 1;
|
|
}
|
|
}
|
|
|
|
if(!placed) //überprüft ob das Wort gesetzt wurde, wenn nicht Fehlerausgabe
|
|
{
|
|
return FEHLER_SETZEN;
|
|
}
|
|
}
|
|
|
|
//befüllen mit zufälligen Buchstaben
|
|
for(unsigned int i = 0; i < searchFieldLen; i++)
|
|
{
|
|
for(unsigned int j = 0; j < searchFieldLen; j++)
|
|
{
|
|
if(salad[i][j] == '\n')
|
|
{
|
|
salad[i][j] = 'A' + rand() % 26;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ERFOLG;
|
|
}
|