C#Sudoku Board Generator

时间:2017-12-10 14:29:00

标签: c# sudoku

首先,是的,我已经搜索过,而且没有找到我的问题的相关答案。我正在尝试用C#创建一个数独板。我相信我的细胞是正确的,我的“游戏板”类是正确的,但我不能得到一个真正的板。我确信我遗漏了一些明显的东西,但我要做的是让我的代码输出一个真正的板子。没有这部分,我无法测试我的细胞类,以确保我可以真正玩。

特别是我试图获取我的代码并生成正在编码的内容的显示,以便我能够正确地解决其余代码问题。为了澄清,我所拥有的是数据,但没有要显示的输出。在通过尝试使用Console.WriteLine()尝试创建网格以及尝试使用辅助列表进行显示的几个教程来推送显示之后,我做了简短的介绍。 John已经回答了显示问题,John帮助我在评论字符串中指定了问题。我希望在搜索中保留这一点,因为我认为很多人都遇到了这个问题,但我认为搜索结果很少见

我的主程序包含的是要填写的单元格列表(我正在通过手动创建板进行测试)。源代码如下:

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课程和一个Cell课程,如果有帮助我也可以提供。我正在这里接触,因为我已经回顾了教程,其他网站和朋友,但我们似乎无法解决这个问题。

编辑:

这是我的Board类,其目的是处理电路板的基本逻辑,将电路板留空:

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类,我的细胞类意图是管理每个单元格的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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这样的东西将提供你的主板的基本控制台输出。

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以分隔数字,但这不是必需的。