最近学各种工具和框架概念学麻了,效果的养分和热情严重不足,背负着要搞黄面试,自己做了两个小游戏。
demo用的是JDK17,不过没用到很复杂的ApI应该没有兼容性问题.
在刚开始想组合数独的时候想着这在每行每列里进行重复性判断,思路图和代码如下
代码如下
private void ResetTatget(int[][] target) {
//弄一个生成1到9不重复的数组
Random r = new Random();//播下种子
//暂时不做同步处理
int i = 0;//当J等于charge的时候再加一
int k2 = 0;//记录要进行比较的行数
for (; i < charge;) {
int j=0;
aa: for (; j < charge;) {
if (i != 0)//不为第一行时
{
//要求:该行不能与for([0][j]~[i][j]里的值相同)&&同行里相同
//第一个数都要随机插入,否则无法比较
//且全部执行完毕后k2才++
if (j == 0)//为第N行第一个数时 比如第二行第一个
{
int i4 = r.nextInt(charge)+1;
//判断是否与上面的行重复 从零行开始比较 比较I行
for (int x = 0; x < i; x++) { //i==1 k2=0
if (target[x][j] == i4) {
continue aa;//若相同重新执行
}
}
//同列中没有相同的数,插入
target[i][j] = i4;
j++;
} else {//第N行第二个以上 j=1
//判断列是否重复 从零行开始比较 比较I行
int i5 = r.nextInt(charge)+1;
for (int x = 0; x < i; x++) { //i==1 k2=0
int i7 = target[x][j];
if (i7 == i5) {
continue aa;
}
}
//再判断当前行是否存在相同
for (int k = 0; k < j; k++) {//如果当前行存在相同时重新刷新
int i6 = target[i][k];
if (i6 == i5) {
continue aa;
}
}
target[i][j]=i5;
j++;
if (j==charge)//赋值完【0】【8】后J为9(出去判断即结束循环)
{
i++;
}
}
} else { //i==0
if (j == 0)//为第一行第一个数时
{
int i2 = r.nextInt(charge) + 1;
target[i][j] = i2; //0,0为i1
j++;
} else { //此时J下标为1
int i3 = r.nextInt(charge) + 1;//生成随机数
for (int k1=0; k1 < j; k1++) {//如果存在相同时重新刷新且不执行++ 为1后
if (target[i][k1] == i3) {
continue aa;
}
}
target[i][j] = i3;//插入
j++;
if (j==charge)//赋值完【0】【8】后J为9(出去判断即结束循环)
{
i++;
}
}
}
}
}
}
//这长度教我的杨广武看了都说好(doge)
本以为会顺顺利利的,结果显示数组的时候直接卡死在某个数字上,这个位置填哪个数字都不行
想着这个数组不行,进入了死循环的话就再利用核心代码重新刷新就好,想了用boolean值,用秒数等都出了好多的错误。
实在不行,找我的GPT小助手在线提供答案,思路和核心代码如下
生成随机数模块—第一轮使用,没分析第二轮
private boolean fillBox(int[][] grid, int row, int col) {
Random random = new Random();
int num;
for (int i = 0; i < 3; i++) {//0,1,2
for (int j = 0; j < 3; j++) {//0,1,2
do {
num = random.nextInt(SIZE) + 1;//生产0到9的随机数
} while (!isValid(grid, row, col, num));//当数字与当前行列没有冲突时
grid[row + i][col + j] = num; //第一轮[0,0]-->[2,2] 第二轮[3,3]-->[5,5] //填满了对角线周围是空的
}
}
return true;
}
先利用该方法生成了斜对角线后,进行每个数字的递归
思路图和代码如下
private boolean fillRemaining(int[][] grid, int i, int j) { //grid 二维数组,i=0,j=3
if (j >= SIZE && i < SIZE - 1) {//0和3都小于 J大于等于9且I小于8,开始判断下一行
i = i + 1;
j = 0;
}
if (i >= SIZE && j >= SIZE) {//i和j都为9时结束
return true;
}
if (i < 3) { //当I<3时跳过遍历前3位数
if (j < 3) {
j = 3;
}
} else if (i < SIZE - 3) {//当3<I<6时跳过遍历前3位数
if (j == (i / 3) * 3) {
j = j + 3;
}
} else {
if (j == SIZE - 3) {//当I>6时跳过遍历后3位数 通过J等于6时实现
i = i + 1;
j = 0;
if (i >= SIZE) {//结束插入
return true;
}
}
}
//出现一个位置9个都重复则为False--方法会终止:不会再填补下一个位置
for (int num = 1; num <= SIZE; num++) { //执行1-9,且包含9
if (isValid(grid, i, j, num)) {//当前的行和列+三格之内是否有重复的值 0.3不变 num1-9怕段是否符合要求
grid[i][j] = num;//1-9开始按顺序赋于原始值
if (fillRemaining(grid, i, j + 1)) {//判断自身的符合性结果 如符合返回Ture退出方法并终止
return true;
}
grid[i][j] = EMPTY;
}
}
return false;
}
再经过遮挡+点击增加的功能+渲染+点击位置和显示数字的调整,数独就完成了