2016-07-18 10 views
4

Я работаю над алгоритмом перекрестных слов для разработки словарного приложения. После выполнения большого поиска или поиска в StackOverflow я смог достичь этой цели. Но все же я не могу понять правильную реализацию алгоритма в Java. Ниже приведен класс, который я использовал.Алгоритм кроссвордов для Android с использованием Java

public class Crosswords { 

    char[][] cross; 
    int rows; 
    int cols; 
    char[][] numberGrid; 
    boolean startword; 
    final char DEFAULT = ' '; 

    public Crosswords() { 
     rows = 50; 
     cols = 50; 
     cross = new char[rows][cols]; 
     numberGrid = new char [rows][cols]; 
     for (int i = 0; i < cross.length;i++){ 
      for (int j = 0; j < cross[i].length;j++){ 
       cross[i][j] = DEFAULT; 
      } 
     } 
    } 

    public Crosswords(int ros, int colls) { 
     rows = ros; 
     cols = colls; 
     cross = new char[rows][cols]; 
     numberGrid = new char [rows][cols]; 
     for (int i = 0;i < cross.length; i++){ 
      for (int j = 0; j < cross[i].length; j++){ 
       cross[i][j] = DEFAULT; 
      } 
     } 
    } 


    public String toString() { 
      String s = new String(); 
      //String d = new String(); 
     for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < cols; j++){ 
      s = s + cross[i][j] + " "; 
      } 
      s = s + "\n"; 
     } 
     return s; 
    } 


    public void addWordh(String s, int r, int c) { 

     int i = 0; 

     int j = 0; 

     boolean b = true; 

     boolean intersectsWord = true; 


     if (s.length() > cols) { 

      System.out.println(s + " is longer than the grid. Please try another word."); 

      return; 

     } 

     if (c + s.length() > cols) { 

      System.out.println(s + " is too long. Please try another word."); 

      return; 

     } 

     if ((r - 2) >= 0) { 

      if ((cross[r - 1][c - 1 + s.length()] == DEFAULT) || (cross[r - 1][c - 1 + s.length()] == '*')) { 
       intersectsWord = false; 
      } 

      else { intersectsWord = true;} 

      if (intersectsWord == true) { 
       System.out.println("The word " + s + " intersects the beginning of another word!"); 
       return; 
      } 
     } 

     for (i = 0; i < s.length(); i++) { 

      if ((cross[r - 1][c - 1 + i] == DEFAULT) || (cross[r - 1][c - 1 + i] == s.charAt(i))) { 

       b = true; 

      } 

      else { 

       b = false; 

       System.out.println("Unable to add " + s + ". Please try another word."); 

       return;} 

     } 

     if (b == true) { 

      if ((s.length() <= cols) && (c + s.length() <= cols) && 

        (cross[r - 1][c - 1] == s.charAt(0)) || (cross[r - 1][c - 1] == DEFAULT)) { 

       while (j < s.length()) { 


        cross[r - 1][c - 1 + j] = s.charAt(j); 

        if (j==0){ 
         startword = true; 
        } 

        cross[rows - 1 - (r - 1)][cols - 1 - (c - 1 + j)] = '*'; 

        j++; 

       } 

      } 

     } 

    } 

    public void addWordv(String s, int r, int c) { 

     int i = 0; 

     int j = 0; 

     boolean b = true; 

     boolean intersectsWord = true; 

     if (s.length() > rows) { 

      System.out.println(s + " is longer than the grid. Please try another word."); 

     } 

     if (r + s.length() > rows) { 

      System.out.println(s + " is too long. Please try another word."); 

     } 

     else { 

      if ((r - 2) >= 0) { 

       if ((cross[r - 2][c - 1] == DEFAULT) || (cross[r - 2][c - 1] == '*')) { 

        intersectsWord = false; 

       } 

       else { intersectsWord = true;} 

       if (intersectsWord == true) { 

        System.out.println("The word " + s + " intersects the end of another word!"); 

        return; 

       } 

      } 
      if ((cross[r - 1 + s.length()][c - 1] == DEFAULT) || (cross[r - 1 + s.length()][c - 1] == '*')) { 
       intersectsWord = false; 
      } 

      else { intersectsWord = true;} 

      if (intersectsWord == true) { 
       System.out.println("The word " + s + " intersects the end of another word!"); 
       return; 
      } 


      for (i = 0; i < s.length(); i++) { 

       if ((cross[r - 1 + i][c - 1] == DEFAULT) || (cross[r - 1 + i][c - 1] == s.charAt(i))) { 

        b = true; 

       } 

       else { 

        b = false; 

        System.out.println("Unable to add " + s + ". Please try another word."); 

        return;} 

      } 

      if (b == true) { 

       if ((s.length() <= rows) && (r + s.length() <= cols) && 

         (cross[r - 1][c - 1] == s.charAt(0)) || (cross[r - 1][c - 1] == DEFAULT)) { 

        while (j < s.length()) { 

         cross[r - 1 + j][c - 1] = s.charAt(j); 

         if (j==0){ 
          startword = true; 
         } 

         cross[rows - 1 - (r - 1 + j)][cols - 1 - (c - 1)] = '*'; 

         j++; 

        } 

       } 

      } 
     } 

    } 

    public void setNumberGrid(){ 
     numberGrid = new char [rows][cols]; 
     for (int i = 0; i < cross.length; i++){ 
      for (int j=0; j < cross[rows].length; j++){ 
       if (cross[i][j] == DEFAULT){ 
        numberGrid[i][j] = (char) 0; 
       } 
       else if (startword == true){ 
        numberGrid[i][j] = (char) -2; 
       } 
       else { 
        numberGrid[i][j] = (char) -1; 
       } 
      } 
      int count = 1; 
      for (i=0; i < cross.length; i++){ 
       for (int j=0; j < cross[rows].length; j++){ 
        if (numberGrid[i][j] == -2){ 
         numberGrid[i][j] = (char)count; 
         count++; 
        } 
       } 
      } 
     } 
    } 

    public String printNumberGrid() { 
     for (int i=0; i < cross.length; i++){ 
      for (int j=0; j < cross[rows].length; j++){ 
       if (numberGrid[i][j] == (char)-1){ 
        numberGrid[i][j] = ' '; 
       } 
       else if (numberGrid[i][j] == (char)0){ 
        numberGrid[i][j] = '#'; 
       } 
      } 
     } 
     String d = new String(); 
     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < cols; j++){ 
       d = d + numberGrid[i][j] + " "; 
      } 
      d = d + "\n"; 
     } 
     return d; 
    } 



    public static void main(String[] args) { 
     Crosswords g = new Crosswords(); 
     g.addWordv("rawr", 4, 5); 
     g.addWordh("bot", 5, 4); 
     g.addWordv("raw", 7, 5); 
     g.addWordh("cat", 4, 5); 
     g.addWordh("bass", 6, 10); 
     System.out.println(g); 

     Crosswords c = new Crosswords(20, 20); 

     c.addWordh("HELLO", 1, 1); 

     c.addWordv("HAPLOID", 1, 1); 
     c.addWordh("COMPUTER", 3, 12); 

     c.addWordv("CAT", 2, 11); 

     c.addWordv("WOAH", 2, 20); 
     c.addWordh("PARKING", 20, 5); 

     c.addWordv("ARK", 17, 6); 
     c.addWordh("AHOY", 6, 18); 
     c.addWordv("AHOY", 18, 10); 
     c.addWordv("ADVANTAGE", 2, 12); 
     c.addWordv("INTERNAL", 2, 18); 
     c.addWordh("BANTER", 7, 11); 
     c.addWordv("BEAGLE", 5, 12); 
     c.addWordh("BASE", 8, 3); 
     c.addWordv("BALL", 8, 3); 
     c.addWordh("LEFT", 10, 3); 
     c.addWordv("SAFE", 8, 5); 
     System.out.print(c); 
    } 
} 

