Программа Wordsearch In C - PullRequest
0 голосов
/ 07 апреля 2019

В настоящее время я пытаюсь написать программу поиска слов на C, эта программа предназначена для генерации двумерного поиска слов и использования слов из 5 различных предустановленных категорий, а также дает пользователю возможность выбрать, какую категорию он хочет выбрать. выберите, пока это код, который у меня есть, но я врезался в стену и не знаю, куда идти дальше, кто-нибудь может дать мне какие-нибудь идеи?

это мой код:

/* ICP-1029 - Assignment 1 */
/* WordSearch Puzzle Porgram */
/* Callum Fawcett */
/* Version 1 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main() {
    const char *animalArray[20]; 

    animalArray[0] = "lynx";
    animalArray[1] = "kitten";
    animalArray[2] = "cheetah";
    animalArray[3] = "ape";
    animalArray[4] = "doe";
    animalArray[5] = "reindeer";
    animalArray[6] = "whale";
    animalArray[7] = "baboon";
    animalArray[8] = "skunk";
    animalArray[9] = "dugong";
    animalArray[10] = "elephant";
    animalArray[11] = "anteater";
    animalArray[12] = "chameleon";
    animalArray[13] = "lizaed";
    animalArray[14] = "horse";

    const char *colourArray[20];

    colourArray[0] = "red";
    colourArray[1] = "green";
    colourArray[2] = "blue";
    colourArray[3] = "black";
    colourArray[4] = "pink";
    colourArray[5] = "yellow";
    colourArray[6] = "brown";
    colourArray[7] = "orange";
    colourArray[8] = "purple";
    colourArray[9] = "black";
    colourArray[10] = "white";
    colourArray[11] = "cyan";
    colourArray[12] = "maroon";
    colourArray[13] = "magenta";
    colourArray[14] = "grey";

    const char *videogameArray[20];

    videogameArray[0] = "fortnite";
    videogameArray[1] = "fifa";
    videogameArray[2] = "hytale";
    videogameArray[3] = "soma";
    videogameArray[4] = "prey";
    videogameArray[5] = "destiny";
    videogameArray[6] = "titanfall";
    videogameArray[7] = "woldenstein";
    videogameArray[8] = "battlefield";
    videogameArray[9] = "fallout";
    videogameArray[10] = "tekken";
    videogameArray[11] = "skyrim";
    videogameArray[12] = "dishonored";
    videogameArray[13] = "uncharted";
    videogameArray[14] = "anthem";

    const char *sportsArray[20];

    sportsArray[0] = "basketball";
    sportsArray[1] = "football";
    sportsArray[2] = "cricket";
    sportsArray[3] = "wrestling";
    sportsArray[4] = "fencing";
    sportsArray[5] = "rowing";
    sportsArray[6] = "volleyball";
    sportsArray[7] = "baseball";
    sportsArray[8] = "hockey";
    sportsArray[9] = "racing";
    sportsArray[10] = "golf";
    sportsArray[11] = "bobsleigh";
    sportsArray[12] = "curling";
    sportsArray[13] = "snowboarding";
    sportsArray[14] = "bowling";

    const char *countryArray[20];

    countryArray[0] = "england";
    countryArray[1] = "ireland";
    countryArray[2] = "china";
    countryArray[3] = "wales";
    countryArray[4] = "bangladesh";
    countryArray[5] = "maldives";
    countryArray[6] = "slovenia";
    countryArray[7] = "uruguay";
    countryArray[8] = "colombia";
    countryArray[9] = "samoa";
    countryArray[10] = "jamaica";
    countryArray[11] = "malta";
    countryArray[12] = "bulgaria";
    countryArray[13] = "armenia";
    countryArray[14] = "gamnbia";
}


char **create2DArray(); //function prototype

#define WIDTH 16
#define HEIGHT 16

char **myArray; //global array

int main() {
    myArray = create2DArray();
}

//Creates a 2D array of WIDTH * HEIGHT and returns a pointer to it
char **create2DArray() {
     int i, j;
     char **array = (char **)malloc(sizeof(char *) * WIDTH);

     for (i = 0; i < WIDTH; i++)
         array[i] = (char *)malloc(sizeof(char) * HEIGHT);

     for (i = 0; i < WIDTH; i++)
        for (j = 0; j < HEIGHT; j++)
            // array[i][j] = 65 + rand() % 25;
            array[i][j] = '.';

    return array;
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Предложение, слова могут быть размещены горизонтально (слева направо), вертикально (сверху вниз), по диагонали, всегда слева направо, но сверху вниз или снизу вверх

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define WIDTH 16
#define HEIGHT 16
#define NWORDS 6

char wordsearch[HEIGHT][WIDTH];

/* horizontaly */

int canPlaceH(const char * word, int i, int j)
{
  if ((strlen(word) + j) > WIDTH)
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    j += 1;
  } while (*++word);

  return 1;
}

