package com.company;
import javax.swing.*;
import java.util.ArrayList;
public class SudokuBoard {
private int x = 0;
private int y = 0;
private ArrayList<String> numbers = new ArrayList<>();
private ArrayList<String> usedNumbers = new ArrayList<>();
private ArrayList<String> 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;
}
}
Comments