Непонятная ошибка в игре Судоку - 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)