Moortiii icon

SudokuBoard

Moortiii | PRO | 02/02/18 06:13:03 PM UTC | 0 ⭐ | 390 👁️ | Never ⏰ | []
Java 5 |

0 B

|

None

|

0 👍

/

0 👎

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