Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import java.awt.event.KeyEvent;
  2. import java.util.Random;
  3.  
  4.  
  5. public class Game {
  6.     private int width;
  7.     private int difficulty;
  8.     private int[][] board;
  9.     private int zX, zY;
  10.     private int forbidden;
  11.    
  12.     public Game(int width, int difficulty) {
  13.         this.width = width;
  14.         this.difficulty = difficulty;
  15.        
  16.         board = new int[width][width];
  17.        
  18.         int ctr = 1;
  19.         for(int i = 0; i < width; i++) {
  20.             for(int j = 0; j < width; j++) {
  21.                 board[j][i] = ctr++;
  22.             }
  23.         }
  24.         board[width - 1][width - 1] = 0;
  25.         zX = width - 1;
  26.         zY = width - 1;
  27.         forbidden = 2;
  28.        
  29.         shuffle();
  30.     }
  31.    
  32.     private void shuffle() {
  33.         Random random = new Random();
  34.         int i = 0;
  35.         while(i < difficulty) {
  36.             int v = random.nextInt(4);
  37.            
  38.             switch(v) {
  39.             case 1:
  40.                 if(up() && forbidden != 1) {
  41.                     i++;
  42.                     forbidden = 2;
  43.                 }
  44.                 break;
  45.             case 2:
  46.                 if(down() && forbidden != 2) {
  47.                     i++;
  48.                     forbidden = 1;
  49.                 }
  50.                 break;
  51.             case 3:
  52.                 if(left() && forbidden != 3) {
  53.                     i++;
  54.                     forbidden = 4;
  55.                 }
  56.                 break;
  57.             case 4:
  58.                 if(right() && forbidden != 4) {
  59.                     i++;
  60.                     forbidden = 3;
  61.                 }
  62.                 break;
  63.             }
  64.         }
  65.     }
  66.    
  67.     private boolean up() {
  68.         if(zY > 0) {
  69.             board[zX][zY] = board[zX][zY - 1];
  70.             board[zX][zY - 1] = 0;
  71.             zY--;
  72.             return true;
  73.         }
  74.         return false;
  75.     }
  76.     private boolean down() {
  77.         if(zY < width - 1) {
  78.             board[zX][zY] = board[zX][zY + 1];
  79.             board[zX][zY + 1] = 0;
  80.             zY++;
  81.             return true;
  82.         }
  83.         return false;
  84.     }
  85.     private boolean left() {
  86.         if(zX > 0) {
  87.             board[zX][zY] = board[zX - 1][zY];
  88.             board[zX - 1][zY] = 0;
  89.             zX--;
  90.             return true;
  91.         }
  92.         return false;
  93.     }
  94.     private boolean right() {
  95.         if(zX < width - 1) {
  96.             board[zX][zY] = board[zX + 1][zY];
  97.             board[zX + 1][zY] = 0;
  98.             zX++;
  99.             return true;
  100.         }
  101.         return false;
  102.     }
  103.    
  104.     public boolean isCorrect() {
  105.         int ctr = 1;
  106.         for(int i = 0; i < width; i++) {
  107.             for(int j = 0; j < width; j++) {
  108.                 if(board[j][i] == ctr++ || (i == width - 1 && j == width - 1))
  109.                     continue;
  110.                 else
  111.                     return false;
  112.             }
  113.         }
  114.         return true;
  115.     }
  116.    
  117.     public int getValueAt(int x, int y) {
  118.         if(x >= 0  && x <= width - 1 && y >= 0 && y <= width-1) {
  119.             return board[x][y];
  120.         }
  121.         return 0;
  122.     }
  123.    
  124.     public void keyPressed(int key) {
  125.         switch(key) {
  126.         case KeyEvent.VK_UP:
  127.             up();
  128.             break;
  129.         case KeyEvent.VK_DOWN:
  130.             down();
  131.             break;
  132.         case KeyEvent.VK_LEFT:
  133.             left();
  134.             break;
  135.         case KeyEvent.VK_RIGHT:
  136.             right();
  137.             break;
  138.         }
  139.     }
  140. }