Как вы можете видеть в основной метод, который я добавляю слова, но и давая строки и столбца, чтобы поместить слова как c.addWordv («Safe», 8,5); где 8 и 5 - номер столбца.

Вопрос Как я могу реализовать алгоритм перекрестного слова, который просто принимает слова и размещает их на борту случайно, не беря номера строк и столбцов. Заранее спасибо

EDIT:
Я хочу изменить этот класс Algo так, что я не должен отдавать строки и столбцы номер ..

+0

Извините, но я не понимаю, чего вы пытаетесь выполнить. – Zoe

+0

Собственно, я вижу основные ошибки.Отправьте ответ – Zoe

+0

Попробуйте искать в поисковой системе поиска грубой силы. То, что вы пытаетесь сделать, не является тривиальным, но как начало, вы помещаете какое-то слово в место, а затем пытаетесь поместить других в соответствии с буквами, уже находящимися в кроссворде. Если вы этого не сделаете, вы отмените свой последний выбор и сделаете это еще раз с другим словом. – dodo

ответ

2

// псевдокод

Если размер кроссворда maxSize, а длина слова сохраняется в wordLength, тогда вы можете использовать случайный метод, как показано ниже: int maxSize = 20; int wordLength = 4;

Random random =new Random(); 
    int r,c; 
    //for horizontal 
    r=random.nextInt(maxSize-wordLength); 
    c=random.nextInt(maxSize); 
    //for vertical 
    r=random.nextInt(maxSize); 
    c=random.nextInt(maxSize-wordLength); 

Вы можете сохранить строку и столбец и сгенерировать новый, если он уже присутствует.

+0

