text: Building a Java ME CDC Application Using the SavaJe Phone
  Create the Game Engine
  The Puzzles class is a simple singleton that serves as a Puzzle factory for ten predefined puzzles.
  public class Puzzles { /** * Predefined puzzles. Each string is one puzzle, each full row separated by |'s. */ private static final String[] puzzles = { "..6...2..|4..197..6|3..6.5..4|..15689..|.........|..94726.. |8..2.9..7|6..341..9|..5...1..", ... public static Puzzle newPuzzle(int index) { return new Puzzle(puzzles[index % puzzles.length]); } }
  I generated and exported the puzzles by using the sudoku solver found at. You can do the same to add new puzzles—simply export the generated puzzles in XML format, and cut the actual puzzle text from the middle and paste it into a string in the Puzzles class, adding '|' separators between rows. An obvious next logical addition to the app would be to read the puzzles directly from an external file in the original XML format.
  public class Puzzle { public final int[][] grid = new int[9][9]; public final boolean[][] given = new boolean[9][9]; public final int[][] answer = new int[9][9]; public Puzzle(String text) { Reader reader = new CharArrayReader(text.toCharArray()); for (int r = 0; r < 9; r++) for (int c = 0; c < 9; c++) { grid[r][c] = nextDigit(reader); given[r][c] = grid[r][c] > 0; if (given[r][c]) answer[r][c] = grid[r][c]; } } ...
  Ironically, this simple class is where I kept running into the sneaky Java 5 trap. At one point, I introduced a couple of String calls to trim the definition strings. This innocuous method:
  test = test.replace("|", "");
  was actually added in Java 5, so it and others like it will need to be avoided.
  Testing It Out
  The quickest way to see the game running is to build and run the sudoku-se under Eclipse. It will run as a default Java Application run configuration. Use the keyboard to navigate and test out the game logic and rendering.
  To see the game running on the phone, build the sudoku-xlet project under Eclipse. Then run the two scripts: mkdist to build the jar and dist dir, and tophone to copy the directory tree to the phone's SD. (You will need to adjust the paths in this second script for your machine and SD volume name). Plug the SD into the phone, select My Applications, and play Sudoku!
  If your Xlet won't start at all on the phone, it is most like caused by an unresolved symbol (like one in the Java 5 JRE), or that the compiler is set to level 5 Java.
  Conclusion
  Java ME has come a long way since the early days. The latest CDC specs really cover a lot of ground, and SavaJe provides an incredibly rich platform. It's almost like a desktop in your hand. So many possible applications, so little time.
  This is the first real Java ME app that I've written, and see how easy it was? Let me know if you see anything that I really botched, or of course if you have any suggestions. I know that there are quite a few fun things to add to this Sudoku game. You can coordinate any additions at.
  Further Reading/Resources
  - The Google Code site for this app:
  - The SavaJe developer site:
  - The Java JCP home page to look up all those JSRs:
  - The Eclipse download page:
  - Where to get Subclipse, the Subversion plugin for Eclipse:
  - General information on the puzzle itself:
  - The SuDoku puzzle generator:
  - Other Sudoku programming information:
  About the Author
  Carl Quinn is a Software Engineer at Google [google.com]. He focuses primarily on Java infrastructure, libraries, and development tools. He can be reached at carl.quinn@gmail.com. He also co-hosts The Java Posse, a podcast devoted to Java news and the Java community, which can be found at or via the Google group.<<