Непонятная ошибка в игре Судоку - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Вот решил сделать игру Судоку. Все вроде сделал правильно, но в какой то момент игра просто зависает. Зависает на заполнении числами клеток. Каждый раз на новых цифрах.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            buttonS = new Button[9, 3, 3];
        }
 
        //рисование кнопок
        static void DrawButtons(Button[,,] buttons, Panel panel1)
        {
            int xS = 10, yS = 10, aS = 0;//начальные оси для кнопок, as это контейнеры по 9 ячеек
            for (int a = 0, s = 0; a < 9; a++)
            {
                for (int x = 0; x < 3; x++)
                {
                    for (int y = 0; y < 3; y++)
                    {
                        buttons[a, x, y] = new Button();
                        panel1.Controls.Add(buttons[a, x, y]);//добавление на плайн кнопок
                        buttons[a, x, y].Location = new Point(xS, yS);//кординаты кнопок
                        buttons[a, x, y].Text = " ";
                        buttons[a, x, y].Name = x.ToString() + y.ToString();//это имя ячеек по кординатам
                        buttons[a, x, y].Size = new Size(45, 45);
                        buttons[a, x, y].TabIndex = 0;
                        buttons[a, x, y].UseVisualStyleBackColor = true;
                        yS += 45;
                    }
                    xS += 45; yS = 10 + aS;// смещение и сброс кординат, as тут играет роль новых ячеек

                }
 
                s++;//счетчик
 
                if (s == 6)//если счетчик равен 6 ячейкам
                {
                    yS = 270 + 10;// ось y с 7 по 9 ячейки прибавляется 10 потому что начинается с 10
                    xS = 10;
                    aS = yS - 10;// тут отбавляется 10 потому что после прибавляется 10, потом доработаю глоавное что все работает.
                }
                else if (s == 3)// если счетчик равен 3 ячейкам
                {
                    yS = 135 + 10;
                    xS = 10;
                    aS = yS - 10;//математика мать ее
                }
 
            }
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            DrawButtons(buttonS, panel1);
        }
 
        //алгоритм заполнения
        static void Algoritm(Button[,,] buttonS)//---------------------------------------------------< Вот здесь
        {
            Random random = new Random();
            int tempX = 0, tempY = 0; bool b = true;
            for (int i = 1; i < 10; i++)
            {
                for (int a = 0; a < 9; a++)
                {
                    while (true)
                    {
                        tempX = random.Next(0, 3);
                        tempY = random.Next(0, 3);
                        b = Inspected(i, buttonS, a, tempX, tempY); // запомни что сначало читается Х а потом вниз У
                        if (b == false)
                        {
                            buttonS[a, tempX, tempY].Text = i.ToString();
                            break;
                        }
                        
                    }
                    b = true;
                }
            }

        }
 
        static bool Inspected(int i, Button[,,] buttonS, int a, int x, int y)
        {
            if (a>= 6)
            {
                //проверка по x
                for (int aI = 6; aI < 9; aI++)
                {
                    for (int xI = 0; xI < 3; xI++)
                    {
                        if (buttonS[aI, xI, y].Text == i.ToString())
                            return true;
                    }
                }

                //проверка по y
                for (int q = 0, aI = a - 6; q < 3; q++)
                {
 
                    for (int xI = 0; xI < 3; xI++)
                    {
                        if (buttonS[aI, x, xI].Text == i.ToString())
                        {
                            //MessageBox.Show(i.ToString());
                            return true;
                        }
                    }
                    aI += 3;
                }

                //проверка по a
                for (int xI = 0; xI < 3; xI++)
                {
                    for (int yI = 0; yI < 3; yI++)
                    {
                        if (buttonS[a, xI, yI].Text == i.ToString())
                            return true;
                    }
                }
 
            }
            else
 
            if (a >= 3)
            {
                //проверка по x
                for (int aI = 3; aI < 6; aI++)
                {
                    for (int xI = 0; xI < 3; xI++)
                    {
                        if (buttonS[aI, xI, y].Text == i.ToString())
                            return true;
                    }
                }

                //проверка по y
                for (int q = 0, aI = a - 3; q < 3; q++) 
                {
 
                    for (int yI = 0; yI < 3; yI++)
                    {
                        if (buttonS[aI, x, yI].Text == i.ToString())
                        {
                            //MessageBox.Show(i.ToString());
                            return true;
                        }
                    }
                    aI += 3;
                }

                //проверка по a
                for (int xI = 0; xI < 3; xI++)
                {
                    for (int yI = 0; yI < 3; yI++)
                    {
                        if (buttonS[a, xI, yI].Text == i.ToString())
                            return true;
                    }
                }
 
            }

            else
            {
 
                //проверка по x
                for (int aI = 0; aI < 3; aI++)
                {
                    for (int xI = 0; xI < 3; xI++)
                    {
                        if (buttonS[aI, xI, y].Text == i.ToString())
                        {
                            //MessageBox.Show(i.ToString() + "y" + x.ToString() + y.ToString() );
                            return true;
                        }
                    }
                }

                //проверка по x
                /*for(int q = 0, aI = a; aI < 3; q++)
                {
                
                    for(int xI = 0; xI < 3; xI++)
                    {
                        if (buttonS[aI, xI, y].Text == i.ToString())
                            {
                                MessageBox.Show(i.ToString() + "x" + x.ToString() + y.ToString());
                                return true;
                            }
                    }
                    aI += 3;
                }
                */

                //проверка по a
                for (int xI = 0; xI < 3; xI++)
                {
                    for (int yI = 0; yI < 3; yI++)
                    {
                        if (buttonS[a, xI, yI].Text == i.ToString())
                        {
                            //MessageBox.Show(i.ToString() + "a" + x.ToString() + y.ToString());
                            return true;
                        }
                    }
                }
            }
            if (buttonS[a, x, y].Text == " ")
            {
                MessageBox.Show(i.ToString() + "~" + x.ToString() + y.ToString());
                return false;
            }
            else return true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Algoritm(buttonS);
        }
    }
}
Понять не могу в чем проблема.

Решение задачи: «Непонятная ошибка в игре Судоку»

textual
Листинг программы
while (true)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы