繁体   English   中英

如何在 Unity3D 中编写数独游戏逻辑

[英]How to program the Sudoku game logic in Unity3D

我正在尝试在 Unity3D 中制作数独游戏,但我目前停留在游戏背后的逻辑上。 检查同一子网格、行和列中的所有数字是否不同

我已经能够获得一个生成整个网格运行的脚本,包括 2x2、2x3 和 3x3 级别。 我坚持的部分是制作二维数组来保存所有子网格的选定值。 如果需要,我还可以提供完整的 GenerateGrid 脚本,但除此之外的任何帮助都会有所帮助。

注意:我已尽我所能对此进行研究,但我在网上找到的东西都不是关于游戏的 Unity3D 版本,只有 2D 版本

谢谢!

您可以将自己的数独表示为网格(带有行和列)。 每个网格单元本身就是一个子网格(带有子行和子列)

要检查用户是否解决了数独问题,您有 3 个条件

  • 子网格本身没有重复的数字
  • 同一行上的每个单元格在同一子行中没有重复的数字
  • 同一列上的每个单元格在同一子列中没有重复的数字

从那里我们可以开始工作。 我建议使用两组双向 arrays。 一个用于主网格,一个用于每个子网格所以基本上......您的网格声明可能看起来像这样int[,][,] sudoku和 sudoku[1,2][3,4] 将访问第 1 行,第 2 列,第 3 子行,第 4 子列,如果有意义的话

所以要检查游戏条件:

  • 测试sudoku[1,2][i,j]的每个子单元格以确保网格单元格 [1,2] 中没有重复的数字
  • 测试sudoku[1,i][2,j]的每个子单元格,以确保第 1 列的第 2 子列中没有重复的数字
  • 测试sudoku[i,1][j,2]的每个子单元格,以确保子列 1 的子行 2 中没有重复的数字

您应该找到一个更好的优化来检查网格,而不是逐个子单元地强制它,但我把它留给您。

希望有帮助;)

像这样的东西? 该板是一个 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;
}

bool subGridIsValid(int x, int y)
{
    var minX = (x / 3) * 3;
    var maxX = minX + 3;
    var minY = (y / 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM