#include "game.h" #include #include #include #include #define MAX_RAND_TRIES_PER_WORD 10 #define EMPTY_CHAR 0 static int canPlace(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], const char *word, unsigned int len, unsigned int row, unsigned int col, unsigned int dRow, unsigned int dCol) { for (unsigned int i = 0; i < len; i++) { char cell = salad[row + i * dRow][col + i * dCol]; if (cell != EMPTY_CHAR && cell != (char)toupper((unsigned char)word[i])) { return 0; } } return 1; } static void placeWord(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], const char *word, unsigned int len, unsigned int row, unsigned int col, unsigned int dRow, unsigned int dCol) { for (unsigned int i = 0; i < len; i++) { salad[row + i * dRow][col + i * dCol] = (char)toupper((unsigned char)word[i]); } } int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount) { unsigned int placed = 0; srand((unsigned int)time(NULL)); for (unsigned int r = 0; r < searchFieldLen; r++) { for (unsigned int c = 0; c < searchFieldLen; c++) { salad[r][c] = EMPTY_CHAR; } } for (unsigned int w = 0; w < wordCount; w++) { unsigned int len = (unsigned int)strlen(words[w]); if (len == 0 || len > searchFieldLen) { continue; } for (unsigned int attempt = 0; attempt < MAX_RAND_TRIES_PER_WORD; attempt++) { int horizontal = rand() % 2; unsigned int dRow = horizontal ? 0 : 1; unsigned int dCol = horizontal ? 1 : 0; unsigned int maxRow = searchFieldLen - (len - 1) * dRow; unsigned int maxCol = searchFieldLen - (len - 1) * dCol; unsigned int row = (unsigned int)rand() % maxRow; unsigned int col = (unsigned int)rand() % maxCol; if (canPlace(salad, words[w], len, row, col, dRow, dCol)) { placeWord(salad, words[w], len, row, col, dRow, dCol); placed++; break; } } } for (unsigned int r = 0; r < searchFieldLen; r++) { for (unsigned int c = 0; c < searchFieldLen; c++) { if (salad[r][c] == EMPTY_CHAR) { salad[r][c] = (char)('A' + rand() % 26); } } } return (int)placed; }