Advertisement
Moortiii

SudokuBoard

Feb 2nd, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 3.40 KB | None | 0 0
  1. package com.company;
  2.  
  3. import javax.swing.*;
  4. import java.util.ArrayList;
  5.  
  6. public class SudokuBoard {
  7.     private int x = 0;
  8.     private int y = 0;
  9.     private ArrayList<String> numbers = new ArrayList<>();
  10.     private ArrayList<String> usedNumbers = new ArrayList<>();
  11.     private ArrayList<String> testedNumbers = new ArrayList<>();
  12.     public JTextField[][] grid = new JTextField[9][9];
  13.  
  14.     public SudokuBoard()
  15.     {
  16.         generateNumbers();
  17.         fillGridWithBlanks();
  18.         populateBoard();
  19.     }
  20.  
  21.     private void populateBoard()
  22.     {
  23.         while(this.numbers.size() > 0) {
  24.             String number;
  25.             do {
  26.                 number = pickNumber();
  27.                 this.testedNumbers.add(number);
  28.  
  29.                 if(validNumber(number))
  30.                     break;
  31.  
  32.             } while(this.testedNumbers.size() < 9);
  33.  
  34.             if (validNumber(number)) {
  35.                 addNumberToGrid(number);
  36.                 removeNumber(number);
  37.                 System.out.println(this.numbers.size() + " numbers left, placed the number " + number);
  38.             } else {
  39.                 undoLastMove();
  40.                 System.out.println("Backtracking");
  41.             }
  42.  
  43.             this.testedNumbers.clear();
  44.         }
  45.     }
  46.  
  47.     private void undoLastMove()
  48.     {
  49.         moveBackwardsInGrid();
  50.         String lastNumber = this.usedNumbers.get(this.usedNumbers.size() - 1);
  51.         this.numbers.add(lastNumber);
  52.         this.usedNumbers.remove(lastNumber);
  53.         this.grid[this.x][this.y].setText("");
  54.     }
  55.  
  56.     private void addNumberToGrid(String number)
  57.     {
  58.         this.grid[this.x][this.y].setText(number);
  59.         this.usedNumbers.add(number);
  60.         moveForwardInGrid();
  61.     }
  62.  
  63.     private String pickNumber()
  64.     {
  65.         return this.numbers.get( (int)(Math.random() * this.numbers.size()));
  66.     }
  67.  
  68.     private void removeNumber(String number)
  69.     {
  70.         this.numbers.remove(number);
  71.     }
  72.  
  73.     // Using a two-dimensional array for the grid means we have to be careful about how we traverse it
  74.     private void moveForwardInGrid()
  75.     {
  76.         if(this.x == 8)
  77.         {
  78.             this.x = 0;
  79.             this.y++;
  80.         } else
  81.         {
  82.             this.x++;
  83.         }
  84.     }
  85.  
  86.     // Using a two-dimensional array for the grid means we have to be careful about how we traverse it
  87.     private void moveBackwardsInGrid()
  88.     {
  89.         if(this.x == 0)
  90.         {
  91.             this.x = 8;
  92.             this.y--;
  93.         } else
  94.         {
  95.             this.x--;
  96.         }
  97.     }
  98.  
  99.     private void generateNumbers()
  100.     {
  101.         for (int i = 0; i < 9; i++) {
  102.             for (int j = 0; j < 9; j++) {
  103.                 this.numbers.add("" + (j + 1));
  104.             }
  105.         }
  106.     }
  107.  
  108.     public void fillGridWithBlanks()
  109.     {
  110.         for (int i = 0; i < 9; i++) {
  111.             for (int j = 0; j < 9; j++) {
  112.                 this.grid[i][j] = new JTextField("", 4);
  113.             }
  114.         }
  115.     }
  116.  
  117.     // Check every row and column linked to the current tile for a match
  118.     private boolean validNumber(String number)
  119.     {
  120.         for (int i = 0; i < 9; i++) {
  121.             if(this.grid[this.x][i].getText().equals(number))
  122.             {
  123.                 return false;
  124.             } else if(this.grid[i][this.y].getText().equals(number))
  125.             {
  126.                 return false;
  127.             }
  128.         }
  129.         return true;
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement