Java数独游戏代码

公共类蜀都{

/* *存储数字的数组*/

static int[][]n = new int[9][9];

/* *生成一个随机数源数组,从中生成随机数*/

static int[] num = {1,2,3,4,5,6,7,8,9 };

公共静态void main(String[] args) {

//生成数字

for(int I = 0;我& lt9;i++){

//尝试填充数字的次数

int time = 0;

//填写数字

for(int j = 0;j & lt9;j++){

//生成数字

n[I][j]= generate num(time);

//如果返回值为0,说明卡住了,处理返回。

//返回处理的原理是:如果不是第一列,先回前一列,否则回前一行最后一列。

if(n[i][j] == 0){

//如果不是第一列,就倒一列。

if(j & gt;0){

j-= 2;

继续;

}else{//是第一列,然后回到上一行的最后一列。

I-;

j = 8;

继续;

}

}

//填充成功

if(isCorret(i,j)){

//初始化时间,为下一次填充做准备。

时间= 0;

}else{ //继续填充。

//增加了1倍

time++;

//继续填充当前单元格。

j-;

}

}

}

//输出结果

for(int I = 0;我& lt9;i++){

for(int j = 0;j & lt9;j++){

system . out . print(n[I][j]+" ");

}

system . out . println();

}

}

/**

*是否满足行、列、3X3区域不重复的要求?

* @param行行号

* @param col列号

* @return true代表合规。

*/

public static boolean is corret(int row,int col){

return(checkRow(row )& amp;检查线(栏)和。checkNine(row,col));

}

/**

*检查线路是否符合要求。

* @param行行号已检查

* @return true代表合规。

*/

公共静态布尔checkRow(int row){

for(int j = 0;j & lt8;j++){

if(n[row][j] == 0){

继续;

}

for(int k = j+1;k & lt9;k++){

if(n[row][j] == n[row][k]){

返回false

}

}

}

返回true

}

/**

*检查色谱柱是否符合要求。

* @param col检查列号

* @return true代表合规。

*/

公共静态布尔检查行(int col){

for(int j = 0;j & lt8;j++){

if(n[j][col] == 0){

继续;

}

for(int k = j+1;k & lt9;k++){

if(n[j][col] == n[k][col]){

返回false

}

}

}

返回true

}

/**

*检查3X3面积是否符合要求。

* @param行行号已检查

* @param col检查列号

* @return true代表合规。

*/

public static boolean check nine(int row,int col){

//获取左上角的坐标

int j = row/3 * 3;

int k = col/3 * 3;

//循环比较

for(int I = 0;我& lt8;i++){

if(n[j + i/3][k + i % 3] == 0){

继续;

}

for(int m = I+1;m & lt9;m++){

if(n[j+I/3][k+I % 3]= = n[j+m/3][k+m % 3]){

返回false

}

}

}

返回true

}

/**

*生成1-9之间的随机数。

*规则:生成的随机数放在数组的8次下标的位置。随着时间的增长,已经尝试过的号码将无法找回。

*说明:第一次从所有号码中随机抽取,第二次从前八个号码中随机抽取,以此类推。

*这样既保证了随机性,又不会重复没有达到要求的数字,提高了程序的效率。

*这个规则是这个算法的核心。

* @param time填充次数,其中0表示第一次填充。

* @返回

*/

public static int generate num(int time){

//在第一次尝试时初始化随机数字源数组。

if(time == 0){

for(int I = 0;我& lt9;i++){

num[I]= I+1;

}

}

//填充第65438次+00次,表示该位置已被卡住,将返回0,由主程序返回。

if(time == 9){

返回0;

}

//这不是第一次填充。

//生成一个随机数,它是数组的一个下标,把数组num中下标对应的数作为随机数。

int ranNum =(int)(math . random()*(9-time));

//将数字放在数组的最后一个时间位置,

int temp = num[8-time];

num[8-time]= num[ran num];

num[ranNum]= temp;

//返回一个数字

返回次数[8次];

}

}