void placeH(const char * word, int i, int j)
{
  do {
    wordsearch[i][j++] = *word;
  }  while (*++word);
}

/* verticaly */

int canPlaceV(const char * word, int i, int j)
{
  if ((strlen(word) + i) > HEIGHT)
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i += 1;
  } while (*++word);

  return 1;
}

void placeV(const char * word, int i, int j)
{
  do {
    wordsearch[i++][j] = *word;
  }  while (*++word);
}

/* diagonal up */

int canPlaceDU(const char * word, int i, int j)
{
  int ln = strlen(word);

  if (((ln + j) > WIDTH) || ((i - ln) < 0))
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i -= 1;
    j += 1;
  } while (*++word);

  return 1;
}

void placeDU(const char * word, int i, int j)
{
  do {
    wordsearch[i--][j++] = *word;
  }  while (*++word);
}

/* diagonal down */

int canPlaceDD(const char * word, int i, int j)
{
  int ln = strlen(word);

  if (((ln + j) > WIDTH) || ((i + ln) > HEIGHT))
    return 0;

  do {
    if ((wordsearch[i][j] != 0) && (wordsearch[i][j] != *word))
      return 0;
    i += 1;
    j += 1;
  } while (*++word);

  return 1;
}

void placeDD(const char * word, int i, int j)
{
  do {
    wordsearch[i++][j++] = *word;
  }  while (*++word);
}

void fillWordsearch(const char ** a, int sz)
{
  /* first step add words from a */
  const char * used[NWORDS - 1] = { NULL }; /* to not get two times the same word */

  for (int w = 0; w != NWORDS; ++w) {
    /* random choice of a word not yet used */
    const char * word;

    for (;;) {
      word = a[rand() % sz];
      int i;

      /* check not yet used */
      for (i = 0; i != w; ++i)
        if (!strcmp(used[i], word))
          break;

      if (i == w) {
        /* not yet used */
        used[w] = word;
        break;
      }
    }

    /* random placement */

    int i, j, d;
    typedef int (*canFunc)(const char *, int, int);
    typedef void (*placeFunc)(const char *, int, int);
    const canFunc canPlace[] = { canPlaceH, canPlaceV, canPlaceDU, canPlaceDD };
    const placeFunc place[] = { placeH, placeV, placeDU, placeDD };

    do {
      i = rand() % HEIGHT;
      j = rand() % WIDTH;
      d = rand() % 4;
    } while (!(*canPlace[d])(word, i, j));
    (*place[d])(word, i, j);

#ifdef DEBUG
    printf("place %s on %d %d direction %d\n", word, i, j, d);
#endif
  }

#ifdef DEBUG
  for (int i = 0; i != HEIGHT; ++i) {
    for (int j = 0; j != WIDTH; ++j)
      putchar((wordsearch[i][j] == 0) ? '.' : wordsearch[i][j]);
    putchar('\n');
  }
  putchar('\n');
#endif

  /* second step fill not yet set characters with random lowercase letters */
  int i,j;

  for (i = 0; i < HEIGHT; i++)
    for (j = 0; j != WIDTH; ++j)
      if (wordsearch[i][j] == 0)
        wordsearch[i][j] = 'a' + rand() % ('z' - 'a' + 1);
}

int main()
{
  const char *animalArray[] = {
    "lynx",
    "kitten",
    "cheetah",
    "ape",
    "doe",
    "reindeer",
    "whale",
    "baboon",
    "skunk",
    "dugong",
    "elephant",
    "anteater",
    "chameleon",
    "lizaed",
    "horse"
  };

  const char *colourArray[] = {
    "red",
    "green",
    "blue",
    "black",
    "pink",
    "yellow",
    "brown",
    "orange",
    "purple",
    "black",
    "white",
    "cyan",
    "maroon",
    "magenta",
    "grey"
  };

  const char *videogameArray[] = {
    "fortnite",
    "fifa",
    "hytale",
    "soma",
    "prey",
    "destiny",
    "titanfall",
    "woldenstein",
    "battlefield",
    "fallout",
    "tekken",
    "skyrim",
    "dishonored",
    "uncharted",
    "anthem"
  };

  const char *sportsArray[] = {
    "basketball",
    "football",
    "cricket",
    "wrestling",
    "fencing",
    "rowing",
    "volleyball",
    "baseball",
    "hockey",
    "racing",
    "golf",
    "bobsleigh",
    "curling",
    "snowboarding",
    "bowling"
  };

  const char *countryArray[] = {
    "england",
    "ireland",
    "china",
    "wales",
    "bangladesh",
    "maldives",
    "slovenia",
    "uruguay",
    "colombia",
    "samoa",
    "jamaica",
    "malta",
    "bulgaria",
    "armenia",
    "gamnbia"
  };

  printf("choose category 1=animal 2=colour 3=video-game 4=sport 5=country : ");

  int i;

  if ((scanf("%d", &i) != 1) || (i < 1) || (i > 5))
    return -1;

  srand(time(NULL));

  switch (i) {
  case 1:
    fillWordsearch(animalArray, sizeof(animalArray)/sizeof(*animalArray));
    break;
  case 2:
    fillWordsearch(colourArray, sizeof(colourArray)/sizeof(*colourArray));
    break;
  case 3:
    fillWordsearch(videogameArray, sizeof(videogameArray)/sizeof(*videogameArray));
    break;
  case 4:
    fillWordsearch(sportsArray, sizeof(sportsArray)/sizeof(*sportsArray));
    break;
  default:
    fillWordsearch(countryArray, sizeof(countryArray)/sizeof(*countryArray));
    break;
  }

  /* print result */
  for (i = 0; i != HEIGHT; ++i) {
    for (int j = 0; j != WIDTH; ++j)
      putchar(wordsearch[i][j]);
    putchar('\n');
  }

  return 0;
}