Thanks. Это хороший способ генерации случайных строк и столбцов, но когда мне это нравится, нет даже одного слова, которое помещается в сетку. –

+0

И каково значение, если мы даем номер столбца и номера строки сами, тогда мы также определяем их пересеченные слова тоже его. Разве это не будет похоже на жесткое кодирование слов в головоломке –

+0

Не могли бы вы объяснить свое сомнение, потому что метод nextInt генерирует случайное число для данного слова, его длина и размер кроссворда используются, чтобы слово не выходило за пределы доски. –

1

Хорошо, прежде всего, поздравления с хорошим кодом JAVA, но вы должны иметь в виду, что Android как ОС отличается от Java. Прежде всего, все классы, которые являются «основными» классами, не используют public static void main(String[] args). Они расширяют действие. public static void main(string args) недействителен для запуска вашего приложения, а это значит, что код никогда не будет работать!

public class Crosswords extends Activity{ 

    char[][] cross; 
    int rows; 
    int cols; 
    char[][] numberGrid; 
    boolean startword; 
    final char DEFAULT = ' '; 

    public Crosswords() { 
     rows = 50; 
     cols = 50; 
     cross = new char[rows][cols]; 
     numberGrid = new char [rows][cols]; 
     for (int i = 0; i < cross.length;i++){ 
      for (int j = 0; j < cross[i].length;j++){ 
       cross[i][j] = DEFAULT; 
      } 
     } 
    } 

    public Crosswords(int ros, int colls) { 
     rows = ros; 
     cols = colls; 
     cross = new char[rows][cols]; 
     numberGrid = new char [rows][cols]; 
     for (int i = 0;i < cross.length; i++){ 
      for (int j = 0; j < cross[i].length; j++){ 
       cross[i][j] = DEFAULT; 
      } 
     } 
    } 


