2016-07-18 1 views
4

私はワードアプリケーションを開発するクロスワードアルゴリズムに取り組んでいます。 StackOverflowでたくさんのグーグルや検索をした後、私はこの点に到達できました。しかし、私はJavaのアルゴリズムの適切な実装を理解することができません。以下は私が使ったクラスです。Javaを使用してAndroid用のクロスワードアルゴリズム

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(「安全」、8,5)などの単語を配置するために、行と列番号を与えている主な方法で見ることができるように。ここで8と5は列番号です。

質問私はどのように言葉を取るだけで、行と列の番号を取ることなくランダムにボード上に置くクロスワードアルゴリズムを実装することができます。事前に おかげ

編集:私は、行と列数を与えるために持っていけない道アルゴこのクラスを変更したい
...

+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

ありがとう。それはランダムな行と列を生成するための良い方法ですが、私はこれが好きなときグリッド上に配置されている1つの単語もないです –

+0

そして、我々はまた、我々はまた定義しているので、それらの交差した単語もあまりにもその。困ったことに単語をコーディングするのと同じようにはならないでしょう –

+0

nextIntメソッドが与えられた単語の乱数を生成し、その長さとクロスワードサイズが使用され、単語がボードの外に出ないためです。 –

1

まず、良いJAVAコードをおめでとうが、OSとしてのAndroidはJavaとは異なることに注意してください。まず、 'main'クラスのすべてのクラスは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を拡張するには、(キャンバスは、Androidのために行くしない初期化のためのJavaで動作するどのようなあなたが描くことができるもの)
  • です。あなたはAndroidのプロジェクトとAndroid SDK(私はAndroidのメーカーをお勧めします)

はまた、上記のコードは、展開のための準備ができていないが、それは(と初期化必要なAndroidのマニフェストを必要と活動、権限

  • を宣言しますエラー)を例として示します。 Androidは「通常の」Javaとは非常に異なるため、一部をAndroid tutorialsにすることを強くお勧めします。上記のコードは、あなたが始めるのを手助けすることです

  • 関連する問題