我正试图在Unity3D中制作一款数独游戏,但我目前仍停留在游戏背后的逻辑上。(检查同一子网格、行和列中的所有数字是否不同)
我已经能够获得一个脚本来生成整个网格,运行在2x2、2x3和3x3级别上。我所坚持的部分是制作2D数组来保存所有子网格的选定值。如果需要的话,我也可以提供完整的GenerateGrid脚本,但除此之外,任何帮助都是有帮助的。
(注:我已经尽我所能对此进行了尽可能多的研究,但我在网上发现的任何东西都不是关于游戏的Unity3D版本的,只有2D版本)
,谢谢!
发布于 2021-12-05 20:55:35
像这样吗?董事会是一个9x9网格。跳过多维语法,因为它只会使事情复杂化(在我看来)。
(伪码-我还没试过编译这个。)
int[] board = new int[9*9];
/// note that coordinates are zero-based. So, rows, columns. etc. go from 0..8, not 1..9
int getCell(int x, int y)
{
return board[y * 9 + x];
}
bool colIsValid(int x)
{
var digitsFound = new bool[9];
for(int y=0; y < 9; ++y)
{
var cellValue = getCell(x,y);
if (cellValue > 0)
{
if (digitsFound[cellValue])
return false;
digits[cellValue] = true;
}
}
return true;
}
bool rowIsValid(int y)
{
var digitsFound = new bool[9];
for(int x=0; x < 9; ++x)
{
var cellValue = getCell(x,y);
if (cellValue > 0)
{
if (digitsFound[cellValue])
return false;
digits[cellValue] = true;
}
}
return true;
}
// determine if the 3x3 subgrid containing cell (x,y) is valid.
bool subGridIsValid(int cellX, int cellY)
{
var minX = (cellX / 3) * 3;
var maxX = minX + 3;
var minY = (cellY / 3) * 3;
var maxY = minY + 3;
var digitsFound = new bool[9];
for(var j=minY; j < maxY; ++j)
{
for(var i = minX; i < maxX; ++i)
{
var cellValue = getCell(i,j);
if (cellValue > 0)
{
if (digitsFound[cellValue])
return false;
digitsFound[cellValue] = true;
}
}
}
return true;
}发布于 2021-12-05 20:43:04
您可以将自己表示为一个网格(包含行和列)。每个网格单元本身是一个子网格(有子行和子列)。
要检查用户是否解决了Sudoku问题,您有三个条件
上的每个单元格没有重复号。
从那里我们可以开始工作。我建议使用两组二维数组。一个用于主网格,另一个用于每个子网格,因此basically...your网格声明可能类似于这个int[,][,] sudoku和sudoku1,2将访问行1、列2、子行3、子列4(如果这是有意义的话)。
因此,要检查游戏条件:
sudoku[1,2][i,j]的每个子单元,以确保网格单元格1、2sudoku[1,i][2,j]的每个子单元格没有重复数,以确保在第1sudoku[i,1][j,2]的每个子单元格,以确保在第1h 218f 219的子行2中没有重复编号。你应该找到一个更好的优化检查网格,而不是蛮力迫使它的子单元格,但我留给你。
希望有所帮助;)
https://stackoverflow.com/questions/70238042
复制相似问题