    public String toString() { 
      String s = new String(); 
      //String d = new String(); 
     for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < cols; j++){ 
      s = s + cross[i][j] + " "; 
      } 
      s = s + "\n"; 
     } 
     return s; 
    } 


    public void addWordh(String s, int r, int c) { 

     int i = 0; 

     int j = 0; 

     boolean b = true; 

     boolean intersectsWord = true; 


     if (s.length() > cols) { 

      System.out.println(s + " is longer than the grid. Please try another word."); 

      return; 

     } 

     if (c + s.length() > cols) { 

      System.out.println(s + " is too long. Please try another word."); 

      return; 

     } 

     if ((r - 2) >= 0) { 

      if ((cross[r - 1][c - 1 + s.length()] == DEFAULT) || (cross[r - 1][c - 1 + s.length()] == '*')) { 
       intersectsWord = false; 
      } 

      else { intersectsWord = true;} 

      if (intersectsWord == true) { 
       System.out.println("The word " + s + " intersects the beginning of another word!"); 
       return; 
      } 
     } 

     for (i = 0; i < s.length(); i++) { 

      if ((cross[r - 1][c - 1 + i] == DEFAULT) || (cross[r - 1][c - 1 + i] == s.charAt(i))) { 

       b = true; 

      } 

      else { 

       b = false; 

       System.out.println("Unable to add " + s + ". Please try another word."); 

       return;} 

     } 

     if (b == true) { 

      if ((s.length() <= cols) && (c + s.length() <= cols) && 

        (cross[r - 1][c - 1] == s.charAt(0)) || (cross[r - 1][c - 1] == DEFAULT)) { 

       while (j < s.length()) { 


        cross[r - 1][c - 1 + j] = s.charAt(j); 

        if (j==0){ 
         startword = true; 
        } 

        cross[rows - 1 - (r - 1)][cols - 1 - (c - 1 + j)] = '*'; 

        j++; 

       } 

      } 

     } 

    } 

    public void addWordv(String s, int r, int c) { 

     int i = 0; 

     int j = 0; 

     boolean b = true; 

     boolean intersectsWord = true; 

     if (s.length() > rows) { 

      System.out.println(s + " is longer than the grid. Please try another word."); 

     } 

     if (r + s.length() > rows) { 

      System.out.println(s + " is too long. Please try another word."); 

     } 

     else { 

      if ((r - 2) >= 0) { 

       if ((cross[r - 2][c - 1] == DEFAULT) || (cross[r - 2][c - 1] == '*')) { 

        intersectsWord = false; 

       } 

       else { intersectsWord = true;} 

       if (intersectsWord == true) { 

        System.out.println("The word " + s + " intersects the end of another word!"); 

        return; 

       } 

      } 
      if ((cross[r - 1 + s.length()][c - 1] == DEFAULT) || (cross[r - 1 + s.length()][c - 1] == '*')) { 
       intersectsWord = false; 
      } 

      else { intersectsWord = true;} 

      if (intersectsWord == true) { 
       System.out.println("The word " + s + " intersects the end of another word!"); 
       return; 
      } 


      for (i = 0; i < s.length(); i++) { 

       if ((cross[r - 1 + i][c - 1] == DEFAULT) || (cross[r - 1 + i][c - 1] == s.charAt(i))) { 

        b = true; 

       } 

       else { 

        b = false; 

        System.out.println("Unable to add " + s + ". Please try another word."); 

        return;} 

      } 

      if (b == true) { 

       if ((s.length() <= rows) && (r + s.length() <= cols) && 

         (cross[r - 1][c - 1] == s.charAt(0)) || (cross[r - 1][c - 1] == DEFAULT)) { 

        while (j < s.length()) { 

         cross[r - 1 + j][c - 1] = s.charAt(j); 

         if (j==0){ 
          startword = true; 
         } 

         cross[rows - 1 - (r - 1 + j)][cols - 1 - (c - 1)] = '*'; 

         j++; 

        } 

       } 

      } 
     } 

    } 

    public void setNumberGrid(){ 
     numberGrid = new char [rows][cols]; 
     for (int i = 0; i < cross.length; i++){ 
      for (int j=0; j < cross[rows].length; j++){ 
       if (cross[i][j] == DEFAULT){ 
        numberGrid[i][j] = (char) 0; 
       } 
       else if (startword == true){ 
        numberGrid[i][j] = (char) -2; 
       } 
       else { 
        numberGrid[i][j] = (char) -1; 
       } 
      } 
      int count = 1; 
      for (i=0; i < cross.length; i++){ 
       for (int j=0; j < cross[rows].length; j++){ 
        if (numberGrid[i][j] == -2){ 
         numberGrid[i][j] = (char)count; 
         count++; 
        } 
       } 
      } 
     } 
    } 

    public String printNumberGrid() { 
     for (int i=0; i < cross.length; i++){ 
      for (int j=0; j < cross[rows].length; j++){ 
       if (numberGrid[i][j] == (char)-1){ 
        numberGrid[i][j] = ' '; 
       } 
       else if (numberGrid[i][j] == (char)0){ 
        numberGrid[i][j] = '#'; 
       } 
      } 
     } 
     String d = new String(); 
     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < cols; j++){ 
       d = d + numberGrid[i][j] + " "; 
      } 
      d = d + "\n"; 
     } 
     return d; 
    } 



    public void onCreate(Bundle sis) { 
     super.onCreate(sis); 

     Crosswords g = new Crosswords(); 
     g.addWordv("rawr", 4, 5); 
     g.addWordh("bot", 5, 4); 
     g.addWordv("raw", 7, 5); 
     g.addWordh("cat", 4, 5); 
     g.addWordh("bass", 6, 10); 
     System.out.println(g); 

     Crosswords c = new Crosswords(20, 20); 

     c.addWordh("HELLO", 1, 1); 

     c.addWordv("HAPLOID", 1, 1); 
     c.addWordh("COMPUTER", 3, 12); 

     c.addWordv("CAT", 2, 11); 

     c.addWordv("WOAH", 2, 20); 
     c.addWordh("PARKING", 20, 5); 

     c.addWordv("ARK", 17, 6); 
     c.addWordh("AHOY", 6, 18); 
     c.addWordv("AHOY", 18, 10); 
     c.addWordv("ADVANTAGE", 2, 12); 
     c.addWordv("INTERNAL", 2, 18); 
     c.addWordh("BANTER", 7, 11); 
     c.addWordv("BEAGLE", 5, 12); 
     c.addWordh("BASE", 8, 3); 
     c.addWordv("BALL", 8, 3); 
     c.addWordh("LEFT", 10, 3); 
     c.addWordv("SAFE", 8, 5); 
     System.out.print(c); 
    } 
} 

Поскольку ваш код ошибочен с точки зрения инициализации, на самом деле это действительно вас разозлит. Вы должны помнить, что создание java-проекта недостаточно, потому что оно никогда не будет работать на Android. Так вот некоторые напоминания:

  • Классы, как это (разные экраны) расширяет активность и использует OnCreate для установки содержимого экрана
  • Создавая больше активности, как это сделано ниже это вызовет ошибку StackOverflow (новый класс -> OnCreate -> новый класс -> OnCreate -> аварии)
  • на заказ холст проходит SurfaceView (холст является то, что вы можете рисовать на)
  • Что работает с Java для инициализации не идет для андроида. Вам нужно Android Manifest и объявить деятельность, разрешение
  • вам нужен Android проект и Android SDK (я рекомендую Android Studio)

Кроме того, приведенный выше код не готов к развертыванию, но инициализирует (с ошибки). Я настоятельно рекомендую вам взять Android tutorials, потому что Android сильно отличается от «обычной» Java. Код, приведенный выше, поможет вам начать работу

 Смежные вопросы

  • Нет связанных вопросов^_^