C# 数独板生成器
C# Sudoku Board Generator
首先,是的,我已经搜索过了,不,我没有找到与我的问题相关的答案。我正在尝试在 C# 中创建一个数独板。我相信我的单元格是正确的,我的 "Game board" class 是正确的,但是我无法生成实际的电路板。我确信我遗漏了一些明显的东西,但我想要做的是让我的代码输出一个实际的电路板。没有这部分,我无法测试我的细胞 class 以确保我真的可以玩。
具体来说,我试图获取我的代码并生成正在编码的内容的显示,以便我能够正确地对其余代码进行故障排除。澄清一下,我所拥有的是数据,但没有要显示的输出。在通过几个教程尝试创建一个网格、使用 Console.WriteLine() 并尝试使用辅助列表显示来推动显示之后,我想出了一个短板。显示问题已由 John 回答,他帮助我在注释字符串中指定了问题。我希望它在搜索中保持可用,因为我认为很多人 运行 关注这个问题,但搜索结果在我看来 none
]
我的主程序有一个要填写的单元格列表(我正在通过手动创建板进行测试)。源码如下:
namespace Sudoku
{
static class Program
{
static void Main(string[] args)
{
{
Board board = new Board();
board.SetCellValue(1, 3, 4);
board.SetCellValue(1, 5, 5);
board.SetCellValue(1, 9, 2);
board.SetCellValue(2, 1, 1);
board.SetCellValue(2, 4, 2);
board.SetCellValue(3, 1, 7);
board.SetCellValue(3, 3, 5);
board.SetCellValue(3, 4, 1);
board.SetCellValue(3, 6, 8);
board.SetCellValue(3, 7, 9);
board.SetCellValue(4, 1, 3);
board.SetCellValue(4, 2, 5);
board.SetCellValue(4, 3, 2);
board.SetCellValue(4, 6, 1);
board.SetCellValue(4, 7, 7);
board.SetCellValue(4, 8, 8);
board.SetCellValue(5, 2, 6);
board.SetCellValue(5, 5, 7);
board.SetCellValue(5, 8, 5);
board.SetCellValue(6, 2, 8);
board.SetCellValue(6, 3, 7);
board.SetCellValue(6, 4, 6);
board.SetCellValue(6, 7, 4);
board.SetCellValue(6, 8, 3);
board.SetCellValue(6, 9, 1);
board.SetCellValue(7, 3, 6);
board.SetCellValue(7, 4, 3);
board.SetCellValue(7, 6, 7);
board.SetCellValue(7, 7, 5);
board.SetCellValue(7, 9, 8);
board.SetCellValue(8, 6, 2);
board.SetCellValue(8, 9, 4);
board.SetCellValue(9, 1, 8);
board.SetCellValue(9, 5, 1);
board.SetCellValue(9, 7, 3);
}
}
}
}
据此,我需要添加什么才能使代码生成实际的电路板?我认为问题是生成了数据,但是没有特定的输出来推送任何内容以将代码显示为板。
我有一个 Board
class 和一个 Cell
class 如果有帮助,我也可以提供。我在这里伸出援手,因为我已经通过教程、其他网站和朋友返回,但我们似乎无法解决这个问题。
编辑:
这是我的看板class,目的是处理看板的基本逻辑,留白看板:
namespace Sudoku
{
public class Board
{
public List<Cell> Cells { get; set; }
public Board()
{
Cells = new List<Cell>();
for (int row = 1; row < 10; row++)
{
for (int column = 1; column < 10; column++)
{
Cells.Add(new Cell(row, column));
}
}
}
public void SetCellValue(int row, int column, int value)
{
Cell activeCell = Cells.Single(x => (x.Row == row) && (x.Column == column));
activeCell.Value = value;
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.Row == row)))
{
cell.PotentialValues.Remove(value);
}
foreach (Cell square in Cells.Where(s => !s.IsSolved && (s.Column == column)))
{
square.PotentialValues.Remove(value);
}
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.Block == activeCell.Block)))
{
cell.PotentialValues.Remove(value);
}
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.PotentialValues.Count == 1)))
{
SetCellValue(cell.Row, cell.Column, cell.PotentialValues[0]);
}
}
}
}
这里是我的 Cell class,我对 cell class 的意图是管理每个 cell 的 IO:
namespace Sudoku
{
public class Cell
{
private readonly List<int> values = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
internal enum Blocks
{
UpperLeft,
UpperMiddle,
UpperRight,
MiddleLeft,
Middle,
MiddleRight,
LowerLeft,
LowerMiddle,
LowerRight
}
public int Row { get; private set; }
public int Column { get; private set; }
internal Blocks Block
{
get
{
if (Row < 4)
{
if (Column < 4)
{
return Blocks.UpperLeft;
}
return Column < 7 ? Blocks.UpperMiddle : Blocks.UpperRight;
}
if (Row < 7)
{
if (Column < 4)
{
return Blocks.MiddleLeft;
}
return Column < 7 ? Blocks.Middle : Blocks.MiddleRight;
}
if (Column < 4)
{
return Blocks.LowerLeft;
}
return Column < 7 ? Blocks.LowerMiddle : Blocks.LowerRight;
}
}
public bool IsSolved { get { return Value != null; } }
public int? Value { get; set; }
internal List<int> PotentialValues { get; private set; }
internal Cell(int row, int column)
{
Row = row;
Column = column;
PotentialValues = values;
}
}
}
类似这样的内容将提供您的开发板的基本控制台输出。
foreach (var cell in board.Cells)
{
int x = cell.Column;
int y = cell.Row;
Console.SetCursorPosition(x * 2, y * 2);
Console.Write(cell.Value.HasValue ? cell.Value.Value.ToString() : " ");
}
Console.ReadKey();
为了分隔数字,我将 X 和 Y 乘以 2,但这不是必需的。
首先,是的,我已经搜索过了,不,我没有找到与我的问题相关的答案。我正在尝试在 C# 中创建一个数独板。我相信我的单元格是正确的,我的 "Game board" class 是正确的,但是我无法生成实际的电路板。我确信我遗漏了一些明显的东西,但我想要做的是让我的代码输出一个实际的电路板。没有这部分,我无法测试我的细胞 class 以确保我真的可以玩。
具体来说,我试图获取我的代码并生成正在编码的内容的显示,以便我能够正确地对其余代码进行故障排除。澄清一下,我所拥有的是数据,但没有要显示的输出。在通过几个教程尝试创建一个网格、使用 Console.WriteLine() 并尝试使用辅助列表显示来推动显示之后,我想出了一个短板。显示问题已由 John 回答,他帮助我在注释字符串中指定了问题。我希望它在搜索中保持可用,因为我认为很多人 运行 关注这个问题,但搜索结果在我看来 none
]我的主程序有一个要填写的单元格列表(我正在通过手动创建板进行测试)。源码如下:
namespace Sudoku
{
static class Program
{
static void Main(string[] args)
{
{
Board board = new Board();
board.SetCellValue(1, 3, 4);
board.SetCellValue(1, 5, 5);
board.SetCellValue(1, 9, 2);
board.SetCellValue(2, 1, 1);
board.SetCellValue(2, 4, 2);
board.SetCellValue(3, 1, 7);
board.SetCellValue(3, 3, 5);
board.SetCellValue(3, 4, 1);
board.SetCellValue(3, 6, 8);
board.SetCellValue(3, 7, 9);
board.SetCellValue(4, 1, 3);
board.SetCellValue(4, 2, 5);
board.SetCellValue(4, 3, 2);
board.SetCellValue(4, 6, 1);
board.SetCellValue(4, 7, 7);
board.SetCellValue(4, 8, 8);
board.SetCellValue(5, 2, 6);
board.SetCellValue(5, 5, 7);
board.SetCellValue(5, 8, 5);
board.SetCellValue(6, 2, 8);
board.SetCellValue(6, 3, 7);
board.SetCellValue(6, 4, 6);
board.SetCellValue(6, 7, 4);
board.SetCellValue(6, 8, 3);
board.SetCellValue(6, 9, 1);
board.SetCellValue(7, 3, 6);
board.SetCellValue(7, 4, 3);
board.SetCellValue(7, 6, 7);
board.SetCellValue(7, 7, 5);
board.SetCellValue(7, 9, 8);
board.SetCellValue(8, 6, 2);
board.SetCellValue(8, 9, 4);
board.SetCellValue(9, 1, 8);
board.SetCellValue(9, 5, 1);
board.SetCellValue(9, 7, 3);
}
}
}
}
据此,我需要添加什么才能使代码生成实际的电路板?我认为问题是生成了数据,但是没有特定的输出来推送任何内容以将代码显示为板。
我有一个 Board
class 和一个 Cell
class 如果有帮助,我也可以提供。我在这里伸出援手,因为我已经通过教程、其他网站和朋友返回,但我们似乎无法解决这个问题。
编辑:
这是我的看板class,目的是处理看板的基本逻辑,留白看板:
namespace Sudoku
{
public class Board
{
public List<Cell> Cells { get; set; }
public Board()
{
Cells = new List<Cell>();
for (int row = 1; row < 10; row++)
{
for (int column = 1; column < 10; column++)
{
Cells.Add(new Cell(row, column));
}
}
}
public void SetCellValue(int row, int column, int value)
{
Cell activeCell = Cells.Single(x => (x.Row == row) && (x.Column == column));
activeCell.Value = value;
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.Row == row)))
{
cell.PotentialValues.Remove(value);
}
foreach (Cell square in Cells.Where(s => !s.IsSolved && (s.Column == column)))
{
square.PotentialValues.Remove(value);
}
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.Block == activeCell.Block)))
{
cell.PotentialValues.Remove(value);
}
foreach (Cell cell in Cells.Where(s => !s.IsSolved && (s.PotentialValues.Count == 1)))
{
SetCellValue(cell.Row, cell.Column, cell.PotentialValues[0]);
}
}
}
}
这里是我的 Cell class,我对 cell class 的意图是管理每个 cell 的 IO:
namespace Sudoku
{
public class Cell
{
private readonly List<int> values = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
internal enum Blocks
{
UpperLeft,
UpperMiddle,
UpperRight,
MiddleLeft,
Middle,
MiddleRight,
LowerLeft,
LowerMiddle,
LowerRight
}
public int Row { get; private set; }
public int Column { get; private set; }
internal Blocks Block
{
get
{
if (Row < 4)
{
if (Column < 4)
{
return Blocks.UpperLeft;
}
return Column < 7 ? Blocks.UpperMiddle : Blocks.UpperRight;
}
if (Row < 7)
{
if (Column < 4)
{
return Blocks.MiddleLeft;
}
return Column < 7 ? Blocks.Middle : Blocks.MiddleRight;
}
if (Column < 4)
{
return Blocks.LowerLeft;
}
return Column < 7 ? Blocks.LowerMiddle : Blocks.LowerRight;
}
}
public bool IsSolved { get { return Value != null; } }
public int? Value { get; set; }
internal List<int> PotentialValues { get; private set; }
internal Cell(int row, int column)
{
Row = row;
Column = column;
PotentialValues = values;
}
}
}
类似这样的内容将提供您的开发板的基本控制台输出。
foreach (var cell in board.Cells)
{
int x = cell.Column;
int y = cell.Row;
Console.SetCursorPosition(x * 2, y * 2);
Console.Write(cell.Value.HasValue ? cell.Value.Value.ToString() : " ");
}
Console.ReadKey();
为了分隔数字,我将 X 和 Y 乘以 2,但这不是必需的。