package com.company; import javax.swing.*; import java.util.ArrayList; public class SudokuBoard { private int x = 0; private int y = 0; private ArrayList numbers = new ArrayList<>(); private ArrayList usedNumbers = new ArrayList<>(); private ArrayList testedNumbers = new ArrayList<>(); public JTextField[][] grid = new JTextField[9][9]; public SudokuBoard() { generateNumbers(); fillGridWithBlanks(); populateBoard(); } private void populateBoard() { while(this.numbers.size() > 0) { String number; do { number = pickNumber(); this.testedNumbers.add(number); if(validNumber(number)) break; } while(this.testedNumbers.size() < 9); if (validNumber(number)) { addNumberToGrid(number); removeNumber(number); System.out.println(this.numbers.size() + " numbers left, placed the number " + number); } else { undoLastMove(); System.out.println("Backtracking"); } this.testedNumbers.clear(); } } private void undoLastMove() { moveBackwardsInGrid(); String lastNumber = this.usedNumbers.get(this.usedNumbers.size() - 1); this.numbers.add(lastNumber); this.usedNumbers.remove(lastNumber); this.grid[this.x][this.y].setText(""); } private void addNumberToGrid(String number) { this.grid[this.x][this.y].setText(number); this.usedNumbers.add(number); moveForwardInGrid(); } private String pickNumber() { return this.numbers.get( (int)(Math.random() * this.numbers.size())); } private void removeNumber(String number) { this.numbers.remove(number); } // Using a two-dimensional array for the grid means we have to be careful about how we traverse it private void moveForwardInGrid() { if(this.x == 8) { this.x = 0; this.y++; } else { this.x++; } } // Using a two-dimensional array for the grid means we have to be careful about how we traverse it private void moveBackwardsInGrid() { if(this.x == 0) { this.x = 8; this.y--; } else { this.x--; } } private void generateNumbers() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { this.numbers.add("" + (j + 1)); } } } public void fillGridWithBlanks() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { this.grid[i][j] = new JTextField("", 4); } } } // Check every row and column linked to the current tile for a match private boolean validNumber(String number) { for (int i = 0; i < 9; i++) { if(this.grid[this.x][i].getText().equals(number)) { return false; } else if(this.grid[i][this.y].getText().equals(number)) { return false; } } return true; } }