首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Unity3D中编程数独游戏逻辑

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

Stack Overflow用户
提问于 2021-12-05 19:58:03
回答 2查看 299关注 0票数 0

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

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

(注:我已经尽我所能对此进行了尽可能多的研究,但我在网上发现的任何东西都不是关于游戏的Unity3D版本的,只有2D版本)

,谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-12-05 20:55:35

像这样吗?董事会是一个9x9网格。跳过多维语法,因为它只会使事情复杂化(在我看来)。

(伪码-我还没试过编译这个。)

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-05 20:43:04

您可以将自己表示为一个网格(包含行和列)。每个网格单元本身是一个子网格(有子行和子列)。

要检查用户是否解决了Sudoku问题,您有三个条件

  • 在子网格本身中没有重复号
  • 对于同一行中的每个单元格没有重复号
  • 对于同一列

上的每个单元格没有重复号。

从那里我们可以开始工作。我建议使用两组二维数组。一个用于主网格,另一个用于每个子网格,因此basically...your网格声明可能类似于这个int[,][,] sudoku和sudoku1,2将访问行1、列2、子行3、子列4(如果这是有意义的话)。

因此,要检查游戏条件:

  • 测试sudoku[1,2][i,j]的每个子单元,以确保网格单元格1、2
  • 测试sudoku[1,i][2,j]的每个子单元格没有重复数,以确保在第1
  • 列的子列2中没有重复编号,以测试sudoku[i,1][j,2]的每个子单元格,以确保在第1h 218f 219的子行2中没有重复编号。

你应该找到一个更好的优化检查网格,而不是蛮力迫使它的子单元格,但我留给你。

希望有所帮助;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70238042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档