Game.java
上传用户:xmjingguan
上传日期:2009-07-06
资源大小:2054k
文件大小:7k
源码类别:

android开发

开发平台:

Java

  1. /***
  2.  * Excerpted from "Hello, Android!",
  3.  * published by The Pragmatic Bookshelf.
  4.  * Copyrights apply to this code. It may not be used to create training material, 
  5.  * courses, books, articles, and the like. Contact us if you are in doubt.
  6.  * We make no guarantees that this code is fit for any purpose. 
  7.  * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information.
  8. ***/
  9. package org.example.sudoku;
  10. import android.app.Activity;
  11. import android.app.Dialog;
  12. import android.os.Bundle;
  13. import android.util.Log;
  14. import android.view.Gravity;
  15. import android.widget.Toast;
  16. public class Game extends Activity {
  17.    private static final String TAG = "Sudoku";
  18.    public static final String KEY_DIFFICULTY =
  19.       "org.example.sudoku.difficulty";
  20.    
  21.    private static final String PREF_PUZZLE = "puzzle" ;
  22.    
  23.    public static final int DIFFICULTY_EASY = 0;
  24.    public static final int DIFFICULTY_MEDIUM = 1;
  25.    public static final int DIFFICULTY_HARD = 2;
  26.    
  27.    protected static final int DIFFICULTY_CONTINUE = -1;
  28.    
  29.    private int puzzle[] = new int[9 * 9];
  30.    private final String easyPuzzle =
  31.       "360000000004230800000004200" +
  32.       "070460003820000014500013020" +
  33.       "001900000007048300000000045";
  34.    private final String mediumPuzzle =
  35.       "650000070000506000014000005" +
  36.       "007009000002314700000700800" +
  37.       "500000630000201000030000097";
  38.    private final String hardPuzzle =
  39.       "009000000080605020501078000" +
  40.       "000000700706040102004000000" +
  41.       "000720903090301080000000600";
  42.    private PuzzleView puzzleView;
  43.    
  44.    @Override
  45.    protected void onCreate(Bundle savedInstanceState) {
  46.       
  47.       super.onCreate(savedInstanceState);
  48.       Log.d(TAG, "onCreate");
  49.       int diff = getIntent().getIntExtra(KEY_DIFFICULTY,
  50.             DIFFICULTY_EASY);
  51.       puzzle = getPuzzle(diff);
  52.       calculateUsedTiles();
  53.       puzzleView = new PuzzleView(this);
  54.       setContentView(puzzleView);
  55.       puzzleView.requestFocus();
  56.       
  57.       // ...
  58.       // If the activity is restarted, do a continue next time
  59.       getIntent().putExtra(KEY_DIFFICULTY, DIFFICULTY_CONTINUE);
  60.    }
  61.    
  62.    @Override
  63.    protected void onResume() {
  64.       super.onResume();
  65.       Music.play(this, R.raw.game);
  66.    }
  67.    
  68.    @Override
  69.    protected void onPause() {
  70.       super.onPause();
  71.       Log.d(TAG, "onPause");
  72.       Music.stop(this);
  73.       // Save the current puzzle
  74.       getPreferences(MODE_PRIVATE).edit().putString(PREF_PUZZLE,
  75.             toPuzzleString(puzzle)).commit();
  76.    }
  77.    
  78.    
  79.    
  80.    /** Given a difficulty level, come up with a new puzzle */
  81.    private int[] getPuzzle(int diff) {
  82.       String puz;
  83.       switch (diff) {
  84.       case DIFFICULTY_CONTINUE:
  85.          puz = getPreferences(MODE_PRIVATE).getString(PREF_PUZZLE,
  86.                easyPuzzle);
  87.          break;
  88.          // ...
  89.          
  90.       case DIFFICULTY_HARD:
  91.          puz = hardPuzzle;
  92.          break;
  93.       case DIFFICULTY_MEDIUM:
  94.          puz = mediumPuzzle;
  95.          break;
  96.       case DIFFICULTY_EASY:
  97.       default:
  98.          puz = easyPuzzle;
  99.          break;
  100.          
  101.       }
  102.       return fromPuzzleString(puz);
  103.    }
  104.    
  105.    /** Convert an array into a puzzle string */
  106.    static private String toPuzzleString(int[] puz) {
  107.       StringBuilder buf = new StringBuilder();
  108.       for (int element : puz) {
  109.          buf.append(element);
  110.       }
  111.       return buf.toString();
  112.    }
  113.    /** Convert a puzzle string into an array */
  114.    static protected int[] fromPuzzleString(String string) {
  115.       int[] puz = new int[string.length()];
  116.       for (int i = 0; i < puz.length; i++) {
  117.          puz[i] = string.charAt(i) - '0';
  118.       }
  119.       return puz;
  120.    }
  121.    /** Return the tile at the given coordinates */
  122.    private int getTile(int x, int y) {
  123.       return puzzle[y * 9 + x];
  124.    }
  125.    /** Change the tile at the given coordinates */
  126.    private void setTile(int x, int y, int value) {
  127.       puzzle[y * 9 + x] = value;
  128.    }
  129.    /** Return a string for the tile at the given coordinates */
  130.    protected String getTileString(int x, int y) {
  131.       int v = getTile(x, y);
  132.       if (v == 0)
  133.          return "";
  134.       else
  135.          return String.valueOf(v);
  136.    }
  137.    /** Change the tile only if it's a valid move */
  138.    protected boolean setTileIfValid(int x, int y, int value) {
  139.       int tiles[] = getUsedTiles(x, y);
  140.       if (value != 0) {
  141.          for (int tile : tiles) {
  142.             if (tile == value)
  143.                return false;
  144.          }
  145.       }
  146.       setTile(x, y, value);
  147.       calculateUsedTiles();
  148.       return true;
  149.    }
  150.    /** Open the keypad if there are any valid moves */
  151.    protected void showKeypadOrError(int x, int y) {
  152.       int tiles[] = getUsedTiles(x, y);
  153.       if (tiles.length == 9) {
  154.          Toast toast = Toast.makeText(this,
  155.                R.string.no_moves_label, Toast.LENGTH_SHORT);
  156.          toast.setGravity(Gravity.CENTER, 0, 0);
  157.          toast.show();
  158.       } else {
  159.          Log.d(TAG, "showKeypad: used=" + toPuzzleString(tiles));
  160.          Dialog v = new Keypad(this, tiles, puzzleView);
  161.          v.show();
  162.       }
  163.    }
  164.    /** Cache of used tiles */
  165.    private final int used[][][] = new int[9][9][];
  166.    /** Return cached used tiles visible from the given coords */
  167.    protected int[] getUsedTiles(int x, int y) {
  168.       return used[x][y];
  169.    }
  170.    /** Compute the two dimensional array of used tiles */
  171.    private void calculateUsedTiles() {
  172.       for (int x = 0; x < 9; x++) {
  173.          for (int y = 0; y < 9; y++) {
  174.             used[x][y] = calculateUsedTiles(x, y);
  175.             // Log.d(TAG, "used[" + x + "][" + y + "] = "
  176.             // + toPuzzleString(used[x][y]));
  177.          }
  178.       }
  179.    }
  180.    /** Compute the used tiles visible from this position */
  181.    private int[] calculateUsedTiles(int x, int y) {
  182.       int c[] = new int[9];
  183.       // horizontal
  184.       for (int i = 0; i < 9; i++) {
  185.          if (i == y)
  186.             continue;
  187.          int t = getTile(x, i);
  188.          if (t != 0)
  189.             c[t - 1] = t;
  190.       }
  191.       // vertical
  192.       for (int i = 0; i < 9; i++) {
  193.          if (i == x)
  194.             continue;
  195.          int t = getTile(i, y);
  196.          if (t != 0)
  197.             c[t - 1] = t;
  198.       }
  199.       // same cell block
  200.       int startx = (x / 3) * 3;
  201.       int starty = (y / 3) * 3;
  202.       for (int i = startx; i < startx + 3; i++) {
  203.          for (int j = starty; j < starty + 3; j++) {
  204.             if (i == x && j == y)
  205.                continue;
  206.             int t = getTile(i, j);
  207.             if (t != 0)
  208.                c[t - 1] = t;
  209.          }
  210.       }
  211.       // compress
  212.       int nused = 0;
  213.       for (int t : c) {
  214.          if (t != 0)
  215.             nused++;
  216.       }
  217.       int c1[] = new int[nused];
  218.       nused = 0;
  219.       for (int t : c) {
  220.          if (t != 0)
  221.             c1[nused++] = t;
  222.       }
  223.       return c1;
  224.    }
  225.    
  226. }