При компиляции с определенным DEBUG, который указывает, какое слово помещается и как, а также печатает поиск слова только с вставленными словами.

Компиляция и некоторые исполнения:

pi@raspberrypi:/tmp $ gcc -DDEBUG -g c.c
pi@raspberrypi:/tmp $ ./a.out
choose category 1=animal 2=colour 3=video-game 4=sport 5=country : 1
place skunk on 14 10 direction 0
place elephant on 0 15 direction 1
place lizaed on 6 11 direction 1
place cheetah on 13 2 direction 0
place chameleon on 4 3 direction 0
place horse on 12 3 direction 0
...............e
...............l
...............e
...............p
...chameleon...h
...............a
...........l...n
...........i...t
...........z....
...........a....
...........e....
...........d....
...horse........
..cheetah.......
..........skunk.
................

xjzcgwbnnxlmaaje
wgssltuqwsuozgjl
ldtmfzijoxizmkze
vgipavkvmhnixmpp
hzuchameleonalah
bvlpuvqggpdoztpa
vdkjmzrklirlmdrn
zfswqjqnzxtiqait
qvzlzjwlinvzvymj
bfigzgyiwlhatfyw
pqrodqzzejoezgmo
rnvbvvhtddfdnzmn
vbdhorsemrgfshjd
vkcheetahjkaczwd
vrkowptjofskunkw
jibybjdvqoyoyjyb
pi@raspberrypi:/tmp $ ./a.out
choose category 1=animal 2=colour 3=video-game 4=sport 5=country : 2
place brown on 6 0 direction 1
place magenta on 12 5 direction 2
place yellow on 8 4 direction 3
place grey on 13 12 direction 0
place pink on 6 8 direction 3
place black on 5 11 direction 2
................
...............k
..............c.
.............a..
............l...
...........b....
b.......p..a....
r........it.....
o...y....nn.....
w....e..e..k....
n.....lg........
......al........
.....m..o.......
.........w..grey
................
................

syxxaavuzbbvskbu
lcmcvehexwrvkylk
cyizyixuiyxfshcg
mtkaxfhelecdbamd
mqcuscfpzppyluhg
cvbmyathgflbikmx
bpantwfwpbwaxsnv
rmudosgcqitgwzod
okznyywcynnlwutu
wyrtqefoefbkuvta
nyljuklgxxwymwuo
uimrbialrsbjxsoz
mmuokmizoeuzdtxp
psfmasddawwvgrey
efvwwwiisysayyxx
dqusfoxrqrwtusry
0 голосов
/ 07 апреля 2019

В первой функции main есть небольшая проблема:

Вы определяете массивы из 20 строковых указателей и инициализируете только первые 15 записей в них.Остальные записи не инициализируются, они не имеют нулевого указателя.Вы, вероятно, должны написать это вместо:

    const char *animalArray[20] = {
        "lynx", "kitten", "cheetah", "ape", "doe",
        "reindeer", "whale", "baboon", "skunk", "dugong",
        "elephant", "anteater", "chameleon", "lizaed", "horse",
    };

Относительно вас create2DArray функция:

  • вы, вероятно, должны транспонировать HEIGHT и WIDTH: это будетболее согласованно иметь массив HEIGHT строк из WITDH символов.

  • вы можете выделить реальный двумерный массив следующим образом:

    int main() {
        // local array
        char (*myArray)[WIDTH] = malloc(sizeof(*array) * HEIGHT);
        for (int i = 0; i < HEIGHT; i++)
            for (int j = 0; j < WIDTH; j++)
                myArray[i][j] = "abcdefghijklmnopqrstuvwxyz"[rand() % 26];
        }
    }
    

    Или выможно просто определить массив как char myArray[HEIGHT][WIDTH];

Помимо этих замечаний, ваш вопрос неясен.Возможно, вы захотите уточнить свою цель и ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...