首页 > 编程语言 >【JAVA】数独游戏

【JAVA】数独游戏

时间:2023-10-08 16:58:38浏览次数:31  
标签:BOARD JAVA 游戏 int private board public 数独 SIZE

Start

public class SudokuGame {
    public static void main(String[] args) {
        SudokuGenerator generator = new SudokuGenerator();
        int[][] borad = generator.generate();
        Sudoku sudoku = new Sudoku(borad);
        sudoku.printf();
    }
}
public class Sudoku {

    private int[][] board;

    public Sudoku(int[][] board) {
        this.board = board;
    }

    public void printf() {
        StringBuffer outStr = new StringBuffer();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                //System.out.println(board[i][j] + " ");
                outStr.append(board[i][j]).append(" ");
            }
            System.out.println(outStr.toString());
            outStr.delete(0, outStr.length());
            //System.out.println("");
        }
    }

}
import java.util.Random;

public class SudokuGenerator {

    private static final int BOARD_SIZE = 9;
    private static final int SUBGRID_SIZE = 3;
    private int[][] board;

    public SudokuGenerator() {
        // 棋盘大小9*9
        board = new int[BOARD_SIZE][BOARD_SIZE];
    }

    public int[][] generate() {
        fillValues();
        return board;
    }

    private void fillValues() {
        fillDiagonalSubgrids();
        fillRemaining(0, SUBGRID_SIZE);
    }

    private void fillDiagonalSubgrids() {
        for (int i = 0; i < BOARD_SIZE; i += SUBGRID_SIZE) {
            fillSubgrid(i, i);
        }
    }

    private boolean fillRemaining(int row, int col) {
        if (row == BOARD_SIZE - 1 && col == BOARD_SIZE) {
            return true;
        }

        if (col == BOARD_SIZE) {
            row++;
            col = 0;
        }

        if (board[row][col] != 0) {
            return fillRemaining(row, col + 1);
        }

        for (int num = 1; num <= BOARD_SIZE; num++) {
            if (isSafeToPlaceNum(row, col, num)) {
                board[row][col] = num;
                if (fillRemaining(row, col + 1)) {
                    return true;
                }
            }
        }

        board[row][col] = 0;
        return false;
    }

    private void fillSubgrid(int row, int col) {
        int num;
        for (int i = 0; i < SUBGRID_SIZE; i++) {
            for (int j = 0; j < SUBGRID_SIZE; j++) {
                do {
                    num = getRandomNumber();
                } while (!isSafeToPlaceNum(row + i, col + j, num));

                board[row + i][col + j] = num;
            }
        }
    }

    private boolean isSafeToPlaceNum(int row, int col, int num) {
        return !isInRow(row, num) && !isInCol(col, num)
                && !isInSubgrid(row - row % SUBGRID_SIZE, col - col % SUBGRID_SIZE, num);
    }

    private boolean isInRow(int row, int num) {
        for (int i = 0; i < BOARD_SIZE; i++) {
            if (board[row][i] == num) {
                return true;
            }
        }
        return false;
    }

    private boolean isInCol(int col, int num) {
        for (int i = 0; i < BOARD_SIZE; i++) {
            if (board[i][col] == num) {
                return true;
            }
        }
        return false;
    }

    private boolean isInSubgrid(int row, int col, int num) {
        for (int i = 0; i < SUBGRID_SIZE; i++) {
            for (int j = 0; j < SUBGRID_SIZE; j++) {
                if (board[row + i][col + j] == num) {
                    return true;
                }
            }
        }
        return false;
    }

    private int getRandomNumber() {
        return new Random().nextInt(BOARD_SIZE) + 1;
    }
}

 

End

标签:BOARD,JAVA,游戏,int,private,board,public,数独,SIZE
From: https://www.cnblogs.com/lnsylt/p/17749568.html

相关文章

  • java泛型笔记(根据青空的霞光)
    问题:有些数据的他的类型是不固定的,比如成绩:可以是数字,也可以是字符串(比如优良),那么要存储这样的数据要用什么数据类型可以使用object类型来解决这个问题,但是我们无法判断对方传进来的到底是什么类型,如果既不是数字也不是字符串,我们也无法得知。如果想要将object类再转换回数......
  • Java时间类型总结
    1.为什么需要新的时间类型1.8之后为什么需要LocalDate、LocalTime、LocalDateTime因为之前原生的Date如果不格式化,那么打印出来的日期可视化差,例如下面TueSep1009:34:04CST2019你会说使用SimpleDateFormat()方法,如下所示。publicclassFormatDateTime{publicst......
  • Java设计模式之享元模式
    1.1.概述定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 1.2.结构享元(Flyweight)模式中存在以下两种状态:1.内部状态,即不会随着环境的改变而改变的可......
  • Java 应用启动脚本
    启动代码java-server-Xms4g-Xmx4g-Xss256k-XX:NewSize=512m-XX:MaxNewSize=512m-XX:+UseG1GC-XX:InitiatingHeapOccupancyPercent=40-XX:G1HeapRegionSize=8m-XX:+ExplicitGCInvokesConcurrent-XX:ParallelGCThreads=4-Dsun.rmi.dgc.server.gcInterval=36000000-Ds......
  • Appium+JAVA+IDEA环境搭建
    1、Java环境配置(基础,不再描述)2、AndroidSDK安装   (1)下载地址:https://www.androiddevtools.cn/#sdk-tools(下载后解压即可)      (2)配置环境变量ANDROID_HOME      (3)添加到Path路径(platform-tools文件夹需要SDKManger安装后出现)      (4)c......
  • Java的反射机制
    Java的反射机制前言能够分析类能力的程序称为反射,反射机制可以用来:在运行程序时分析类的能力;在运行时检查对象;实现泛型数组操作代码;利用Method对象;Class类在程序运行期间,Java运行时系统始终为所有对象维护一个「运行时类型信息标识」。这个信息会跟踪每个对象所属的类,J......
  • java代码注释和空行删除,软著源码
    notepad++替换,结合正则表达式处理匹配//单行注释//.*匹配/**多行注释*/注意需要非贪婪模式,所以有一个?使用/\*{2}[\s\S]*?\*/匹配空行^\s*\n上面多行注释的匹配,需要非贪婪模式如果没有那个问号,将会把这一整块都匹配进去,第一块多行注释的头/**和最后一个多行注释......
  • mybatis出现错误 java lang NumberFormatException:For input string:A1
    使用mybatis,当使用map传参并且在iftest判断时使用map中所传的参数时,可能会产生如题的报错,具体报错信息见下图:分析这个错误,自己调试也找过度娘,“坚信”自己代码并没问题,但是问题始终无法解决。最后在一个帖子看到说iftest判断时,传入的参数跟匹配的值类型必须一致,于是调整了自己代......
  • JavaScript实现大文件分片上传处理
    我可以为你讲解如何实现JavaScript实现大文件分片上传处理,以下是具体的攻略步骤:步骤1:选择文件在实现大文件分片上传之前,第一步需要让用户选择一个文件。你可以在页面上加入一个文件选择表单,如下所示:<inputtype="file"name="file"id="file">步骤2:对文件进行分片处理当用户......
  • Java 队列Queue的一些基本操作与概念!!!!!!!!
    首先Java中的队列(Queue)是一种先进先出的数据结构。其中常见的一些基本操作与方法,包括:1、创建队列对象。例如:ArrayDeque、LinkedList等。2、入队操作。将元素添加到队列的末尾处,使用offer()方法。3、出队操作。从队列的头部移除并返回元素,使用poll()方法。......